"use strict";(globalThis.blocksyJsonP=globalThis.blocksyJsonP||[]).push([[188],{1188:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": () => (/* binding */ GradientPicker)\n});\n\n// EXTERNAL MODULE: external \"window.wp.i18n\"\nvar external_window_wp_i18n_ = __webpack_require__(5652);\n// EXTERNAL MODULE: external \"window.wp.element\"\nvar external_window_wp_element_ = __webpack_require__(1381);\n// EXTERNAL MODULE: external \"window.wp.components\"\nvar external_window_wp_components_ = __webpack_require__(8441);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(4184);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n// EXTERNAL MODULE: ./node_modules/@wordpress/icons/build-module/icon/index.js\nvar icon = __webpack_require__(1984);\n// EXTERNAL MODULE: ./node_modules/@wordpress/icons/build-module/library/check.js\nvar check = __webpack_require__(8184);\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/circular-option-picker.js\nconst _excluded = [\"className\", \"isSelected\", \"selectedIconProps\", \"tooltipText\"],\n _excluded2 = [\"className\", \"children\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n/**\n * External dependencies\n */\n\n\n/**\n * WordPress dependencies\n */\n\n\n/**\n * Internal dependencies\n */\n\n\n\nfunction Option(_ref) {\n let {\n className,\n isSelected,\n selectedIconProps,\n tooltipText\n } = _ref,\n additionalProps = _objectWithoutProperties(_ref, _excluded);\n\n const optionButton = (0,external_window_wp_element_.createElement)(external_window_wp_components_.Button, _extends({\n isPressed: isSelected,\n className: \"components-circular-option-picker__option\"\n }, additionalProps));\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: classnames_default()(className, 'components-circular-option-picker__option-wrapper')\n }, tooltipText ? (0,external_window_wp_element_.createElement)(external_window_wp_components_.Tooltip, {\n text: tooltipText\n }, optionButton) : optionButton, isSelected && (0,external_window_wp_element_.createElement)(icon/* default */.Z, _extends({\n icon: check/* default */.Z\n }, selectedIconProps ? selectedIconProps : {})));\n}\n\nfunction DropdownLinkAction(_ref2) {\n let {\n buttonProps,\n className,\n dropdownProps,\n linkText\n } = _ref2;\n return (0,external_window_wp_element_.createElement)(external_window_wp_components_.Dropdown, _extends({\n className: classnames_default()('components-circular-option-picker__dropdown-link-action', className),\n renderToggle: _ref3 => {\n let {\n isOpen,\n onToggle\n } = _ref3;\n return (0,external_window_wp_element_.createElement)(external_window_wp_components_.Button, _extends({\n \"aria-expanded\": isOpen,\n \"aria-haspopup\": \"true\",\n onClick: onToggle,\n variant: \"link\"\n }, buttonProps), linkText);\n }\n }, dropdownProps));\n}\n\nfunction ButtonAction(_ref4) {\n let {\n className,\n children\n } = _ref4,\n additionalProps = _objectWithoutProperties(_ref4, _excluded2);\n\n return (0,external_window_wp_element_.createElement)(external_window_wp_components_.Button, _extends({\n className: classnames_default()('components-circular-option-picker__clear', className),\n isSmall: true,\n variant: \"secondary\"\n }, additionalProps), children);\n}\n\nfunction CircularOptionPicker(_ref5) {\n let {\n actions,\n className,\n options,\n children\n } = _ref5;\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: classnames_default()('components-circular-option-picker', className)\n }, (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"components-circular-option-picker__swatches\"\n }, options), children, actions && (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"components-circular-option-picker__custom-clear-wrapper\"\n }, actions));\n}\nCircularOptionPicker.Option = Option;\nCircularOptionPicker.ButtonAction = ButtonAction;\nCircularOptionPicker.DropdownLinkAction = DropdownLinkAction;\n// EXTERNAL MODULE: ./node_modules/lodash/omit.js\nvar omit = __webpack_require__(7557);\nvar omit_default = /*#__PURE__*/__webpack_require__.n(omit);\n// EXTERNAL MODULE: ./node_modules/lodash/get.js\nvar get = __webpack_require__(7361);\nvar get_default = /*#__PURE__*/__webpack_require__.n(get);\n// EXTERNAL MODULE: external \"window.wp.compose\"\nvar external_window_wp_compose_ = __webpack_require__(3356);\n// EXTERNAL MODULE: ./node_modules/lodash/merge.js\nvar merge = __webpack_require__(3857);\nvar merge_default = /*#__PURE__*/__webpack_require__.n(merge);\n// EXTERNAL MODULE: ./node_modules/colord/index.mjs\nvar colord = __webpack_require__(6765);\n// EXTERNAL MODULE: ./node_modules/colord/plugins/names.mjs\nvar names = __webpack_require__(3933);\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/colors.js\n/**\n * External dependencies\n */\n\n\n(0,colord/* extend */.l7)([names/* default */.Z]);\n/**\n * Generating a CSS compliant rgba() color value.\n *\n * @param {string} hexValue The hex value to convert to rgba().\n * @param {number} alpha The alpha value for opacity.\n * @return {string} The converted rgba() color value.\n *\n * @example\n * rgba( '#000000', 0.5 )\n * // rgba(0, 0, 0, 0.5)\n */\n\nfunction rgba() {\n let hexValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n let alpha = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return (0,colord/* colord */.Vi)(hexValue).alpha(alpha).toRgbString();\n}\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/colors-values.js\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\n * Internal dependencies\n */\n\nconst BASE = {\n black: '#000',\n white: '#fff'\n};\n/**\n * TODO: Continue to update values as \"G2\" design evolves.\n *\n * \"G2\" refers to the movement to advance the interface of the block editor.\n * https://github.com/WordPress/gutenberg/issues/18667\n */\n\nconst G2 = {\n blue: {\n medium: {\n focus: '#007cba',\n focusDark: '#fff'\n }\n },\n gray: {\n 900: '#1e1e1e',\n 700: '#757575',\n // Meets 4.6:1 text contrast against white.\n 600: '#949494',\n // Meets 3:1 UI or large text contrast against white.\n 400: '#ccc',\n 200: '#ddd',\n // Used for most borders.\n 100: '#f0f0f0'\n },\n darkGray: {\n primary: '#1e1e1e',\n heading: '#050505'\n },\n mediumGray: {\n text: '#757575'\n },\n lightGray: {\n ui: '#949494',\n secondary: '#ccc',\n tertiary: '#e7e8e9'\n }\n};\nconst DARK_GRAY = {\n 900: '#191e23',\n 800: '#23282d',\n 700: '#32373c',\n 600: '#40464d',\n 500: '#555d66',\n // Use this most of the time for dark items.\n 400: '#606a73',\n 300: '#6c7781',\n // Lightest gray that can be used for AA text contrast.\n 200: '#7e8993',\n 150: '#8d96a0',\n // Lightest gray that can be used for AA non-text contrast.\n 100: '#8f98a1',\n placeholder: rgba(G2.gray[900], 0.62)\n};\nconst DARK_OPACITY = {\n 900: rgba('#000510', 0.9),\n 800: rgba('#00000a', 0.85),\n 700: rgba('#06060b', 0.8),\n 600: rgba('#000913', 0.75),\n 500: rgba('#0a1829', 0.7),\n 400: rgba('#0a1829', 0.65),\n 300: rgba('#0e1c2e', 0.62),\n 200: rgba('#162435', 0.55),\n 100: rgba('#223443', 0.5),\n backgroundFill: rgba(DARK_GRAY[700], 0.7)\n};\nconst DARK_OPACITY_LIGHT = {\n 900: rgba('#304455', 0.45),\n 800: rgba('#425863', 0.4),\n 700: rgba('#667886', 0.35),\n 600: rgba('#7b86a2', 0.3),\n 500: rgba('#9197a2', 0.25),\n 400: rgba('#95959c', 0.2),\n 300: rgba('#829493', 0.15),\n 200: rgba('#8b8b96', 0.1),\n 100: rgba('#747474', 0.05)\n};\nconst LIGHT_GRAY = {\n 900: '#a2aab2',\n 800: '#b5bcc2',\n 700: '#ccd0d4',\n 600: '#d7dade',\n 500: '#e2e4e7',\n // Good for \"grayed\" items and borders.\n 400: '#e8eaeb',\n // Good for \"readonly\" input fields and special text selection.\n 300: '#edeff0',\n 200: '#f3f4f5',\n 100: '#f8f9f9',\n placeholder: rgba(BASE.white, 0.65)\n};\nconst LIGHT_OPACITY_LIGHT = {\n 900: rgba(BASE.white, 0.5),\n 800: rgba(BASE.white, 0.45),\n 700: rgba(BASE.white, 0.4),\n 600: rgba(BASE.white, 0.35),\n 500: rgba(BASE.white, 0.3),\n 400: rgba(BASE.white, 0.25),\n 300: rgba(BASE.white, 0.2),\n 200: rgba(BASE.white, 0.15),\n 100: rgba(BASE.white, 0.1),\n backgroundFill: rgba(LIGHT_GRAY[300], 0.8)\n}; // Additional colors.\n// Some are from https://make.wordpress.org/design/handbook/foundations/colors/.\n\nconst BLUE = {\n wordpress: {\n 700: '#00669b'\n },\n dark: {\n 900: '#0071a1'\n },\n medium: {\n 900: '#006589',\n 800: '#00739c',\n 700: '#007fac',\n 600: '#008dbe',\n 500: '#00a0d2',\n 400: '#33b3db',\n 300: '#66c6e4',\n 200: '#bfe7f3',\n 100: '#e5f5fa',\n highlight: '#b3e7fe',\n focus: '#007cba'\n }\n};\nconst ALERT = {\n yellow: '#f0b849',\n red: '#d94f4f',\n green: '#4ab866'\n};\nconst ADMIN = {\n theme: `var( --wp-admin-theme-color, ${BLUE.wordpress[700]})`,\n themeDark10: `var( --wp-admin-theme-color-darker-10, ${BLUE.medium.focus})`\n}; // Namespaced values for raw colors hex codes\n\nconst UI = {\n theme: ADMIN.theme,\n background: BASE.white,\n backgroundDisabled: LIGHT_GRAY[200],\n border: G2.gray[700],\n borderHover: G2.gray[700],\n borderFocus: ADMIN.themeDark10,\n borderDisabled: G2.gray[400],\n borderLight: G2.gray[200],\n label: DARK_GRAY[500],\n textDisabled: DARK_GRAY[150],\n textDark: BASE.white,\n textLight: BASE.black\n};\nconst COLORS = _objectSpread(_objectSpread({}, BASE), {}, {\n darkGray: merge_default()({}, DARK_GRAY, G2.darkGray),\n darkOpacity: DARK_OPACITY,\n darkOpacityLight: DARK_OPACITY_LIGHT,\n mediumGray: G2.mediumGray,\n gray: G2.gray,\n lightGray: merge_default()({}, LIGHT_GRAY, G2.lightGray),\n lightGrayLight: LIGHT_OPACITY_LIGHT,\n blue: merge_default()({}, BLUE, G2.blue),\n alert: ALERT,\n admin: ADMIN,\n ui: UI\n});\n/* harmony default export */ const colors_values = (COLORS);\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/config-values.js\nfunction config_values_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction config_values_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? config_values_ownKeys(Object(source), !0).forEach(function (key) { config_values_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : config_values_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction config_values_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\n * Internal dependencies\n */\n\n\nconst space = n => `${n * 4}px`;\n\nconst CONTROL_HEIGHT = '36px';\nconst CONTROL_PADDING_X = '12px';\nconst CONTROL_PROPS = {\n controlSurfaceColor: COLORS.white,\n controlTextActiveColor: COLORS.ui.theme,\n controlPaddingX: CONTROL_PADDING_X,\n controlPaddingXLarge: `calc(${CONTROL_PADDING_X} * 1.3334)`,\n controlPaddingXSmall: `calc(${CONTROL_PADDING_X} / 1.3334)`,\n controlBackgroundColor: COLORS.white,\n controlBorderRadius: '2px',\n controlBorderColor: COLORS.gray[700],\n controlBoxShadow: 'transparent',\n controlBorderColorHover: COLORS.gray[700],\n controlBoxShadowFocus: `0 0 0 0.5px ${COLORS.admin.theme}`,\n controlDestructiveBorderColor: COLORS.alert.red,\n controlHeight: CONTROL_HEIGHT,\n controlHeightXSmall: `calc( ${CONTROL_HEIGHT} * 0.6 )`,\n controlHeightSmall: `calc( ${CONTROL_HEIGHT} * 0.8 )`,\n controlHeightLarge: `calc( ${CONTROL_HEIGHT} * 1.2 )`,\n controlHeightXLarge: `calc( ${CONTROL_HEIGHT} * 1.4 )`\n};\nconst TOGGLE_GROUP_CONTROL_PROPS = {\n toggleGroupControlBackgroundColor: CONTROL_PROPS.controlBackgroundColor,\n toggleGroupControlBorderColor: COLORS.ui.border,\n toggleGroupControlBackdropBackgroundColor: CONTROL_PROPS.controlSurfaceColor,\n toggleGroupControlBackdropBorderColor: COLORS.ui.border,\n toggleGroupControlBackdropBoxShadow: 'transparent',\n toggleGroupControlButtonColorActive: CONTROL_PROPS.controlBackgroundColor\n};\n/* harmony default export */ const config_values = (config_values_objectSpread(config_values_objectSpread(config_values_objectSpread({}, CONTROL_PROPS), TOGGLE_GROUP_CONTROL_PROPS), {}, {\n colorDivider: 'rgba(0, 0, 0, 0.1)',\n colorScrollbarThumb: 'rgba(0, 0, 0, 0.2)',\n colorScrollbarThumbHover: 'rgba(0, 0, 0, 0.5)',\n colorScrollbarTrack: 'rgba(0, 0, 0, 0.04)',\n elevationIntensity: 1,\n radiusBlockUi: '2px',\n borderWidth: '1px',\n borderWidthFocus: '1.5px',\n borderWidthTab: '4px',\n spinnerSize: '18px',\n fontSize: '13px',\n fontSizeH1: 'calc(2.44 * 13px)',\n fontSizeH2: 'calc(1.95 * 13px)',\n fontSizeH3: 'calc(1.56 * 13px)',\n fontSizeH4: 'calc(1.25 * 13px)',\n fontSizeH5: '13px',\n fontSizeH6: 'calc(0.8 * 13px)',\n fontSizeInputMobile: '16px',\n fontSizeMobile: '15px',\n fontSizeSmall: 'calc(0.92 * 13px)',\n fontSizeXSmall: 'calc(0.75 * 13px)',\n fontLineHeightBase: '1.2',\n fontWeight: 'normal',\n fontWeightHeading: '600',\n gridBase: '4px',\n cardBorderRadius: '2px',\n cardPaddingXSmall: `${space(2)}`,\n cardPaddingSmall: `${space(4)}`,\n cardPaddingMedium: `${space(4)} ${space(6)}`,\n cardPaddingLarge: `${space(6)} ${space(8)}`,\n surfaceBackgroundColor: COLORS.white,\n surfaceBackgroundSubtleColor: '#F3F3F3',\n surfaceBackgroundTintColor: '#F5F5F5',\n surfaceBorderColor: 'rgba(0, 0, 0, 0.1)',\n surfaceBorderBoldColor: 'rgba(0, 0, 0, 0.15)',\n surfaceBorderSubtleColor: 'rgba(0, 0, 0, 0.05)',\n surfaceBackgroundTertiaryColor: COLORS.white,\n surfaceColor: COLORS.white,\n transitionDuration: '200ms',\n transitionDurationFast: '160ms',\n transitionDurationFaster: '120ms',\n transitionDurationFastest: '100ms',\n transitionTimingFunction: 'cubic-bezier(0.08, 0.52, 0.52, 1)',\n transitionTimingFunctionControl: 'cubic-bezier(0.12, 0.8, 0.32, 1)'\n}));\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/angle-picker-control/angle-circle.js\nconst angle_circle_excluded = [\"value\", \"onChange\"];\n\nfunction angle_circle_extends() { angle_circle_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return angle_circle_extends.apply(this, arguments); }\n\nfunction angle_circle_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction angle_circle_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? angle_circle_ownKeys(Object(source), !0).forEach(function (key) { angle_circle_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : angle_circle_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction angle_circle_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction angle_circle_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = angle_circle_objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction angle_circle_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n\n/**\n * WordPress dependencies\n */\n\n\n\n\n\n\n/**\n * Internal dependencies\n */\n\nconst CIRCLE_SIZE = 32;\nconst INNER_CIRCLE_SIZE = 3;\n\nconst angle_circle_space = n => `${n * 4}px`;\n\nfunction AngleCircle(_ref) {\n let {\n value,\n onChange\n } = _ref,\n props = angle_circle_objectWithoutProperties(_ref, angle_circle_excluded);\n\n const angleCircleRef = (0,external_window_wp_element_.useRef)();\n const angleCircleCenter = (0,external_window_wp_element_.useRef)();\n const previousCursorValue = (0,external_window_wp_element_.useRef)();\n\n const setAngleCircleCenter = () => {\n const rect = angleCircleRef.current.getBoundingClientRect();\n angleCircleCenter.current = {\n x: rect.x + rect.width / 2,\n y: rect.y + rect.height / 2\n };\n };\n\n const changeAngleToPosition = event => {\n const {\n x: centerX,\n y: centerY\n } = angleCircleCenter.current;\n const {\n ownerDocument\n } = angleCircleRef.current; // Prevent (drag) mouse events from selecting and accidentally\n // triggering actions from other elements.\n\n event.preventDefault(); // Ensure the input isn't focused as preventDefault would leave it\n\n ownerDocument.activeElement.blur();\n onChange(getAngle(centerX, centerY, event.clientX, event.clientY));\n };\n\n const {\n startDrag,\n isDragging\n } = (0,external_window_wp_compose_.__experimentalUseDragging)({\n onDragStart: event => {\n setAngleCircleCenter();\n changeAngleToPosition(event);\n },\n onDragMove: changeAngleToPosition,\n onDragEnd: changeAngleToPosition\n });\n (0,external_window_wp_element_.useEffect)(() => {\n if (isDragging) {\n if (previousCursorValue.current === undefined) {\n previousCursorValue.current = document.body.style.cursor;\n }\n\n document.body.style.cursor = 'grabbing';\n } else {\n document.body.style.cursor = previousCursorValue.current || null;\n previousCursorValue.current = undefined;\n }\n }, [isDragging]);\n return (\n /* eslint-disable jsx-a11y/no-static-element-interactions */\n (0,external_window_wp_element_.createElement)(\"div\", angle_circle_extends({\n ref: angleCircleRef,\n onMouseDown: startDrag,\n className: \"components-angle-picker-control__angle-circle\",\n style: angle_circle_objectSpread(angle_circle_objectSpread({}, isDragging ? {\n cursor: 'grabbing'\n } : {}), {}, {\n borderRadius: '50%',\n border: `${config_values.borderWidth} solid ${colors_values.ui.border}`,\n boxSizing: 'border-box',\n cursor: 'grab',\n height: `${CIRCLE_SIZE}px`,\n overflow: `hidden`,\n width: `${CIRCLE_SIZE}px`\n })\n }, props), (0,external_window_wp_element_.createElement)(\"div\", {\n style: angle_circle_objectSpread(angle_circle_objectSpread({}, value ? {\n transform: `rotate(${value}deg)`\n } : {}), {}, {\n boxSizing: 'border-box',\n position: 'relative',\n width: '100%',\n height: '100%'\n }),\n className: \"components-angle-picker-control__angle-circle-indicator-wrapper\"\n }, (0,external_window_wp_element_.createElement)(\"div\", {\n style: {\n background: colors_values.admin.theme,\n borderRadius: '50%',\n border: `${INNER_CIRCLE_SIZE}px solid ${colors_values.admin.theme}`,\n bottom: 0,\n boxSizing: 'border-box',\n display: 'block',\n height: 0,\n left: 0,\n margin: 'auto',\n position: 'absolute',\n right: 0,\n top: `-${CIRCLE_SIZE / 2}px`,\n width: 0\n },\n className: \"components-angle-picker-control__angle-circle-indicator\"\n })))\n /* eslint-enable jsx-a11y/no-static-element-interactions */\n\n );\n}\n\nfunction getAngle(centerX, centerY, pointX, pointY) {\n const y = pointY - centerY;\n const x = pointX - centerX;\n const angleInRadians = Math.atan2(y, x);\n const angleInDeg = Math.round(angleInRadians * (180 / Math.PI)) + 90;\n\n if (angleInDeg < 0) {\n return 360 + angleInDeg;\n }\n\n return angleInDeg;\n}\n\n/* harmony default export */ const angle_circle = (AngleCircle);\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/angle-picker-control/index.js\n\n/**\n * External dependencies\n */\n\n\n/**\n * WordPress dependencies\n */\n\n\n/**\n * Internal dependencies\n */\n\n\nconst {\n Flex,\n FlexBlock,\n FlexItem,\n __experimentalText: Text,\n __experimentalSpacer: Spacer,\n __experimentalInputControl: NumberControl\n} = window.wp.components; // margin-bottom: 8px\n\nconst angle_picker_control_space = n => `${n * 4}px`;\n\nfunction AnglePickerControl(_ref) {\n let {\n className,\n label = (0,external_window_wp_i18n_.__)('Angle'),\n onChange,\n value\n } = _ref;\n\n const handleOnNumberChange = unprocessedValue => {\n const inputValue = unprocessedValue !== '' ? parseInt(unprocessedValue, 10) : 0;\n onChange(inputValue);\n };\n\n const classes = classnames_default()('components-angle-picker-control', className);\n const Root = Flex;\n return (0,external_window_wp_element_.createElement)(Root, {\n className: classes\n }, (0,external_window_wp_element_.createElement)(FlexBlock, null, (0,external_window_wp_element_.createElement)(NumberControl, {\n label: label,\n className: \"components-angle-picker-control__input-field\",\n max: 360,\n min: 0,\n onChange: handleOnNumberChange,\n size: \"__unstable-large\",\n step: \"1\",\n value: value,\n hideHTMLArrows: true,\n suffix: (0,external_window_wp_element_.createElement)(Spacer, {\n as: Text,\n marginBottom: 0,\n marginRight: angle_picker_control_space(3),\n style: {\n color: 'var( --wp-admin-theme-color )'\n }\n }, \"\\xB0\")\n })), (0,external_window_wp_element_.createElement)(FlexItem, {\n style: {\n marginLeft: angle_picker_control_space(4),\n marginBottom: angle_picker_control_space(1),\n marginTop: 'auto'\n }\n }, (0,external_window_wp_element_.createElement)(angle_circle, {\n \"aria-hidden\": \"true\",\n value: value,\n onChange: onChange\n })));\n}\n// EXTERNAL MODULE: ./node_modules/lodash/some.js\nvar some = __webpack_require__(9704);\nvar some_default = /*#__PURE__*/__webpack_require__.n(some);\n// EXTERNAL MODULE: ./node_modules/@wordpress/icons/build-module/library/plus.js\nvar plus = __webpack_require__(5117);\n// EXTERNAL MODULE: external \"window.wp.keycodes\"\nvar external_window_wp_keycodes_ = __webpack_require__(7228);\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/custom-gradient-bar/constants.js\nconst GRADIENT_MARKERS_WIDTH = 16;\nconst INSERT_POINT_WIDTH = 16;\nconst MINIMUM_ABSOLUTE_LEFT_POSITION = 5;\nconst MINIMUM_DISTANCE_BETWEEN_INSERTER_AND_POINT = 10;\nconst MINIMUM_DISTANCE_BETWEEN_POINTS = 0;\nconst MINIMUM_SIGNIFICANT_MOVE = 5;\nconst KEYBOARD_CONTROL_POINT_VARIATION = MINIMUM_DISTANCE_BETWEEN_INSERTER_AND_POINT;\nconst MINIMUM_DISTANCE_BETWEEN_INSERTER_AND_MARKER = (INSERT_POINT_WIDTH + GRADIENT_MARKERS_WIDTH) / 2;\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/custom-gradient-bar/utils.js\nfunction utils_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction utils_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? utils_ownKeys(Object(source), !0).forEach(function (key) { utils_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : utils_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction utils_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\n * Internal dependencies\n */\n\n/**\n * Control point for the gradient bar.\n *\n * @typedef {Object} ControlPoint\n * @property {string} color Color of the control point.\n * @property {number} position Integer position of the control point as a percentage.\n */\n\n/**\n * Color as parsed from the gradient by gradient-parser.\n *\n * @typedef {Object} Color\n * @property {string} r Red component.\n * @property {string} g Green component.\n * @property {string} b Green component.\n * @property {string} [a] Optional alpha component.\n */\n\n/**\n * Clamps a number between 0 and 100.\n *\n * @param {number} value Value to clamp.\n *\n * @return {number} Value clamped between 0 and 100.\n */\n\nfunction clampPercent(value) {\n return Math.max(0, Math.min(100, value));\n}\n/**\n * Check if a control point is overlapping with another.\n *\n * @param {ControlPoint[]} value Array of control points.\n * @param {number} initialIndex Index of the position to test.\n * @param {number} newPosition New position of the control point.\n * @param {number} minDistance Distance considered to be overlapping.\n *\n * @return {boolean} True if the point is overlapping.\n */\n\nfunction isOverlapping(value, initialIndex, newPosition) {\n let minDistance = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : MINIMUM_DISTANCE_BETWEEN_POINTS;\n const initialPosition = value[initialIndex].position;\n const minPosition = Math.min(initialPosition, newPosition);\n const maxPosition = Math.max(initialPosition, newPosition);\n return value.some((_ref, index) => {\n let {\n position\n } = _ref;\n return index !== initialIndex && (Math.abs(position - newPosition) < minDistance || minPosition < position && position < maxPosition);\n });\n}\n/**\n * Adds a control point from an array and returns the new array.\n *\n * @param {ControlPoint[]} points Array of control points.\n * @param {number} position Position to insert the new point.\n * @param {Color} color Color to update the control point at index.\n *\n * @return {ControlPoint[]} New array of control points.\n */\n\nfunction addControlPoint(points, position, color) {\n const nextIndex = points.findIndex(point => point.position > position);\n const newPoint = {\n color,\n position\n };\n const newPoints = points.slice();\n newPoints.splice(nextIndex - 1, 0, newPoint);\n return newPoints;\n}\n/**\n * Removes a control point from an array and returns the new array.\n *\n * @param {ControlPoint[]} points Array of control points.\n * @param {number} index Index to remove.\n *\n * @return {ControlPoint[]} New array of control points.\n */\n\nfunction removeControlPoint(points, index) {\n return points.filter((point, pointIndex) => {\n return pointIndex !== index;\n });\n}\n/**\n * Updates a control point from an array and returns the new array.\n *\n * @param {ControlPoint[]} points Array of control points.\n * @param {number} index Index to update.\n * @param {ControlPoint[]} newPoint New control point to replace the index.\n *\n * @return {ControlPoint[]} New array of control points.\n */\n\nfunction updateControlPoint(points, index, newPoint) {\n const newValue = points.slice();\n newValue[index] = newPoint;\n return newValue;\n}\n/**\n * Updates the position of a control point from an array and returns the new array.\n *\n * @param {ControlPoint[]} points Array of control points.\n * @param {number} index Index to update.\n * @param {number} newPosition Position to move the control point at index.\n *\n * @return {ControlPoint[]} New array of control points.\n */\n\nfunction updateControlPointPosition(points, index, newPosition) {\n if (isOverlapping(points, index, newPosition)) {\n return points;\n }\n\n const newPoint = utils_objectSpread(utils_objectSpread({}, points[index]), {}, {\n position: newPosition\n });\n\n return updateControlPoint(points, index, newPoint);\n}\n/**\n * Updates the position of a control point from an array and returns the new array.\n *\n * @param {ControlPoint[]} points Array of control points.\n * @param {number} index Index to update.\n * @param {Color} newColor Color to update the control point at index.\n *\n * @return {ControlPoint[]} New array of control points.\n */\n\nfunction updateControlPointColor(points, index, newColor) {\n const newPoint = utils_objectSpread(utils_objectSpread({}, points[index]), {}, {\n color: newColor\n });\n\n return updateControlPoint(points, index, newPoint);\n}\n/**\n * Updates the position of a control point from an array and returns the new array.\n *\n * @param {ControlPoint[]} points Array of control points.\n * @param {number} position Position of the color stop.\n * @param {string} newColor Color to update the control point at index.\n *\n * @return {ControlPoint[]} New array of control points.\n */\n\nfunction updateControlPointColorByPosition(points, position, newColor) {\n const index = points.findIndex(point => point.position === position);\n return updateControlPointColor(points, index, newColor);\n}\n/**\n * Gets the horizontal coordinate when dragging a control point with the mouse.\n *\n * @param {number} mouseXCoordinate Horizontal coordinate of the mouse position.\n * @param {Element} containerElement Container for the gradient picker.\n * @param {number} positionedElementWidth Width of the positioned element.\n *\n * @return {number} Whole number percentage from the left.\n */\n\nfunction getHorizontalRelativeGradientPosition(mouseXCoordinate, containerElement, positionedElementWidth) {\n if (!containerElement) {\n return;\n }\n\n const {\n x,\n width\n } = containerElement.getBoundingClientRect();\n const absolutePositionValue = mouseXCoordinate - x - MINIMUM_ABSOLUTE_LEFT_POSITION - positionedElementWidth / 2;\n const availableWidth = width - MINIMUM_ABSOLUTE_LEFT_POSITION - INSERT_POINT_WIDTH;\n return Math.round(clampPercent(absolutePositionValue * 100 / availableWidth));\n}\n// EXTERNAL MODULE: ./static/js/options/helpers/normalize-color.js\nvar normalize_color = __webpack_require__(9287);\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/custom-gradient-bar/control-points.js\nconst control_points_excluded = [\"isRenderedInSidebar\"],\n control_points_excluded2 = [\"isOpen\", \"position\", \"color\"],\n _excluded3 = [\"isRenderedInSidebar\", \"gradientPickerDomRef\"];\n\nfunction control_points_extends() { control_points_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return control_points_extends.apply(this, arguments); }\n\nfunction control_points_objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = control_points_objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction control_points_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/**\n * External dependencies\n */\n\n\n/**\n * WordPress dependencies\n */\n\n\n\n\n\n\n/**\n * Internal dependencies\n */\n\n\n\n\n\nfunction CustomColorPickerDropdown(_ref) {\n let {\n isRenderedInSidebar\n } = _ref,\n props = control_points_objectWithoutProperties(_ref, control_points_excluded);\n\n return (0,external_window_wp_element_.createElement)(external_window_wp_components_.Dropdown, control_points_extends({\n contentClassName: classnames_default()('components-color-palette__custom-color-dropdown-content', {\n 'is-rendered-in-sidebar': isRenderedInSidebar\n })\n }, props));\n}\n\nfunction ControlPointButton(_ref2) {\n let {\n isOpen,\n position,\n color\n } = _ref2,\n additionalProps = control_points_objectWithoutProperties(_ref2, control_points_excluded2);\n\n const instanceId = (0,external_window_wp_compose_.useInstanceId)(ControlPointButton);\n const descriptionId = `components-custom-gradient-picker__control-point-button-description-${instanceId}`;\n return (0,external_window_wp_element_.createElement)(React.Fragment, null, (0,external_window_wp_element_.createElement)(external_window_wp_components_.Button, control_points_extends({\n \"aria-label\": (0,external_window_wp_i18n_.sprintf)( // translators: %1$s: gradient position e.g: 70, %2$s: gradient color code e.g: rgb(52,121,151).\n (0,external_window_wp_i18n_.__)('Gradient control point at position %1$s%% with color code %2$s.'), position, color),\n \"aria-describedby\": descriptionId,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": isOpen,\n className: classnames_default()('components-custom-gradient-picker__control-point-button', {\n 'is-active': isOpen\n }),\n style: {\n left: `${position}%`\n }\n }, additionalProps)));\n}\n\nfunction GradientColorPickerDropdown(_ref3) {\n let {\n isRenderedInSidebar,\n gradientPickerDomRef\n } = _ref3,\n props = control_points_objectWithoutProperties(_ref3, _excluded3);\n\n const popoverProps = (0,external_window_wp_element_.useMemo)(() => {\n const result = {\n className: 'components-custom-gradient-picker__color-picker-popover',\n position: 'top'\n };\n\n if (isRenderedInSidebar) {\n result.anchorRef = gradientPickerDomRef.current;\n result.position = 'bottom left';\n }\n\n return result;\n }, [gradientPickerDomRef.current, isRenderedInSidebar]);\n return (0,external_window_wp_element_.createElement)(CustomColorPickerDropdown, control_points_extends({\n isRenderedInSidebar: isRenderedInSidebar,\n popoverProps: popoverProps\n }, props));\n}\n\nfunction ControlPoints(_ref4) {\n let {\n disableRemove,\n disableAlpha,\n gradientPickerDomRef,\n ignoreMarkerPosition,\n value: controlPoints,\n onChange,\n onStartControlPointChange,\n onStopControlPointChange,\n __experimentalIsRenderedInSidebar\n } = _ref4;\n const controlPointMoveState = (0,external_window_wp_element_.useRef)();\n\n const onMouseMove = event => {\n const relativePosition = getHorizontalRelativeGradientPosition(event.clientX, gradientPickerDomRef.current, GRADIENT_MARKERS_WIDTH);\n const {\n initialPosition,\n index,\n significantMoveHappened\n } = controlPointMoveState.current;\n\n if (!significantMoveHappened && Math.abs(initialPosition - relativePosition) >= MINIMUM_SIGNIFICANT_MOVE) {\n controlPointMoveState.current.significantMoveHappened = true;\n }\n\n onChange(updateControlPointPosition(controlPoints, index, relativePosition));\n };\n\n const cleanEventListeners = () => {\n if (window && window.removeEventListener && controlPointMoveState.current && controlPointMoveState.current.listenersActivated) {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', cleanEventListeners);\n onStopControlPointChange();\n controlPointMoveState.current.listenersActivated = false;\n }\n };\n\n (0,external_window_wp_element_.useEffect)(() => {\n return () => {\n cleanEventListeners();\n };\n }, []);\n return controlPoints.map((point, index) => {\n const initialPosition = point === null || point === void 0 ? void 0 : point.position;\n return ignoreMarkerPosition !== initialPosition && (0,external_window_wp_element_.createElement)(GradientColorPickerDropdown, {\n gradientPickerDomRef: gradientPickerDomRef,\n isRenderedInSidebar: __experimentalIsRenderedInSidebar,\n key: index,\n onClose: onStopControlPointChange,\n renderToggle: _ref5 => {\n let {\n isOpen,\n onToggle\n } = _ref5;\n return (0,external_window_wp_element_.createElement)(ControlPointButton, {\n key: index,\n onClick: () => {\n if (controlPointMoveState.current && controlPointMoveState.current.significantMoveHappened) {\n return;\n }\n\n if (isOpen) {\n onStopControlPointChange();\n } else {\n onStartControlPointChange();\n }\n\n onToggle();\n },\n onMouseDown: () => {\n if (window && window.addEventListener) {\n controlPointMoveState.current = {\n initialPosition,\n index,\n significantMoveHappened: false,\n listenersActivated: true\n };\n onStartControlPointChange();\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', cleanEventListeners);\n }\n },\n onKeyDown: event => {\n if (event.keyCode === external_window_wp_keycodes_.LEFT) {\n // Stop propagation of the key press event to avoid focus moving\n // to another editor area.\n event.stopPropagation();\n onChange(updateControlPointPosition(controlPoints, index, clampPercent(point.position - KEYBOARD_CONTROL_POINT_VARIATION)));\n } else if (event.keyCode === external_window_wp_keycodes_.RIGHT) {\n // Stop propagation of the key press event to avoid focus moving\n // to another editor area.\n event.stopPropagation();\n onChange(updateControlPointPosition(controlPoints, index, clampPercent(point.position + KEYBOARD_CONTROL_POINT_VARIATION)));\n }\n },\n isOpen: isOpen,\n position: point.position,\n color: point.color\n });\n },\n renderContent: _ref6 => {\n let {\n onClose\n } = _ref6;\n return (0,external_window_wp_element_.createElement)(React.Fragment, null, (0,external_window_wp_element_.createElement)(\"div\", {\n className: wp.components.GradientPicker ? 'ct-gutenberg-color-picker-new' : 'ct-gutenberg-color-picker'\n }, (0,external_window_wp_element_.createElement)(external_window_wp_components_.ColorPicker, control_points_extends({\n enableAlpha: !disableAlpha,\n color: point.color\n }, wp.components.GradientPicker ? {\n onChange: color => {\n onChange(updateControlPointColor(controlPoints, index, (0,normalize_color/* normalizeColor */.u)(color)));\n }\n } : {\n onChangeComplete: result => {\n onChange(updateControlPointColor(controlPoints, index, result.rgb.a === 1 ? result.hex : `rgba(${result.rgb.r}, ${result.rgb.g}, ${result.rgb.b}, ${result.rgb.a})`));\n }\n })), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-color-picker-value\"\n }, (0,external_window_wp_element_.createElement)(\"input\", {\n type: \"text\",\n value: (0,normalize_color/* normalizeColor */.u)(point.color),\n onChange: e => {\n onChange(updateControlPointColor(controlPoints, index, (0,normalize_color/* normalizeColor */.u)(e.target.value)));\n }\n }))), !disableRemove && controlPoints.length > 2 && (0,external_window_wp_element_.createElement)(external_window_wp_components_.Button, {\n className: \"components-custom-gradient-picker__remove-control-point\",\n onClick: () => {\n onChange(removeControlPoint(controlPoints, index));\n onClose();\n },\n variant: \"link\"\n }, (0,external_window_wp_i18n_.__)('Remove Control Point')));\n }\n });\n });\n}\n\nfunction InsertPoint(_ref7) {\n let {\n value: controlPoints,\n onChange,\n onOpenInserter,\n onCloseInserter,\n insertPosition,\n disableAlpha,\n __experimentalIsRenderedInSidebar,\n gradientPickerDomRef\n } = _ref7;\n const [alreadyInsertedPoint, setAlreadyInsertedPoint] = (0,external_window_wp_element_.useState)(false);\n const [insertedColor, setInsertedColor] = (0,external_window_wp_element_.useState)('#fff');\n return (0,external_window_wp_element_.createElement)(GradientColorPickerDropdown, {\n gradientPickerDomRef: gradientPickerDomRef,\n isRenderedInSidebar: __experimentalIsRenderedInSidebar,\n className: \"components-custom-gradient-picker__inserter\",\n onClose: () => {\n onCloseInserter();\n },\n renderToggle: _ref8 => {\n let {\n isOpen,\n onToggle\n } = _ref8;\n return (0,external_window_wp_element_.createElement)(external_window_wp_components_.Button, {\n \"aria-expanded\": isOpen,\n \"aria-haspopup\": \"true\",\n onClick: () => {\n if (isOpen) {\n onCloseInserter();\n } else {\n setAlreadyInsertedPoint(false);\n onOpenInserter();\n }\n\n onToggle();\n },\n className: \"components-custom-gradient-picker__insert-point\",\n icon: plus/* default */.Z,\n style: {\n left: insertPosition !== null ? `${insertPosition}%` : undefined\n }\n });\n },\n renderContent: () => (0,external_window_wp_element_.createElement)(\"div\", {\n className: wp.components.GradientPicker ? 'ct-gutenberg-color-picker-new' : 'ct-gutenberg-color-picker'\n }, (0,external_window_wp_element_.createElement)(external_window_wp_components_.ColorPicker, control_points_extends({\n enableAlpha: !disableAlpha,\n color: insertedColor\n }, wp.components.GradientPicker ? {\n onChange: color => {\n if (!alreadyInsertedPoint) {\n onChange(addControlPoint(controlPoints, insertPosition, (0,normalize_color/* normalizeColor */.u)(color)));\n setAlreadyInsertedPoint(true);\n } else {\n onChange(updateControlPointColorByPosition(controlPoints, insertPosition, (0,normalize_color/* normalizeColor */.u)(color)));\n }\n\n setInsertedColor(color);\n }\n } : {\n onChangeComplete: result => {\n if (!alreadyInsertedPoint) {\n onChange(addControlPoint(controlPoints, insertPosition, result.rgb.a === 1 ? result.hex : `rgba(${result.rgb.r}, ${result.rgb.g}, ${result.rgb.b}, ${result.rgb.a})`));\n setAlreadyInsertedPoint(true);\n } else {\n onChange(updateControlPointColorByPosition(controlPoints, insertPosition, result.rgb.a === 1 ? result.hex : `rgba(${result.rgb.r}, ${result.rgb.g}, ${result.rgb.b}, ${result.rgb.a})`));\n }\n\n setInsertedColor(result.rgb.a === 1 ? result.hex : `rgba(${result.rgb.r}, ${result.rgb.g}, ${result.rgb.b}, ${result.rgb.a})`);\n }\n })), (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"ct-color-picker-value\"\n }, (0,external_window_wp_element_.createElement)(\"input\", {\n value: (0,normalize_color/* normalizeColor */.u)(insertedColor),\n type: \"text\",\n onChange: _ref9 => {\n let {\n target: {\n value: color\n }\n } = _ref9;\n\n if (!alreadyInsertedPoint) {\n onChange(addControlPoint(controlPoints, insertPosition, (0,normalize_color/* normalizeColor */.u)(color)));\n setAlreadyInsertedPoint(true);\n } else {\n onChange(updateControlPointColorByPosition(controlPoints, insertPosition, (0,normalize_color/* normalizeColor */.u)(color)));\n }\n\n setInsertedColor(color);\n }\n })))\n });\n}\n\nControlPoints.InsertPoint = InsertPoint;\n/* harmony default export */ const control_points = (ControlPoints);\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/custom-gradient-bar/index.js\n\n\n/**\n * External dependencies\n */\n\n\n/**\n * WordPress dependencies\n */\n\n\n/**\n * Internal dependencies\n */\n\n\n\n\n\nfunction customGradientBarReducer(state, action) {\n switch (action.type) {\n case 'MOVE_INSERTER':\n if (state.id === 'IDLE' || state.id === 'MOVING_INSERTER') {\n return {\n id: 'MOVING_INSERTER',\n insertPosition: action.insertPosition\n };\n }\n\n break;\n\n case 'STOP_INSERTER_MOVE':\n if (state.id === 'MOVING_INSERTER') {\n return {\n id: 'IDLE'\n };\n }\n\n break;\n\n case 'OPEN_INSERTER':\n if (state.id === 'MOVING_INSERTER') {\n return {\n id: 'INSERTING_CONTROL_POINT',\n insertPosition: state.insertPosition\n };\n }\n\n break;\n\n case 'CLOSE_INSERTER':\n if (state.id === 'INSERTING_CONTROL_POINT') {\n return {\n id: 'IDLE'\n };\n }\n\n break;\n\n case 'START_CONTROL_CHANGE':\n if (state.id === 'IDLE') {\n return {\n id: 'MOVING_CONTROL_POINT'\n };\n }\n\n break;\n\n case 'STOP_CONTROL_CHANGE':\n if (state.id === 'MOVING_CONTROL_POINT') {\n return {\n id: 'IDLE'\n };\n }\n\n break;\n }\n\n return state;\n}\n\nconst customGradientBarReducerInitialState = {\n id: 'IDLE'\n};\nfunction CustomGradientBar(_ref) {\n let {\n background,\n hasGradient,\n value: controlPoints,\n onChange,\n disableInserter = false,\n disableAlpha = false,\n __experimentalIsRenderedInSidebar\n } = _ref;\n const gradientPickerDomRef = (0,external_window_wp_element_.useRef)();\n const [gradientBarState, gradientBarStateDispatch] = (0,external_window_wp_element_.useReducer)(customGradientBarReducer, customGradientBarReducerInitialState);\n\n const onMouseEnterAndMove = event => {\n const insertPosition = getHorizontalRelativeGradientPosition(event.clientX, gradientPickerDomRef.current, INSERT_POINT_WIDTH); // If the insert point is close to an existing control point don't show it.\n\n if (some_default()(controlPoints, _ref2 => {\n let {\n position\n } = _ref2;\n return Math.abs(insertPosition - position) < MINIMUM_DISTANCE_BETWEEN_INSERTER_AND_POINT;\n })) {\n if (gradientBarState.id === 'MOVING_INSERTER') {\n gradientBarStateDispatch({\n type: 'STOP_INSERTER_MOVE'\n });\n }\n\n return;\n }\n\n gradientBarStateDispatch({\n type: 'MOVE_INSERTER',\n insertPosition\n });\n };\n\n const onMouseLeave = () => {\n gradientBarStateDispatch({\n type: 'STOP_INSERTER_MOVE'\n });\n };\n\n const isMovingInserter = gradientBarState.id === 'MOVING_INSERTER';\n const isInsertingControlPoint = gradientBarState.id === 'INSERTING_CONTROL_POINT';\n return (0,external_window_wp_element_.createElement)(\"div\", {\n ref: gradientPickerDomRef,\n className: classnames_default()('components-custom-gradient-picker__gradient-bar', {\n 'has-gradient': hasGradient\n }),\n onMouseEnter: onMouseEnterAndMove,\n onMouseMove: onMouseEnterAndMove,\n style: {\n background\n },\n onMouseLeave: onMouseLeave\n }, (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"components-custom-gradient-picker__markers-container\"\n }, !disableInserter && (isMovingInserter || isInsertingControlPoint) && (0,external_window_wp_element_.createElement)(control_points.InsertPoint, {\n __experimentalIsRenderedInSidebar: __experimentalIsRenderedInSidebar,\n gradientPickerDomRef: gradientPickerDomRef,\n disableAlpha: disableAlpha,\n insertPosition: gradientBarState.insertPosition,\n value: controlPoints,\n onChange: onChange,\n onOpenInserter: () => {\n gradientBarStateDispatch({\n type: 'OPEN_INSERTER'\n });\n },\n onCloseInserter: () => {\n gradientBarStateDispatch({\n type: 'CLOSE_INSERTER'\n });\n }\n }), (0,external_window_wp_element_.createElement)(control_points, {\n __experimentalIsRenderedInSidebar: __experimentalIsRenderedInSidebar,\n disableAlpha: disableAlpha,\n disableRemove: disableInserter,\n gradientPickerDomRef: gradientPickerDomRef,\n ignoreMarkerPosition: isInsertingControlPoint ? gradientBarState.insertPosition : undefined,\n value: controlPoints,\n onChange: onChange,\n onStartControlPointChange: () => {\n gradientBarStateDispatch({\n type: 'START_CONTROL_CHANGE'\n });\n },\n onStopControlPointChange: () => {\n gradientBarStateDispatch({\n type: 'STOP_CONTROL_CHANGE'\n });\n }\n })));\n}\n// EXTERNAL MODULE: ./node_modules/gradient-parser/build/node.js\nvar node = __webpack_require__(9948);\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/constants.js\n/**\n * WordPress dependencies\n */\n\nconst DEFAULT_GRADIENT = 'linear-gradient(135deg, rgba(6, 147, 227, 1) 0%, rgb(155, 81, 224) 100%)';\nconst DEFAULT_LINEAR_GRADIENT_ANGLE = 180;\nconst HORIZONTAL_GRADIENT_ORIENTATION = {\n type: 'angular',\n value: 90\n};\nconst GRADIENT_OPTIONS = [{\n value: 'linear-gradient',\n label: (0,external_window_wp_i18n_.__)('Linear', 'blocksy')\n}, {\n value: 'radial-gradient',\n label: (0,external_window_wp_i18n_.__)('Radial', 'blocksy')\n}];\nconst DIRECTIONAL_ORIENTATION_ANGLE_MAP = {\n top: 0,\n 'top right': 45,\n 'right top': 45,\n right: 90,\n 'right bottom': 135,\n 'bottom right': 135,\n bottom: 180,\n 'bottom left': 225,\n 'left bottom': 225,\n left: 270,\n 'top left': 315,\n 'left top': 315\n};\n// EXTERNAL MODULE: ./node_modules/lodash/compact.js\nvar compact = __webpack_require__(9693);\nvar compact_default = /*#__PURE__*/__webpack_require__.n(compact);\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/serializer.js\n\n\nfunction serializeGradientColor(_ref) {\n let {\n type,\n value\n } = _ref;\n\n if (type === 'literal') {\n return value;\n }\n\n if (type === 'hex') {\n return `#${value}`;\n }\n\n return `${type}(${value.join(',')})`;\n}\nfunction serializeGradientPosition(position) {\n if (!position) {\n return '';\n }\n\n const {\n value,\n type\n } = position;\n return `${value}${type}`;\n}\nfunction serializeGradientColorStop(_ref2) {\n let {\n type,\n value,\n length\n } = _ref2;\n return `${serializeGradientColor({\n type,\n value\n })} ${serializeGradientPosition(length)}`;\n}\nfunction serializeGradientOrientation(orientation) {\n if (!orientation || orientation.type !== 'angular') {\n return;\n }\n\n return `${orientation.value}deg`;\n}\nfunction serializeGradient(_ref3) {\n let {\n type,\n orientation,\n colorStops\n } = _ref3;\n const serializedOrientation = serializeGradientOrientation(orientation);\n const serializedColorStops = colorStops.sort((colorStop1, colorStop2) => {\n return get_default()(colorStop1, ['length', 'value'], 0) - get_default()(colorStop2, ['length', 'value'], 0);\n }).map(serializeGradientColorStop);\n return `${type}(${compact_default()([serializedOrientation, ...serializedColorStops]).join(',')})`;\n}\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/utils.js\nfunction gradient_utils_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction gradient_utils_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? gradient_utils_ownKeys(Object(source), !0).forEach(function (key) { gradient_utils_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : gradient_utils_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction gradient_utils_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\n * External dependencies\n */\n\n\n\n/**\n * Internal dependencies\n */\n\n\n\n(0,colord/* extend */.l7)([names/* default */.Z]);\nfunction getLinearGradientRepresentation(gradientAST) {\n return serializeGradient({\n type: 'linear-gradient',\n orientation: HORIZONTAL_GRADIENT_ORIENTATION,\n colorStops: gradientAST.colorStops\n });\n}\n\nfunction hasUnsupportedLength(item) {\n return item.length === undefined || item.length.type !== '%';\n}\n\nfunction getGradientAstWithDefault(value) {\n var _gradientAST$orientat;\n\n // gradientAST will contain the gradient AST as parsed by gradient-parser npm module.\n // More information of its structure available at https://www.npmjs.com/package/gradient-parser#ast.\n let gradientAST;\n let temporaryInvalidValue = value.match(/\\~(.*)\\~/, '');\n value = value.replace(/\\~.*\\~/, 'rgb(500, 500, 500)');\n\n try {\n gradientAST = node.parse(value)[0];\n gradientAST.value = value;\n } catch (error) {\n gradientAST = node.parse(DEFAULT_GRADIENT)[0];\n gradientAST.value = DEFAULT_GRADIENT;\n }\n\n if (((_gradientAST$orientat = gradientAST.orientation) === null || _gradientAST$orientat === void 0 ? void 0 : _gradientAST$orientat.type) === 'directional') {\n gradientAST.orientation.type = 'angular';\n gradientAST.orientation.value = DIRECTIONAL_ORIENTATION_ANGLE_MAP[gradientAST.orientation.value].toString();\n }\n\n if (gradientAST.colorStops.some(hasUnsupportedLength)) {\n const {\n colorStops\n } = gradientAST;\n const step = 100 / (colorStops.length - 1);\n colorStops.forEach((stop, index) => {\n if (stop.value[0] === '500') {\n stop.type = 'literal';\n stop.value = '';\n }\n\n stop.length = {\n value: step * index,\n type: '%'\n };\n });\n gradientAST.value = serializeGradient(gradientAST);\n }\n\n gradientAST.colorStops.forEach((stop, index) => {\n if (stop.value[0] === '500' && temporaryInvalidValue) {\n stop.type = 'literal';\n stop.value = temporaryInvalidValue[1];\n }\n });\n return gradientAST;\n}\nfunction getGradientAstWithControlPoints(gradientAST, newControlPoints) {\n return gradient_utils_objectSpread(gradient_utils_objectSpread({}, gradientAST), {}, {\n colorStops: newControlPoints.map(_ref => {\n let {\n position,\n color\n } = _ref;\n let parsedColor = (0,colord/* colord */.Vi)(color);\n let result = {\n length: {\n type: '%',\n value: position.toString()\n },\n type: 'literal',\n value: `~${color}~`\n };\n\n if (parsedColor.parsed) {\n const {\n r,\n g,\n b,\n a\n } = parsedColor.toRgb();\n result.type = a < 1 ? 'rgba' : 'rgb';\n result.value = a < 1 ? [r, g, b, a] : [r, g, b];\n }\n\n return result;\n })\n });\n}\nfunction getStopCssColor(colorStop) {\n switch (colorStop.type) {\n case 'hex':\n return `#${colorStop.value}`;\n\n case 'literal':\n return colorStop.value;\n\n case 'rgb':\n case 'rgba':\n return `${colorStop.type}(${colorStop.value.join(',')})`;\n\n default:\n // Should be unreachable if passing an AST from gradient-parser.\n // See https://github.com/rafaelcaricio/gradient-parser#ast.\n return 'transparent';\n }\n}\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/custom-gradient-picker.js\n\n\n\nfunction custom_gradient_picker_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction custom_gradient_picker_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? custom_gradient_picker_ownKeys(Object(source), !0).forEach(function (key) { custom_gradient_picker_defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : custom_gradient_picker_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction custom_gradient_picker_defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n/**\n * External dependencies\n */\n\n/**\n * WordPress dependencies\n */\n\n\n/**\n * Internal dependencies\n */\n\n\n\n\n\n\n\nconst GradientAnglePicker = _ref => {\n let {\n gradientAST,\n hasGradient,\n onChange\n } = _ref;\n\n const angle = get_default()(gradientAST, ['orientation', 'value'], DEFAULT_LINEAR_GRADIENT_ANGLE);\n\n const onAngleChange = newAngle => {\n onChange(serializeGradient(custom_gradient_picker_objectSpread(custom_gradient_picker_objectSpread({}, gradientAST), {}, {\n orientation: {\n type: 'angular',\n value: newAngle\n }\n })));\n };\n\n return (0,external_window_wp_element_.createElement)(AnglePickerControl, {\n onChange: onAngleChange,\n labelPosition: \"top\",\n value: hasGradient ? angle : ''\n });\n};\n\nconst GradientTypePicker = _ref2 => {\n let {\n gradientAST,\n hasGradient,\n onChange\n } = _ref2;\n const {\n type\n } = gradientAST;\n\n const onSetLinearGradient = () => {\n onChange(serializeGradient(custom_gradient_picker_objectSpread(custom_gradient_picker_objectSpread(custom_gradient_picker_objectSpread({}, gradientAST), gradientAST.orientation ? {} : {\n orientation: HORIZONTAL_GRADIENT_ORIENTATION\n }), {}, {\n type: 'linear-gradient'\n })));\n };\n\n const onSetRadialGradient = () => {\n onChange(serializeGradient(custom_gradient_picker_objectSpread(custom_gradient_picker_objectSpread({}, omit_default()(gradientAST, ['orientation'])), {}, {\n type: 'radial-gradient'\n })));\n };\n\n const handleOnChange = next => {\n if (next === 'linear-gradient') {\n onSetLinearGradient();\n }\n\n if (next === 'radial-gradient') {\n onSetRadialGradient();\n }\n };\n\n return (0,external_window_wp_element_.createElement)(external_window_wp_components_.SelectControl, {\n className: \"components-custom-gradient-picker__type-picker\",\n label: (0,external_window_wp_i18n_.__)('Type'),\n labelPosition: \"top\",\n onChange: handleOnChange,\n options: GRADIENT_OPTIONS,\n size: \"__unstable-large\",\n value: hasGradient && type\n });\n};\n\nfunction CustomGradientPicker(_ref3) {\n let {\n value,\n onChange,\n __experimentalIsRenderedInSidebar\n } = _ref3;\n const gradientAST = getGradientAstWithDefault(value); // On radial gradients the bar should display a linear gradient.\n // On radial gradients the bar represents a slice of the gradient from the center until the outside.\n // On liner gradients the bar represents the color stops from left to right independently of the angle.\n\n const background = getLinearGradientRepresentation(gradientAST);\n const hasGradient = gradientAST.value !== DEFAULT_GRADIENT; // Control points color option may be hex from presets, custom colors will be rgb.\n // The position should always be a percentage.\n\n const controlPoints = gradientAST.colorStops.map(colorStop => ({\n color: getStopCssColor(colorStop),\n position: parseInt(colorStop.length.value)\n })); // flex-grow: 5;\n\n const AccessoryWrapper = external_window_wp_components_.FlexBlock;\n const SelectWrapper = external_window_wp_components_.FlexBlock;\n return (0,external_window_wp_element_.createElement)(\"div\", {\n className: \"components-custom-gradient-picker\"\n }, (0,external_window_wp_element_.createElement)(CustomGradientBar, {\n __experimentalIsRenderedInSidebar: __experimentalIsRenderedInSidebar,\n background: background,\n hasGradient: hasGradient,\n value: controlPoints,\n onChange: newControlPoints => {\n onChange(serializeGradient(getGradientAstWithControlPoints(gradientAST, newControlPoints)));\n }\n }), (0,external_window_wp_element_.createElement)(external_window_wp_components_.Flex, {\n gap: 3,\n className: \"components-custom-gradient-picker__ui-line\"\n }, (0,external_window_wp_element_.createElement)(SelectWrapper, null, (0,external_window_wp_element_.createElement)(GradientTypePicker, {\n gradientAST: gradientAST,\n hasGradient: hasGradient,\n onChange: onChange\n })), (0,external_window_wp_element_.createElement)(AccessoryWrapper, null, gradientAST.type === 'linear-gradient' && (0,external_window_wp_element_.createElement)(GradientAnglePicker, {\n gradientAST: gradientAST,\n hasGradient: hasGradient,\n onChange: onChange\n }))));\n}\n;// CONCATENATED MODULE: ./static/js/options/options/background/gradient/index.js\nfunction gradient_extends() { gradient_extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return gradient_extends.apply(this, arguments); }\n\n/**\n * External dependencies\n */\n\n/**\n * WordPress dependencies\n */\n\n\n\n/**\n * Internal dependencies\n */\n\n\n\n\nfunction SingleOrigin(_ref) {\n let {\n className,\n clearGradient,\n gradients,\n onChange,\n value,\n actions,\n content\n } = _ref;\n const gradientOptions = (0,external_window_wp_element_.useMemo)(() => {\n return (gradients || []).map(_ref2 => {\n let {\n gradient,\n name\n } = _ref2;\n return (0,external_window_wp_element_.createElement)(CircularOptionPicker.Option, {\n key: gradient,\n value: gradient,\n isSelected: value === gradient,\n tooltipText: name || // translators: %s: gradient code e.g: \"linear-gradient(90deg, rgba(98,16,153,1) 0%, rgba(172,110,22,1) 100%);\".\n (0,external_window_wp_i18n_.sprintf)((0,external_window_wp_i18n_.__)('Gradient code: %s'), gradient),\n style: {\n color: 'rgba( 0,0,0,0 )',\n background: gradient\n },\n onClick: value === gradient ? clearGradient : () => onChange(gradient),\n \"aria-label\": name ? // translators: %s: The name of the gradient e.g: \"Angular red to blue\".\n (0,external_window_wp_i18n_.sprintf)((0,external_window_wp_i18n_.__)('Gradient: %s'), name) : // translators: %s: gradient code e.g: \"linear-gradient(90deg, rgba(98,16,153,1) 0%, rgba(172,110,22,1) 100%);\".\n (0,external_window_wp_i18n_.sprintf)((0,external_window_wp_i18n_.__)('Gradient code: %s'), gradient)\n });\n });\n }, [gradients, value, onChange, clearGradient]);\n return (0,external_window_wp_element_.createElement)(CircularOptionPicker, {\n className: className,\n options: gradientOptions,\n actions: actions\n }, content);\n}\n\nfunction MultipleOrigin(_ref3) {\n let {\n className,\n clearGradient,\n gradients,\n onChange,\n value,\n actions,\n content\n } = _ref3;\n return (0,external_window_wp_element_.createElement)(external_window_wp_components_.__experimentalVStack, {\n spacing: 3,\n className: className\n }, (gradients || []).map((_ref4, index) => {\n let {\n name,\n gradients: gradientSet\n } = _ref4;\n return (0,external_window_wp_element_.createElement)(external_window_wp_components_.__experimentalVStack, {\n spacing: 2,\n key: index\n }, (0,external_window_wp_element_.createElement)(external_window_wp_components_.__experimentalHeading, null, name), (0,external_window_wp_element_.createElement)(SingleOrigin, gradient_extends({\n clearGradient: clearGradient,\n gradients: gradientSet,\n onChange: onChange,\n value: value\n }, gradients.length === index + 1 ? {\n actions,\n content\n } : {})));\n }));\n}\n\nfunction GradientPicker(_ref5) {\n let {\n className,\n gradients,\n onChange,\n value,\n clearable = true,\n disableCustomGradients = false,\n __experimentalHasMultipleOrigins,\n __experimentalIsRenderedInSidebar\n } = _ref5;\n const clearGradient = (0,external_window_wp_element_.useCallback)(() => onChange(undefined), [onChange]);\n const Component = __experimentalHasMultipleOrigins && gradients !== null && gradients !== void 0 && gradients.length ? MultipleOrigin : SingleOrigin;\n return (0,external_window_wp_element_.createElement)(Component, {\n className: className,\n clearable: clearable,\n clearGradient: clearGradient,\n gradients: gradients,\n onChange: onChange,\n value: value,\n actions: clearable && ((gradients === null || gradients === void 0 ? void 0 : gradients.length) || !disableCustomGradients) && (0,external_window_wp_element_.createElement)(CircularOptionPicker.ButtonAction, {\n onClick: clearGradient\n }, (0,external_window_wp_i18n_.__)('Clear')),\n content: !disableCustomGradients && (0,external_window_wp_element_.createElement)(CustomGradientPicker, {\n __experimentalIsRenderedInSidebar: __experimentalIsRenderedInSidebar,\n value: value,\n onChange: onChange\n })\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE4OC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDekxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2JhY2tncm91bmQvZ3JhZGllbnQvY2lyY3VsYXItb3B0aW9uLXBpY2tlci5qcz82YTVkIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9iYWNrZ3JvdW5kL2dyYWRpZW50L2NvbG9ycy5qcz8zOTNmIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9iYWNrZ3JvdW5kL2dyYWRpZW50L2NvbG9ycy12YWx1ZXMuanM/ZmUxZCIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvYmFja2dyb3VuZC9ncmFkaWVudC9jb25maWctdmFsdWVzLmpzP2RiZjYiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2JhY2tncm91bmQvZ3JhZGllbnQvYW5nbGUtcGlja2VyLWNvbnRyb2wvYW5nbGUtY2lyY2xlLmpzPzE2NTAiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2JhY2tncm91bmQvZ3JhZGllbnQvYW5nbGUtcGlja2VyLWNvbnRyb2wvaW5kZXguanM/OGIwMyIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvYmFja2dyb3VuZC9ncmFkaWVudC9jdXN0b20tZ3JhZGllbnQtYmFyL2NvbnN0YW50cy5qcz8xZmI3Iiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9iYWNrZ3JvdW5kL2dyYWRpZW50L2N1c3RvbS1ncmFkaWVudC1iYXIvdXRpbHMuanM/ZWM4ZiIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvYmFja2dyb3VuZC9ncmFkaWVudC9jdXN0b20tZ3JhZGllbnQtYmFyL2NvbnRyb2wtcG9pbnRzLmpzPzA2NTEiLCJ3ZWJwYWNrOi8vYmxvY2tzeU9wdGlvbnMvLi9zdGF0aWMvanMvb3B0aW9ucy9vcHRpb25zL2JhY2tncm91bmQvZ3JhZGllbnQvY3VzdG9tLWdyYWRpZW50LWJhci9pbmRleC5qcz8xNGE5Iiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9iYWNrZ3JvdW5kL2dyYWRpZW50L2NvbnN0YW50cy5qcz84YzllIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9iYWNrZ3JvdW5kL2dyYWRpZW50L3NlcmlhbGl6ZXIuanM/ZDI2YyIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvYmFja2dyb3VuZC9ncmFkaWVudC91dGlscy5qcz8zZWZmIiwid2VicGFjazovL2Jsb2Nrc3lPcHRpb25zLy4vc3RhdGljL2pzL29wdGlvbnMvb3B0aW9ucy9iYWNrZ3JvdW5kL2dyYWRpZW50L2N1c3RvbS1ncmFkaWVudC1waWNrZXIuanM/ZTQ0MCIsIndlYnBhY2s6Ly9ibG9ja3N5T3B0aW9ucy8uL3N0YXRpYy9qcy9vcHRpb25zL29wdGlvbnMvYmFja2dyb3VuZC9ncmFkaWVudC9pbmRleC5qcz9jNzJhIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IF9leGNsdWRlZCA9IFtcImNsYXNzTmFtZVwiLCBcImlzU2VsZWN0ZWRcIiwgXCJzZWxlY3RlZEljb25Qcm9wc1wiLCBcInRvb2x0aXBUZXh0XCJdLFxuICAgICAgX2V4Y2x1ZGVkMiA9IFtcImNsYXNzTmFtZVwiLCBcImNoaWxkcmVuXCJdO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG4vKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5cbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuLyoqXG4gKiBXb3JkUHJlc3MgZGVwZW5kZW5jaWVzXG4gKi9cblxuaW1wb3J0IHsgSWNvbiwgY2hlY2sgfSBmcm9tICdAd29yZHByZXNzL2ljb25zJztcbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cblxuaW1wb3J0IHsgQnV0dG9uLCBEcm9wZG93biwgVG9vbHRpcCB9IGZyb20gJ0B3b3JkcHJlc3MvY29tcG9uZW50cyc7XG5cbmZ1bmN0aW9uIE9wdGlvbihfcmVmKSB7XG4gIGxldCB7XG4gICAgY2xhc3NOYW1lLFxuICAgIGlzU2VsZWN0ZWQsXG4gICAgc2VsZWN0ZWRJY29uUHJvcHMsXG4gICAgdG9vbHRpcFRleHRcbiAgfSA9IF9yZWYsXG4gICAgICBhZGRpdGlvbmFsUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBvcHRpb25CdXR0b24gPSBjcmVhdGVFbGVtZW50KEJ1dHRvbiwgX2V4dGVuZHMoe1xuICAgIGlzUHJlc3NlZDogaXNTZWxlY3RlZCxcbiAgICBjbGFzc05hbWU6IFwiY29tcG9uZW50cy1jaXJjdWxhci1vcHRpb24tcGlja2VyX19vcHRpb25cIlxuICB9LCBhZGRpdGlvbmFsUHJvcHMpKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcyhjbGFzc05hbWUsICdjb21wb25lbnRzLWNpcmN1bGFyLW9wdGlvbi1waWNrZXJfX29wdGlvbi13cmFwcGVyJylcbiAgfSwgdG9vbHRpcFRleHQgPyBjcmVhdGVFbGVtZW50KFRvb2x0aXAsIHtcbiAgICB0ZXh0OiB0b29sdGlwVGV4dFxuICB9LCBvcHRpb25CdXR0b24pIDogb3B0aW9uQnV0dG9uLCBpc1NlbGVjdGVkICYmIGNyZWF0ZUVsZW1lbnQoSWNvbiwgX2V4dGVuZHMoe1xuICAgIGljb246IGNoZWNrXG4gIH0sIHNlbGVjdGVkSWNvblByb3BzID8gc2VsZWN0ZWRJY29uUHJvcHMgOiB7fSkpKTtcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25MaW5rQWN0aW9uKF9yZWYyKSB7XG4gIGxldCB7XG4gICAgYnV0dG9uUHJvcHMsXG4gICAgY2xhc3NOYW1lLFxuICAgIGRyb3Bkb3duUHJvcHMsXG4gICAgbGlua1RleHRcbiAgfSA9IF9yZWYyO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChEcm9wZG93biwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NuYW1lcygnY29tcG9uZW50cy1jaXJjdWxhci1vcHRpb24tcGlja2VyX19kcm9wZG93bi1saW5rLWFjdGlvbicsIGNsYXNzTmFtZSksXG4gICAgcmVuZGVyVG9nZ2xlOiBfcmVmMyA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBpc09wZW4sXG4gICAgICAgIG9uVG9nZ2xlXG4gICAgICB9ID0gX3JlZjM7XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChCdXR0b24sIF9leHRlbmRzKHtcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGlzT3BlbixcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwidHJ1ZVwiLFxuICAgICAgICBvbkNsaWNrOiBvblRvZ2dsZSxcbiAgICAgICAgdmFyaWFudDogXCJsaW5rXCJcbiAgICAgIH0sIGJ1dHRvblByb3BzKSwgbGlua1RleHQpO1xuICAgIH1cbiAgfSwgZHJvcGRvd25Qcm9wcykpO1xufVxuXG5mdW5jdGlvbiBCdXR0b25BY3Rpb24oX3JlZjQpIHtcbiAgbGV0IHtcbiAgICBjbGFzc05hbWUsXG4gICAgY2hpbGRyZW5cbiAgfSA9IF9yZWY0LFxuICAgICAgYWRkaXRpb25hbFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWY0LCBfZXhjbHVkZWQyKTtcblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChCdXR0b24sIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2NvbXBvbmVudHMtY2lyY3VsYXItb3B0aW9uLXBpY2tlcl9fY2xlYXInLCBjbGFzc05hbWUpLFxuICAgIGlzU21hbGw6IHRydWUsXG4gICAgdmFyaWFudDogXCJzZWNvbmRhcnlcIlxuICB9LCBhZGRpdGlvbmFsUHJvcHMpLCBjaGlsZHJlbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENpcmN1bGFyT3B0aW9uUGlja2VyKF9yZWY1KSB7XG4gIGxldCB7XG4gICAgYWN0aW9ucyxcbiAgICBjbGFzc05hbWUsXG4gICAgb3B0aW9ucyxcbiAgICBjaGlsZHJlblxuICB9ID0gX3JlZjU7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2NvbXBvbmVudHMtY2lyY3VsYXItb3B0aW9uLXBpY2tlcicsIGNsYXNzTmFtZSlcbiAgfSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImNvbXBvbmVudHMtY2lyY3VsYXItb3B0aW9uLXBpY2tlcl9fc3dhdGNoZXNcIlxuICB9LCBvcHRpb25zKSwgY2hpbGRyZW4sIGFjdGlvbnMgJiYgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImNvbXBvbmVudHMtY2lyY3VsYXItb3B0aW9uLXBpY2tlcl9fY3VzdG9tLWNsZWFyLXdyYXBwZXJcIlxuICB9LCBhY3Rpb25zKSk7XG59XG5DaXJjdWxhck9wdGlvblBpY2tlci5PcHRpb24gPSBPcHRpb247XG5DaXJjdWxhck9wdGlvblBpY2tlci5CdXR0b25BY3Rpb24gPSBCdXR0b25BY3Rpb247XG5DaXJjdWxhck9wdGlvblBpY2tlci5Ecm9wZG93bkxpbmtBY3Rpb24gPSBEcm9wZG93bkxpbmtBY3Rpb247IiwiLyoqXG4gKiBFeHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgY29sb3JkLCBleHRlbmQgfSBmcm9tICdjb2xvcmQnO1xuaW1wb3J0IG5hbWVzUGx1Z2luIGZyb20gJ2NvbG9yZC9wbHVnaW5zL25hbWVzJztcbmV4dGVuZChbbmFtZXNQbHVnaW5dKTtcbi8qKlxuICogR2VuZXJhdGluZyBhIENTUyBjb21wbGlhbnQgcmdiYSgpIGNvbG9yIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZXhWYWx1ZSBUaGUgaGV4IHZhbHVlIHRvIGNvbnZlcnQgdG8gcmdiYSgpLlxuICogQHBhcmFtIHtudW1iZXJ9IGFscGhhICAgIFRoZSBhbHBoYSB2YWx1ZSBmb3Igb3BhY2l0eS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbnZlcnRlZCByZ2JhKCkgY29sb3IgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIHJnYmEoICcjMDAwMDAwJywgMC41IClcbiAqIC8vIHJnYmEoMCwgMCwgMCwgMC41KVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JhKCkge1xuICBsZXQgaGV4VmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICBsZXQgYWxwaGEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDE7XG4gIHJldHVybiBjb2xvcmQoaGV4VmFsdWUpLmFscGhhKGFscGhhKS50b1JnYlN0cmluZygpO1xufSIsImltcG9ydCBfbWVyZ2UgZnJvbSBcImxvZGFzaC9tZXJnZVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyByZ2JhIH0gZnJvbSAnLi9jb2xvcnMnO1xuZXhwb3J0IGNvbnN0IEJBU0UgPSB7XG4gIGJsYWNrOiAnIzAwMCcsXG4gIHdoaXRlOiAnI2ZmZidcbn07XG4vKipcbiAqIFRPRE86IENvbnRpbnVlIHRvIHVwZGF0ZSB2YWx1ZXMgYXMgXCJHMlwiIGRlc2lnbiBldm9sdmVzLlxuICpcbiAqIFwiRzJcIiByZWZlcnMgdG8gdGhlIG1vdmVtZW50IHRvIGFkdmFuY2UgdGhlIGludGVyZmFjZSBvZiB0aGUgYmxvY2sgZWRpdG9yLlxuICogaHR0cHM6Ly9naXRodWIuY29tL1dvcmRQcmVzcy9ndXRlbmJlcmcvaXNzdWVzLzE4NjY3XG4gKi9cblxuZXhwb3J0IGNvbnN0IEcyID0ge1xuICBibHVlOiB7XG4gICAgbWVkaXVtOiB7XG4gICAgICBmb2N1czogJyMwMDdjYmEnLFxuICAgICAgZm9jdXNEYXJrOiAnI2ZmZidcbiAgICB9XG4gIH0sXG4gIGdyYXk6IHtcbiAgICA5MDA6ICcjMWUxZTFlJyxcbiAgICA3MDA6ICcjNzU3NTc1JyxcbiAgICAvLyBNZWV0cyA0LjY6MSB0ZXh0IGNvbnRyYXN0IGFnYWluc3Qgd2hpdGUuXG4gICAgNjAwOiAnIzk0OTQ5NCcsXG4gICAgLy8gTWVldHMgMzoxIFVJIG9yIGxhcmdlIHRleHQgY29udHJhc3QgYWdhaW5zdCB3aGl0ZS5cbiAgICA0MDA6ICcjY2NjJyxcbiAgICAyMDA6ICcjZGRkJyxcbiAgICAvLyBVc2VkIGZvciBtb3N0IGJvcmRlcnMuXG4gICAgMTAwOiAnI2YwZjBmMCdcbiAgfSxcbiAgZGFya0dyYXk6IHtcbiAgICBwcmltYXJ5OiAnIzFlMWUxZScsXG4gICAgaGVhZGluZzogJyMwNTA1MDUnXG4gIH0sXG4gIG1lZGl1bUdyYXk6IHtcbiAgICB0ZXh0OiAnIzc1NzU3NSdcbiAgfSxcbiAgbGlnaHRHcmF5OiB7XG4gICAgdWk6ICcjOTQ5NDk0JyxcbiAgICBzZWNvbmRhcnk6ICcjY2NjJyxcbiAgICB0ZXJ0aWFyeTogJyNlN2U4ZTknXG4gIH1cbn07XG5leHBvcnQgY29uc3QgREFSS19HUkFZID0ge1xuICA5MDA6ICcjMTkxZTIzJyxcbiAgODAwOiAnIzIzMjgyZCcsXG4gIDcwMDogJyMzMjM3M2MnLFxuICA2MDA6ICcjNDA0NjRkJyxcbiAgNTAwOiAnIzU1NWQ2NicsXG4gIC8vIFVzZSB0aGlzIG1vc3Qgb2YgdGhlIHRpbWUgZm9yIGRhcmsgaXRlbXMuXG4gIDQwMDogJyM2MDZhNzMnLFxuICAzMDA6ICcjNmM3NzgxJyxcbiAgLy8gTGlnaHRlc3QgZ3JheSB0aGF0IGNhbiBiZSB1c2VkIGZvciBBQSB0ZXh0IGNvbnRyYXN0LlxuICAyMDA6ICcjN2U4OTkzJyxcbiAgMTUwOiAnIzhkOTZhMCcsXG4gIC8vIExpZ2h0ZXN0IGdyYXkgdGhhdCBjYW4gYmUgdXNlZCBmb3IgQUEgbm9uLXRleHQgY29udHJhc3QuXG4gIDEwMDogJyM4Zjk4YTEnLFxuICBwbGFjZWhvbGRlcjogcmdiYShHMi5ncmF5WzkwMF0sIDAuNjIpXG59O1xuZXhwb3J0IGNvbnN0IERBUktfT1BBQ0lUWSA9IHtcbiAgOTAwOiByZ2JhKCcjMDAwNTEwJywgMC45KSxcbiAgODAwOiByZ2JhKCcjMDAwMDBhJywgMC44NSksXG4gIDcwMDogcmdiYSgnIzA2MDYwYicsIDAuOCksXG4gIDYwMDogcmdiYSgnIzAwMDkxMycsIDAuNzUpLFxuICA1MDA6IHJnYmEoJyMwYTE4MjknLCAwLjcpLFxuICA0MDA6IHJnYmEoJyMwYTE4MjknLCAwLjY1KSxcbiAgMzAwOiByZ2JhKCcjMGUxYzJlJywgMC42MiksXG4gIDIwMDogcmdiYSgnIzE2MjQzNScsIDAuNTUpLFxuICAxMDA6IHJnYmEoJyMyMjM0NDMnLCAwLjUpLFxuICBiYWNrZ3JvdW5kRmlsbDogcmdiYShEQVJLX0dSQVlbNzAwXSwgMC43KVxufTtcbmV4cG9ydCBjb25zdCBEQVJLX09QQUNJVFlfTElHSFQgPSB7XG4gIDkwMDogcmdiYSgnIzMwNDQ1NScsIDAuNDUpLFxuICA4MDA6IHJnYmEoJyM0MjU4NjMnLCAwLjQpLFxuICA3MDA6IHJnYmEoJyM2Njc4ODYnLCAwLjM1KSxcbiAgNjAwOiByZ2JhKCcjN2I4NmEyJywgMC4zKSxcbiAgNTAwOiByZ2JhKCcjOTE5N2EyJywgMC4yNSksXG4gIDQwMDogcmdiYSgnIzk1OTU5YycsIDAuMiksXG4gIDMwMDogcmdiYSgnIzgyOTQ5MycsIDAuMTUpLFxuICAyMDA6IHJnYmEoJyM4YjhiOTYnLCAwLjEpLFxuICAxMDA6IHJnYmEoJyM3NDc0NzQnLCAwLjA1KVxufTtcbmV4cG9ydCBjb25zdCBMSUdIVF9HUkFZID0ge1xuICA5MDA6ICcjYTJhYWIyJyxcbiAgODAwOiAnI2I1YmNjMicsXG4gIDcwMDogJyNjY2QwZDQnLFxuICA2MDA6ICcjZDdkYWRlJyxcbiAgNTAwOiAnI2UyZTRlNycsXG4gIC8vIEdvb2QgZm9yIFwiZ3JheWVkXCIgaXRlbXMgYW5kIGJvcmRlcnMuXG4gIDQwMDogJyNlOGVhZWInLFxuICAvLyBHb29kIGZvciBcInJlYWRvbmx5XCIgaW5wdXQgZmllbGRzIGFuZCBzcGVjaWFsIHRleHQgc2VsZWN0aW9uLlxuICAzMDA6ICcjZWRlZmYwJyxcbiAgMjAwOiAnI2YzZjRmNScsXG4gIDEwMDogJyNmOGY5ZjknLFxuICBwbGFjZWhvbGRlcjogcmdiYShCQVNFLndoaXRlLCAwLjY1KVxufTtcbmV4cG9ydCBjb25zdCBMSUdIVF9PUEFDSVRZX0xJR0hUID0ge1xuICA5MDA6IHJnYmEoQkFTRS53aGl0ZSwgMC41KSxcbiAgODAwOiByZ2JhKEJBU0Uud2hpdGUsIDAuNDUpLFxuICA3MDA6IHJnYmEoQkFTRS53aGl0ZSwgMC40KSxcbiAgNjAwOiByZ2JhKEJBU0Uud2hpdGUsIDAuMzUpLFxuICA1MDA6IHJnYmEoQkFTRS53aGl0ZSwgMC4zKSxcbiAgNDAwOiByZ2JhKEJBU0Uud2hpdGUsIDAuMjUpLFxuICAzMDA6IHJnYmEoQkFTRS53aGl0ZSwgMC4yKSxcbiAgMjAwOiByZ2JhKEJBU0Uud2hpdGUsIDAuMTUpLFxuICAxMDA6IHJnYmEoQkFTRS53aGl0ZSwgMC4xKSxcbiAgYmFja2dyb3VuZEZpbGw6IHJnYmEoTElHSFRfR1JBWVszMDBdLCAwLjgpXG59OyAvLyBBZGRpdGlvbmFsIGNvbG9ycy5cbi8vIFNvbWUgYXJlIGZyb20gaHR0cHM6Ly9tYWtlLndvcmRwcmVzcy5vcmcvZGVzaWduL2hhbmRib29rL2ZvdW5kYXRpb25zL2NvbG9ycy8uXG5cbmV4cG9ydCBjb25zdCBCTFVFID0ge1xuICB3b3JkcHJlc3M6IHtcbiAgICA3MDA6ICcjMDA2NjliJ1xuICB9LFxuICBkYXJrOiB7XG4gICAgOTAwOiAnIzAwNzFhMSdcbiAgfSxcbiAgbWVkaXVtOiB7XG4gICAgOTAwOiAnIzAwNjU4OScsXG4gICAgODAwOiAnIzAwNzM5YycsXG4gICAgNzAwOiAnIzAwN2ZhYycsXG4gICAgNjAwOiAnIzAwOGRiZScsXG4gICAgNTAwOiAnIzAwYTBkMicsXG4gICAgNDAwOiAnIzMzYjNkYicsXG4gICAgMzAwOiAnIzY2YzZlNCcsXG4gICAgMjAwOiAnI2JmZTdmMycsXG4gICAgMTAwOiAnI2U1ZjVmYScsXG4gICAgaGlnaGxpZ2h0OiAnI2IzZTdmZScsXG4gICAgZm9jdXM6ICcjMDA3Y2JhJ1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IEFMRVJUID0ge1xuICB5ZWxsb3c6ICcjZjBiODQ5JyxcbiAgcmVkOiAnI2Q5NGY0ZicsXG4gIGdyZWVuOiAnIzRhYjg2Nidcbn07XG5leHBvcnQgY29uc3QgQURNSU4gPSB7XG4gIHRoZW1lOiBgdmFyKCAtLXdwLWFkbWluLXRoZW1lLWNvbG9yLCAke0JMVUUud29yZHByZXNzWzcwMF19KWAsXG4gIHRoZW1lRGFyazEwOiBgdmFyKCAtLXdwLWFkbWluLXRoZW1lLWNvbG9yLWRhcmtlci0xMCwgJHtCTFVFLm1lZGl1bS5mb2N1c30pYFxufTsgLy8gTmFtZXNwYWNlZCB2YWx1ZXMgZm9yIHJhdyBjb2xvcnMgaGV4IGNvZGVzXG5cbmV4cG9ydCBjb25zdCBVSSA9IHtcbiAgdGhlbWU6IEFETUlOLnRoZW1lLFxuICBiYWNrZ3JvdW5kOiBCQVNFLndoaXRlLFxuICBiYWNrZ3JvdW5kRGlzYWJsZWQ6IExJR0hUX0dSQVlbMjAwXSxcbiAgYm9yZGVyOiBHMi5ncmF5WzcwMF0sXG4gIGJvcmRlckhvdmVyOiBHMi5ncmF5WzcwMF0sXG4gIGJvcmRlckZvY3VzOiBBRE1JTi50aGVtZURhcmsxMCxcbiAgYm9yZGVyRGlzYWJsZWQ6IEcyLmdyYXlbNDAwXSxcbiAgYm9yZGVyTGlnaHQ6IEcyLmdyYXlbMjAwXSxcbiAgbGFiZWw6IERBUktfR1JBWVs1MDBdLFxuICB0ZXh0RGlzYWJsZWQ6IERBUktfR1JBWVsxNTBdLFxuICB0ZXh0RGFyazogQkFTRS53aGl0ZSxcbiAgdGV4dExpZ2h0OiBCQVNFLmJsYWNrXG59O1xuZXhwb3J0IGNvbnN0IENPTE9SUyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgQkFTRSksIHt9LCB7XG4gIGRhcmtHcmF5OiBfbWVyZ2Uoe30sIERBUktfR1JBWSwgRzIuZGFya0dyYXkpLFxuICBkYXJrT3BhY2l0eTogREFSS19PUEFDSVRZLFxuICBkYXJrT3BhY2l0eUxpZ2h0OiBEQVJLX09QQUNJVFlfTElHSFQsXG4gIG1lZGl1bUdyYXk6IEcyLm1lZGl1bUdyYXksXG4gIGdyYXk6IEcyLmdyYXksXG4gIGxpZ2h0R3JheTogX21lcmdlKHt9LCBMSUdIVF9HUkFZLCBHMi5saWdodEdyYXkpLFxuICBsaWdodEdyYXlMaWdodDogTElHSFRfT1BBQ0lUWV9MSUdIVCxcbiAgYmx1ZTogX21lcmdlKHt9LCBCTFVFLCBHMi5ibHVlKSxcbiAgYWxlcnQ6IEFMRVJULFxuICBhZG1pbjogQURNSU4sXG4gIHVpOiBVSVxufSk7XG5leHBvcnQgZGVmYXVsdCBDT0xPUlM7IiwiZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgQ09MT1JTIH0gZnJvbSAnLi9jb2xvcnMtdmFsdWVzJztcblxuY29uc3Qgc3BhY2UgPSBuID0+IGAke24gKiA0fXB4YDtcblxuY29uc3QgQ09OVFJPTF9IRUlHSFQgPSAnMzZweCc7XG5jb25zdCBDT05UUk9MX1BBRERJTkdfWCA9ICcxMnB4JztcbmNvbnN0IENPTlRST0xfUFJPUFMgPSB7XG4gIGNvbnRyb2xTdXJmYWNlQ29sb3I6IENPTE9SUy53aGl0ZSxcbiAgY29udHJvbFRleHRBY3RpdmVDb2xvcjogQ09MT1JTLnVpLnRoZW1lLFxuICBjb250cm9sUGFkZGluZ1g6IENPTlRST0xfUEFERElOR19YLFxuICBjb250cm9sUGFkZGluZ1hMYXJnZTogYGNhbGMoJHtDT05UUk9MX1BBRERJTkdfWH0gKiAxLjMzMzQpYCxcbiAgY29udHJvbFBhZGRpbmdYU21hbGw6IGBjYWxjKCR7Q09OVFJPTF9QQURESU5HX1h9IC8gMS4zMzM0KWAsXG4gIGNvbnRyb2xCYWNrZ3JvdW5kQ29sb3I6IENPTE9SUy53aGl0ZSxcbiAgY29udHJvbEJvcmRlclJhZGl1czogJzJweCcsXG4gIGNvbnRyb2xCb3JkZXJDb2xvcjogQ09MT1JTLmdyYXlbNzAwXSxcbiAgY29udHJvbEJveFNoYWRvdzogJ3RyYW5zcGFyZW50JyxcbiAgY29udHJvbEJvcmRlckNvbG9ySG92ZXI6IENPTE9SUy5ncmF5WzcwMF0sXG4gIGNvbnRyb2xCb3hTaGFkb3dGb2N1czogYDAgMCAwIDAuNXB4ICR7Q09MT1JTLmFkbWluLnRoZW1lfWAsXG4gIGNvbnRyb2xEZXN0cnVjdGl2ZUJvcmRlckNvbG9yOiBDT0xPUlMuYWxlcnQucmVkLFxuICBjb250cm9sSGVpZ2h0OiBDT05UUk9MX0hFSUdIVCxcbiAgY29udHJvbEhlaWdodFhTbWFsbDogYGNhbGMoICR7Q09OVFJPTF9IRUlHSFR9ICogMC42IClgLFxuICBjb250cm9sSGVpZ2h0U21hbGw6IGBjYWxjKCAke0NPTlRST0xfSEVJR0hUfSAqIDAuOCApYCxcbiAgY29udHJvbEhlaWdodExhcmdlOiBgY2FsYyggJHtDT05UUk9MX0hFSUdIVH0gKiAxLjIgKWAsXG4gIGNvbnRyb2xIZWlnaHRYTGFyZ2U6IGBjYWxjKCAke0NPTlRST0xfSEVJR0hUfSAqIDEuNCApYFxufTtcbmNvbnN0IFRPR0dMRV9HUk9VUF9DT05UUk9MX1BST1BTID0ge1xuICB0b2dnbGVHcm91cENvbnRyb2xCYWNrZ3JvdW5kQ29sb3I6IENPTlRST0xfUFJPUFMuY29udHJvbEJhY2tncm91bmRDb2xvcixcbiAgdG9nZ2xlR3JvdXBDb250cm9sQm9yZGVyQ29sb3I6IENPTE9SUy51aS5ib3JkZXIsXG4gIHRvZ2dsZUdyb3VwQ29udHJvbEJhY2tkcm9wQmFja2dyb3VuZENvbG9yOiBDT05UUk9MX1BST1BTLmNvbnRyb2xTdXJmYWNlQ29sb3IsXG4gIHRvZ2dsZUdyb3VwQ29udHJvbEJhY2tkcm9wQm9yZGVyQ29sb3I6IENPTE9SUy51aS5ib3JkZXIsXG4gIHRvZ2dsZUdyb3VwQ29udHJvbEJhY2tkcm9wQm94U2hhZG93OiAndHJhbnNwYXJlbnQnLFxuICB0b2dnbGVHcm91cENvbnRyb2xCdXR0b25Db2xvckFjdGl2ZTogQ09OVFJPTF9QUk9QUy5jb250cm9sQmFja2dyb3VuZENvbG9yXG59O1xuZXhwb3J0IGRlZmF1bHQgX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIENPTlRST0xfUFJPUFMpLCBUT0dHTEVfR1JPVVBfQ09OVFJPTF9QUk9QUyksIHt9LCB7XG4gIGNvbG9yRGl2aWRlcjogJ3JnYmEoMCwgMCwgMCwgMC4xKScsXG4gIGNvbG9yU2Nyb2xsYmFyVGh1bWI6ICdyZ2JhKDAsIDAsIDAsIDAuMiknLFxuICBjb2xvclNjcm9sbGJhclRodW1iSG92ZXI6ICdyZ2JhKDAsIDAsIDAsIDAuNSknLFxuICBjb2xvclNjcm9sbGJhclRyYWNrOiAncmdiYSgwLCAwLCAwLCAwLjA0KScsXG4gIGVsZXZhdGlvbkludGVuc2l0eTogMSxcbiAgcmFkaXVzQmxvY2tVaTogJzJweCcsXG4gIGJvcmRlcldpZHRoOiAnMXB4JyxcbiAgYm9yZGVyV2lkdGhGb2N1czogJzEuNXB4JyxcbiAgYm9yZGVyV2lkdGhUYWI6ICc0cHgnLFxuICBzcGlubmVyU2l6ZTogJzE4cHgnLFxuICBmb250U2l6ZTogJzEzcHgnLFxuICBmb250U2l6ZUgxOiAnY2FsYygyLjQ0ICogMTNweCknLFxuICBmb250U2l6ZUgyOiAnY2FsYygxLjk1ICogMTNweCknLFxuICBmb250U2l6ZUgzOiAnY2FsYygxLjU2ICogMTNweCknLFxuICBmb250U2l6ZUg0OiAnY2FsYygxLjI1ICogMTNweCknLFxuICBmb250U2l6ZUg1OiAnMTNweCcsXG4gIGZvbnRTaXplSDY6ICdjYWxjKDAuOCAqIDEzcHgpJyxcbiAgZm9udFNpemVJbnB1dE1vYmlsZTogJzE2cHgnLFxuICBmb250U2l6ZU1vYmlsZTogJzE1cHgnLFxuICBmb250U2l6ZVNtYWxsOiAnY2FsYygwLjkyICogMTNweCknLFxuICBmb250U2l6ZVhTbWFsbDogJ2NhbGMoMC43NSAqIDEzcHgpJyxcbiAgZm9udExpbmVIZWlnaHRCYXNlOiAnMS4yJyxcbiAgZm9udFdlaWdodDogJ25vcm1hbCcsXG4gIGZvbnRXZWlnaHRIZWFkaW5nOiAnNjAwJyxcbiAgZ3JpZEJhc2U6ICc0cHgnLFxuICBjYXJkQm9yZGVyUmFkaXVzOiAnMnB4JyxcbiAgY2FyZFBhZGRpbmdYU21hbGw6IGAke3NwYWNlKDIpfWAsXG4gIGNhcmRQYWRkaW5nU21hbGw6IGAke3NwYWNlKDQpfWAsXG4gIGNhcmRQYWRkaW5nTWVkaXVtOiBgJHtzcGFjZSg0KX0gJHtzcGFjZSg2KX1gLFxuICBjYXJkUGFkZGluZ0xhcmdlOiBgJHtzcGFjZSg2KX0gJHtzcGFjZSg4KX1gLFxuICBzdXJmYWNlQmFja2dyb3VuZENvbG9yOiBDT0xPUlMud2hpdGUsXG4gIHN1cmZhY2VCYWNrZ3JvdW5kU3VidGxlQ29sb3I6ICcjRjNGM0YzJyxcbiAgc3VyZmFjZUJhY2tncm91bmRUaW50Q29sb3I6ICcjRjVGNUY1JyxcbiAgc3VyZmFjZUJvcmRlckNvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjEpJyxcbiAgc3VyZmFjZUJvcmRlckJvbGRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC4xNSknLFxuICBzdXJmYWNlQm9yZGVyU3VidGxlQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMDUpJyxcbiAgc3VyZmFjZUJhY2tncm91bmRUZXJ0aWFyeUNvbG9yOiBDT0xPUlMud2hpdGUsXG4gIHN1cmZhY2VDb2xvcjogQ09MT1JTLndoaXRlLFxuICB0cmFuc2l0aW9uRHVyYXRpb246ICcyMDBtcycsXG4gIHRyYW5zaXRpb25EdXJhdGlvbkZhc3Q6ICcxNjBtcycsXG4gIHRyYW5zaXRpb25EdXJhdGlvbkZhc3RlcjogJzEyMG1zJyxcbiAgdHJhbnNpdGlvbkR1cmF0aW9uRmFzdGVzdDogJzEwMG1zJyxcbiAgdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOiAnY3ViaWMtYmV6aWVyKDAuMDgsIDAuNTIsIDAuNTIsIDEpJyxcbiAgdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uQ29udHJvbDogJ2N1YmljLWJlemllcigwLjEyLCAwLjgsIDAuMzIsIDEpJ1xufSk7IiwiY29uc3QgX2V4Y2x1ZGVkID0gW1widmFsdWVcIiwgXCJvbkNoYW5nZVwiXTtcblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuLyoqXG4gKiBXb3JkUHJlc3MgZGVwZW5kZW5jaWVzXG4gKi9cblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IHsgRmxleCB9IGZyb20gJ0B3b3JkcHJlc3MvY29tcG9uZW50cyc7XG5pbXBvcnQgeyBfX2V4cGVyaW1lbnRhbFVzZURyYWdnaW5nIGFzIHVzZURyYWdnaW5nIH0gZnJvbSAnQHdvcmRwcmVzcy9jb21wb3NlJztcbmltcG9ydCBDT0xPUlMgZnJvbSAnLi4vY29sb3JzLXZhbHVlcyc7XG5pbXBvcnQgQ09ORklHIGZyb20gJy4uL2NvbmZpZy12YWx1ZXMnO1xuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuXG5jb25zdCBDSVJDTEVfU0laRSA9IDMyO1xuY29uc3QgSU5ORVJfQ0lSQ0xFX1NJWkUgPSAzO1xuXG5jb25zdCBzcGFjZSA9IG4gPT4gYCR7biAqIDR9cHhgO1xuXG5mdW5jdGlvbiBBbmdsZUNpcmNsZShfcmVmKSB7XG4gIGxldCB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWYsXG4gICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IGFuZ2xlQ2lyY2xlUmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IGFuZ2xlQ2lyY2xlQ2VudGVyID0gdXNlUmVmKCk7XG4gIGNvbnN0IHByZXZpb3VzQ3Vyc29yVmFsdWUgPSB1c2VSZWYoKTtcblxuICBjb25zdCBzZXRBbmdsZUNpcmNsZUNlbnRlciA9ICgpID0+IHtcbiAgICBjb25zdCByZWN0ID0gYW5nbGVDaXJjbGVSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBhbmdsZUNpcmNsZUNlbnRlci5jdXJyZW50ID0ge1xuICAgICAgeDogcmVjdC54ICsgcmVjdC53aWR0aCAvIDIsXG4gICAgICB5OiByZWN0LnkgKyByZWN0LmhlaWdodCAvIDJcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGNoYW5nZUFuZ2xlVG9Qb3NpdGlvbiA9IGV2ZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB4OiBjZW50ZXJYLFxuICAgICAgeTogY2VudGVyWVxuICAgIH0gPSBhbmdsZUNpcmNsZUNlbnRlci5jdXJyZW50O1xuICAgIGNvbnN0IHtcbiAgICAgIG93bmVyRG9jdW1lbnRcbiAgICB9ID0gYW5nbGVDaXJjbGVSZWYuY3VycmVudDsgLy8gUHJldmVudCAoZHJhZykgbW91c2UgZXZlbnRzIGZyb20gc2VsZWN0aW5nIGFuZCBhY2NpZGVudGFsbHlcbiAgICAvLyB0cmlnZ2VyaW5nIGFjdGlvbnMgZnJvbSBvdGhlciBlbGVtZW50cy5cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIEVuc3VyZSB0aGUgaW5wdXQgaXNuJ3QgZm9jdXNlZCBhcyBwcmV2ZW50RGVmYXVsdCB3b3VsZCBsZWF2ZSBpdFxuXG4gICAgb3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICBvbkNoYW5nZShnZXRBbmdsZShjZW50ZXJYLCBjZW50ZXJZLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSk7XG4gIH07XG5cbiAgY29uc3Qge1xuICAgIHN0YXJ0RHJhZyxcbiAgICBpc0RyYWdnaW5nXG4gIH0gPSB1c2VEcmFnZ2luZyh7XG4gICAgb25EcmFnU3RhcnQ6IGV2ZW50ID0+IHtcbiAgICAgIHNldEFuZ2xlQ2lyY2xlQ2VudGVyKCk7XG4gICAgICBjaGFuZ2VBbmdsZVRvUG9zaXRpb24oZXZlbnQpO1xuICAgIH0sXG4gICAgb25EcmFnTW92ZTogY2hhbmdlQW5nbGVUb1Bvc2l0aW9uLFxuICAgIG9uRHJhZ0VuZDogY2hhbmdlQW5nbGVUb1Bvc2l0aW9uXG4gIH0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICBpZiAocHJldmlvdXNDdXJzb3JWYWx1ZS5jdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJldmlvdXNDdXJzb3JWYWx1ZS5jdXJyZW50ID0gZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3I7XG4gICAgICB9XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBwcmV2aW91c0N1cnNvclZhbHVlLmN1cnJlbnQgfHwgbnVsbDtcbiAgICAgIHByZXZpb3VzQ3Vyc29yVmFsdWUuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIFtpc0RyYWdnaW5nXSk7XG4gIHJldHVybiAoXG4gICAgLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG4gICAgY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICByZWY6IGFuZ2xlQ2lyY2xlUmVmLFxuICAgICAgb25Nb3VzZURvd246IHN0YXJ0RHJhZyxcbiAgICAgIGNsYXNzTmFtZTogXCJjb21wb25lbnRzLWFuZ2xlLXBpY2tlci1jb250cm9sX19hbmdsZS1jaXJjbGVcIixcbiAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGlzRHJhZ2dpbmcgPyB7XG4gICAgICAgIGN1cnNvcjogJ2dyYWJiaW5nJ1xuICAgICAgfSA6IHt9KSwge30sIHtcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICAgICAgYm9yZGVyOiBgJHtDT05GSUcuYm9yZGVyV2lkdGh9IHNvbGlkICR7Q09MT1JTLnVpLmJvcmRlcn1gLFxuICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgY3Vyc29yOiAnZ3JhYicsXG4gICAgICAgIGhlaWdodDogYCR7Q0lSQ0xFX1NJWkV9cHhgLFxuICAgICAgICBvdmVyZmxvdzogYGhpZGRlbmAsXG4gICAgICAgIHdpZHRoOiBgJHtDSVJDTEVfU0laRX1weGBcbiAgICAgIH0pXG4gICAgfSwgcHJvcHMpLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHZhbHVlID8ge1xuICAgICAgICB0cmFuc2Zvcm06IGByb3RhdGUoJHt2YWx1ZX1kZWcpYFxuICAgICAgfSA6IHt9KSwge30sIHtcbiAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgfSksXG4gICAgICBjbGFzc05hbWU6IFwiY29tcG9uZW50cy1hbmdsZS1waWNrZXItY29udHJvbF9fYW5nbGUtY2lyY2xlLWluZGljYXRvci13cmFwcGVyXCJcbiAgICB9LCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IENPTE9SUy5hZG1pbi50aGVtZSxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICAgICAgYm9yZGVyOiBgJHtJTk5FUl9DSVJDTEVfU0laRX1weCBzb2xpZCAke0NPTE9SUy5hZG1pbi50aGVtZX1gLFxuICAgICAgICBib3R0b206IDAsXG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIG1hcmdpbjogJ2F1dG8nLFxuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgIHRvcDogYC0ke0NJUkNMRV9TSVpFIC8gMn1weGAsXG4gICAgICAgIHdpZHRoOiAwXG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiBcImNvbXBvbmVudHMtYW5nbGUtcGlja2VyLWNvbnRyb2xfX2FuZ2xlLWNpcmNsZS1pbmRpY2F0b3JcIlxuICAgIH0pKSlcbiAgICAvKiBlc2xpbnQtZW5hYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEFuZ2xlKGNlbnRlclgsIGNlbnRlclksIHBvaW50WCwgcG9pbnRZKSB7XG4gIGNvbnN0IHkgPSBwb2ludFkgLSBjZW50ZXJZO1xuICBjb25zdCB4ID0gcG9pbnRYIC0gY2VudGVyWDtcbiAgY29uc3QgYW5nbGVJblJhZGlhbnMgPSBNYXRoLmF0YW4yKHksIHgpO1xuICBjb25zdCBhbmdsZUluRGVnID0gTWF0aC5yb3VuZChhbmdsZUluUmFkaWFucyAqICgxODAgLyBNYXRoLlBJKSkgKyA5MDtcblxuICBpZiAoYW5nbGVJbkRlZyA8IDApIHtcbiAgICByZXR1cm4gMzYwICsgYW5nbGVJbkRlZztcbiAgfVxuXG4gIHJldHVybiBhbmdsZUluRGVnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBbmdsZUNpcmNsZTsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50Jztcbi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cblxuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG4vKipcbiAqIFdvcmRQcmVzcyBkZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgeyBfXyB9IGZyb20gJ2N0LWkxOG4nO1xuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgQW5nbGVDaXJjbGUgZnJvbSAnLi9hbmdsZS1jaXJjbGUnO1xuY29uc3Qge1xuICBGbGV4LFxuICBGbGV4QmxvY2ssXG4gIEZsZXhJdGVtLFxuICBfX2V4cGVyaW1lbnRhbFRleHQ6IFRleHQsXG4gIF9fZXhwZXJpbWVudGFsU3BhY2VyOiBTcGFjZXIsXG4gIF9fZXhwZXJpbWVudGFsSW5wdXRDb250cm9sOiBOdW1iZXJDb250cm9sXG59ID0gd2luZG93LndwLmNvbXBvbmVudHM7IC8vIG1hcmdpbi1ib3R0b206IDhweFxuXG5jb25zdCBzcGFjZSA9IG4gPT4gYCR7biAqIDR9cHhgO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBbmdsZVBpY2tlckNvbnRyb2woX3JlZikge1xuICBsZXQge1xuICAgIGNsYXNzTmFtZSxcbiAgICBsYWJlbCA9IF9fKCdBbmdsZScpLFxuICAgIG9uQ2hhbmdlLFxuICAgIHZhbHVlXG4gIH0gPSBfcmVmO1xuXG4gIGNvbnN0IGhhbmRsZU9uTnVtYmVyQ2hhbmdlID0gdW5wcm9jZXNzZWRWYWx1ZSA9PiB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IHVucHJvY2Vzc2VkVmFsdWUgIT09ICcnID8gcGFyc2VJbnQodW5wcm9jZXNzZWRWYWx1ZSwgMTApIDogMDtcbiAgICBvbkNoYW5nZShpbnB1dFZhbHVlKTtcbiAgfTtcblxuICBjb25zdCBjbGFzc2VzID0gY2xhc3NuYW1lcygnY29tcG9uZW50cy1hbmdsZS1waWNrZXItY29udHJvbCcsIGNsYXNzTmFtZSk7XG4gIGNvbnN0IFJvb3QgPSBGbGV4O1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChSb290LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0sIGNyZWF0ZUVsZW1lbnQoRmxleEJsb2NrLCBudWxsLCBjcmVhdGVFbGVtZW50KE51bWJlckNvbnRyb2wsIHtcbiAgICBsYWJlbDogbGFiZWwsXG4gICAgY2xhc3NOYW1lOiBcImNvbXBvbmVudHMtYW5nbGUtcGlja2VyLWNvbnRyb2xfX2lucHV0LWZpZWxkXCIsXG4gICAgbWF4OiAzNjAsXG4gICAgbWluOiAwLFxuICAgIG9uQ2hhbmdlOiBoYW5kbGVPbk51bWJlckNoYW5nZSxcbiAgICBzaXplOiBcIl9fdW5zdGFibGUtbGFyZ2VcIixcbiAgICBzdGVwOiBcIjFcIixcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgaGlkZUhUTUxBcnJvd3M6IHRydWUsXG4gICAgc3VmZml4OiBjcmVhdGVFbGVtZW50KFNwYWNlciwge1xuICAgICAgYXM6IFRleHQsXG4gICAgICBtYXJnaW5Cb3R0b206IDAsXG4gICAgICBtYXJnaW5SaWdodDogc3BhY2UoMyksXG4gICAgICBzdHlsZToge1xuICAgICAgICBjb2xvcjogJ3ZhciggLS13cC1hZG1pbi10aGVtZS1jb2xvciApJ1xuICAgICAgfVxuICAgIH0sIFwiXFx4QjBcIilcbiAgfSkpLCBjcmVhdGVFbGVtZW50KEZsZXhJdGVtLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIG1hcmdpbkxlZnQ6IHNwYWNlKDQpLFxuICAgICAgbWFyZ2luQm90dG9tOiBzcGFjZSgxKSxcbiAgICAgIG1hcmdpblRvcDogJ2F1dG8nXG4gICAgfVxuICB9LCBjcmVhdGVFbGVtZW50KEFuZ2xlQ2lyY2xlLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlXG4gIH0pKSk7XG59IiwiZXhwb3J0IGNvbnN0IEdSQURJRU5UX01BUktFUlNfV0lEVEggPSAxNjtcbmV4cG9ydCBjb25zdCBJTlNFUlRfUE9JTlRfV0lEVEggPSAxNjtcbmV4cG9ydCBjb25zdCBNSU5JTVVNX0FCU09MVVRFX0xFRlRfUE9TSVRJT04gPSA1O1xuZXhwb3J0IGNvbnN0IE1JTklNVU1fRElTVEFOQ0VfQkVUV0VFTl9JTlNFUlRFUl9BTkRfUE9JTlQgPSAxMDtcbmV4cG9ydCBjb25zdCBNSU5JTVVNX0RJU1RBTkNFX0JFVFdFRU5fUE9JTlRTID0gMDtcbmV4cG9ydCBjb25zdCBNSU5JTVVNX1NJR05JRklDQU5UX01PVkUgPSA1O1xuZXhwb3J0IGNvbnN0IEtFWUJPQVJEX0NPTlRST0xfUE9JTlRfVkFSSUFUSU9OID0gTUlOSU1VTV9ESVNUQU5DRV9CRVRXRUVOX0lOU0VSVEVSX0FORF9QT0lOVDtcbmV4cG9ydCBjb25zdCBNSU5JTVVNX0RJU1RBTkNFX0JFVFdFRU5fSU5TRVJURVJfQU5EX01BUktFUiA9IChJTlNFUlRfUE9JTlRfV0lEVEggKyBHUkFESUVOVF9NQVJLRVJTX1dJRFRIKSAvIDI7IiwiZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgTUlOSU1VTV9ESVNUQU5DRV9CRVRXRUVOX1BPSU5UUywgTUlOSU1VTV9BQlNPTFVURV9MRUZUX1BPU0lUSU9OLCBJTlNFUlRfUE9JTlRfV0lEVEggfSBmcm9tICcuL2NvbnN0YW50cyc7XG4vKipcbiAqIENvbnRyb2wgcG9pbnQgZm9yIHRoZSBncmFkaWVudCBiYXIuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ29udHJvbFBvaW50XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sb3IgICAgQ29sb3Igb2YgdGhlIGNvbnRyb2wgcG9pbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcG9zaXRpb24gSW50ZWdlciBwb3NpdGlvbiBvZiB0aGUgY29udHJvbCBwb2ludCBhcyBhIHBlcmNlbnRhZ2UuXG4gKi9cblxuLyoqXG4gKiBDb2xvciBhcyBwYXJzZWQgZnJvbSB0aGUgZ3JhZGllbnQgYnkgZ3JhZGllbnQtcGFyc2VyLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gciAgIFJlZCBjb21wb25lbnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZyAgIEdyZWVuIGNvbXBvbmVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiICAgR3JlZW4gY29tcG9uZW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthXSBPcHRpb25hbCBhbHBoYSBjb21wb25lbnQuXG4gKi9cblxuLyoqXG4gKiBDbGFtcHMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFZhbHVlIHRvIGNsYW1wLlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVmFsdWUgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEwMC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xhbXBQZXJjZW50KHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIHZhbHVlKSk7XG59XG4vKipcbiAqIENoZWNrIGlmIGEgY29udHJvbCBwb2ludCBpcyBvdmVybGFwcGluZyB3aXRoIGFub3RoZXIuXG4gKlxuICogQHBhcmFtIHtDb250cm9sUG9pbnRbXX0gdmFsdWUgICAgICAgIEFycmF5IG9mIGNvbnRyb2wgcG9pbnRzLlxuICogQHBhcmFtIHtudW1iZXJ9ICAgICAgICAgaW5pdGlhbEluZGV4IEluZGV4IG9mIHRoZSBwb3NpdGlvbiB0byB0ZXN0LlxuICogQHBhcmFtIHtudW1iZXJ9ICAgICAgICAgbmV3UG9zaXRpb24gIE5ldyBwb3NpdGlvbiBvZiB0aGUgY29udHJvbCBwb2ludC5cbiAqIEBwYXJhbSB7bnVtYmVyfSAgICAgICAgIG1pbkRpc3RhbmNlICBEaXN0YW5jZSBjb25zaWRlcmVkIHRvIGJlIG92ZXJsYXBwaW5nLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBvaW50IGlzIG92ZXJsYXBwaW5nLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc092ZXJsYXBwaW5nKHZhbHVlLCBpbml0aWFsSW5kZXgsIG5ld1Bvc2l0aW9uKSB7XG4gIGxldCBtaW5EaXN0YW5jZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogTUlOSU1VTV9ESVNUQU5DRV9CRVRXRUVOX1BPSU5UUztcbiAgY29uc3QgaW5pdGlhbFBvc2l0aW9uID0gdmFsdWVbaW5pdGlhbEluZGV4XS5wb3NpdGlvbjtcbiAgY29uc3QgbWluUG9zaXRpb24gPSBNYXRoLm1pbihpbml0aWFsUG9zaXRpb24sIG5ld1Bvc2l0aW9uKTtcbiAgY29uc3QgbWF4UG9zaXRpb24gPSBNYXRoLm1heChpbml0aWFsUG9zaXRpb24sIG5ld1Bvc2l0aW9uKTtcbiAgcmV0dXJuIHZhbHVlLnNvbWUoKF9yZWYsIGluZGV4KSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHBvc2l0aW9uXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIGluZGV4ICE9PSBpbml0aWFsSW5kZXggJiYgKE1hdGguYWJzKHBvc2l0aW9uIC0gbmV3UG9zaXRpb24pIDwgbWluRGlzdGFuY2UgfHwgbWluUG9zaXRpb24gPCBwb3NpdGlvbiAmJiBwb3NpdGlvbiA8IG1heFBvc2l0aW9uKTtcbiAgfSk7XG59XG4vKipcbiAqIEFkZHMgYSBjb250cm9sIHBvaW50IGZyb20gYW4gYXJyYXkgYW5kIHJldHVybnMgdGhlIG5ldyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0NvbnRyb2xQb2ludFtdfSBwb2ludHMgICBBcnJheSBvZiBjb250cm9sIHBvaW50cy5cbiAqIEBwYXJhbSB7bnVtYmVyfSAgICAgICAgIHBvc2l0aW9uIFBvc2l0aW9uIHRvIGluc2VydCB0aGUgbmV3IHBvaW50LlxuICogQHBhcmFtIHtDb2xvcn0gICAgICAgICAgY29sb3IgICAgQ29sb3IgdG8gdXBkYXRlIHRoZSBjb250cm9sIHBvaW50IGF0IGluZGV4LlxuICpcbiAqIEByZXR1cm4ge0NvbnRyb2xQb2ludFtdfSBOZXcgYXJyYXkgb2YgY29udHJvbCBwb2ludHMuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbnRyb2xQb2ludChwb2ludHMsIHBvc2l0aW9uLCBjb2xvcikge1xuICBjb25zdCBuZXh0SW5kZXggPSBwb2ludHMuZmluZEluZGV4KHBvaW50ID0+IHBvaW50LnBvc2l0aW9uID4gcG9zaXRpb24pO1xuICBjb25zdCBuZXdQb2ludCA9IHtcbiAgICBjb2xvcixcbiAgICBwb3NpdGlvblxuICB9O1xuICBjb25zdCBuZXdQb2ludHMgPSBwb2ludHMuc2xpY2UoKTtcbiAgbmV3UG9pbnRzLnNwbGljZShuZXh0SW5kZXggLSAxLCAwLCBuZXdQb2ludCk7XG4gIHJldHVybiBuZXdQb2ludHM7XG59XG4vKipcbiAqIFJlbW92ZXMgYSBjb250cm9sIHBvaW50IGZyb20gYW4gYXJyYXkgYW5kIHJldHVybnMgdGhlIG5ldyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0NvbnRyb2xQb2ludFtdfSBwb2ludHMgQXJyYXkgb2YgY29udHJvbCBwb2ludHMuXG4gKiBAcGFyYW0ge251bWJlcn0gICAgICAgICBpbmRleCAgSW5kZXggdG8gcmVtb3ZlLlxuICpcbiAqIEByZXR1cm4ge0NvbnRyb2xQb2ludFtdfSBOZXcgYXJyYXkgb2YgY29udHJvbCBwb2ludHMuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUNvbnRyb2xQb2ludChwb2ludHMsIGluZGV4KSB7XG4gIHJldHVybiBwb2ludHMuZmlsdGVyKChwb2ludCwgcG9pbnRJbmRleCkgPT4ge1xuICAgIHJldHVybiBwb2ludEluZGV4ICE9PSBpbmRleDtcbiAgfSk7XG59XG4vKipcbiAqIFVwZGF0ZXMgYSBjb250cm9sIHBvaW50IGZyb20gYW4gYXJyYXkgYW5kIHJldHVybnMgdGhlIG5ldyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0NvbnRyb2xQb2ludFtdfSBwb2ludHMgICBBcnJheSBvZiBjb250cm9sIHBvaW50cy5cbiAqIEBwYXJhbSB7bnVtYmVyfSAgICAgICAgIGluZGV4ICAgIEluZGV4IHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSB7Q29udHJvbFBvaW50W119IG5ld1BvaW50IE5ldyBjb250cm9sIHBvaW50IHRvIHJlcGxhY2UgdGhlIGluZGV4LlxuICpcbiAqIEByZXR1cm4ge0NvbnRyb2xQb2ludFtdfSBOZXcgYXJyYXkgb2YgY29udHJvbCBwb2ludHMuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNvbnRyb2xQb2ludChwb2ludHMsIGluZGV4LCBuZXdQb2ludCkge1xuICBjb25zdCBuZXdWYWx1ZSA9IHBvaW50cy5zbGljZSgpO1xuICBuZXdWYWx1ZVtpbmRleF0gPSBuZXdQb2ludDtcbiAgcmV0dXJuIG5ld1ZhbHVlO1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiBhIGNvbnRyb2wgcG9pbnQgZnJvbSBhbiBhcnJheSBhbmQgcmV0dXJucyB0aGUgbmV3IGFycmF5LlxuICpcbiAqIEBwYXJhbSB7Q29udHJvbFBvaW50W119IHBvaW50cyAgICAgIEFycmF5IG9mIGNvbnRyb2wgcG9pbnRzLlxuICogQHBhcmFtIHtudW1iZXJ9ICAgICAgICAgaW5kZXggICAgICAgSW5kZXggdG8gdXBkYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9ICAgICAgICAgbmV3UG9zaXRpb24gUG9zaXRpb24gdG8gbW92ZSB0aGUgY29udHJvbCBwb2ludCBhdCBpbmRleC5cbiAqXG4gKiBAcmV0dXJuIHtDb250cm9sUG9pbnRbXX0gTmV3IGFycmF5IG9mIGNvbnRyb2wgcG9pbnRzLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDb250cm9sUG9pbnRQb3NpdGlvbihwb2ludHMsIGluZGV4LCBuZXdQb3NpdGlvbikge1xuICBpZiAoaXNPdmVybGFwcGluZyhwb2ludHMsIGluZGV4LCBuZXdQb3NpdGlvbikpIHtcbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgY29uc3QgbmV3UG9pbnQgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHBvaW50c1tpbmRleF0pLCB7fSwge1xuICAgIHBvc2l0aW9uOiBuZXdQb3NpdGlvblxuICB9KTtcblxuICByZXR1cm4gdXBkYXRlQ29udHJvbFBvaW50KHBvaW50cywgaW5kZXgsIG5ld1BvaW50KTtcbn1cbi8qKlxuICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgYSBjb250cm9sIHBvaW50IGZyb20gYW4gYXJyYXkgYW5kIHJldHVybnMgdGhlIG5ldyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0NvbnRyb2xQb2ludFtdfSBwb2ludHMgICBBcnJheSBvZiBjb250cm9sIHBvaW50cy5cbiAqIEBwYXJhbSB7bnVtYmVyfSAgICAgICAgIGluZGV4ICAgIEluZGV4IHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSB7Q29sb3J9ICAgICAgICAgIG5ld0NvbG9yIENvbG9yIHRvIHVwZGF0ZSB0aGUgY29udHJvbCBwb2ludCBhdCBpbmRleC5cbiAqXG4gKiBAcmV0dXJuIHtDb250cm9sUG9pbnRbXX0gTmV3IGFycmF5IG9mIGNvbnRyb2wgcG9pbnRzLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDb250cm9sUG9pbnRDb2xvcihwb2ludHMsIGluZGV4LCBuZXdDb2xvcikge1xuICBjb25zdCBuZXdQb2ludCA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcG9pbnRzW2luZGV4XSksIHt9LCB7XG4gICAgY29sb3I6IG5ld0NvbG9yXG4gIH0pO1xuXG4gIHJldHVybiB1cGRhdGVDb250cm9sUG9pbnQocG9pbnRzLCBpbmRleCwgbmV3UG9pbnQpO1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiBhIGNvbnRyb2wgcG9pbnQgZnJvbSBhbiBhcnJheSBhbmQgcmV0dXJucyB0aGUgbmV3IGFycmF5LlxuICpcbiAqIEBwYXJhbSB7Q29udHJvbFBvaW50W119IHBvaW50cyAgIEFycmF5IG9mIGNvbnRyb2wgcG9pbnRzLlxuICogQHBhcmFtIHtudW1iZXJ9ICAgICAgICAgcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIGNvbG9yIHN0b3AuXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICBuZXdDb2xvciBDb2xvciB0byB1cGRhdGUgdGhlIGNvbnRyb2wgcG9pbnQgYXQgaW5kZXguXG4gKlxuICogQHJldHVybiB7Q29udHJvbFBvaW50W119IE5ldyBhcnJheSBvZiBjb250cm9sIHBvaW50cy5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ29udHJvbFBvaW50Q29sb3JCeVBvc2l0aW9uKHBvaW50cywgcG9zaXRpb24sIG5ld0NvbG9yKSB7XG4gIGNvbnN0IGluZGV4ID0gcG9pbnRzLmZpbmRJbmRleChwb2ludCA9PiBwb2ludC5wb3NpdGlvbiA9PT0gcG9zaXRpb24pO1xuICByZXR1cm4gdXBkYXRlQ29udHJvbFBvaW50Q29sb3IocG9pbnRzLCBpbmRleCwgbmV3Q29sb3IpO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgd2hlbiBkcmFnZ2luZyBhIGNvbnRyb2wgcG9pbnQgd2l0aCB0aGUgbW91c2UuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9ICBtb3VzZVhDb29yZGluYXRlICAgICAgIEhvcml6b250YWwgY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgcG9zaXRpb24uXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRhaW5lckVsZW1lbnQgICAgICAgQ29udGFpbmVyIGZvciB0aGUgZ3JhZGllbnQgcGlja2VyLlxuICogQHBhcmFtIHtudW1iZXJ9ICBwb3NpdGlvbmVkRWxlbWVudFdpZHRoIFdpZHRoIG9mIHRoZSBwb3NpdGlvbmVkIGVsZW1lbnQuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBXaG9sZSBudW1iZXIgcGVyY2VudGFnZSBmcm9tIHRoZSBsZWZ0LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb3Jpem9udGFsUmVsYXRpdmVHcmFkaWVudFBvc2l0aW9uKG1vdXNlWENvb3JkaW5hdGUsIGNvbnRhaW5lckVsZW1lbnQsIHBvc2l0aW9uZWRFbGVtZW50V2lkdGgpIHtcbiAgaWYgKCFjb250YWluZXJFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHgsXG4gICAgd2lkdGhcbiAgfSA9IGNvbnRhaW5lckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IGFic29sdXRlUG9zaXRpb25WYWx1ZSA9IG1vdXNlWENvb3JkaW5hdGUgLSB4IC0gTUlOSU1VTV9BQlNPTFVURV9MRUZUX1BPU0lUSU9OIC0gcG9zaXRpb25lZEVsZW1lbnRXaWR0aCAvIDI7XG4gIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gd2lkdGggLSBNSU5JTVVNX0FCU09MVVRFX0xFRlRfUE9TSVRJT04gLSBJTlNFUlRfUE9JTlRfV0lEVEg7XG4gIHJldHVybiBNYXRoLnJvdW5kKGNsYW1wUGVyY2VudChhYnNvbHV0ZVBvc2l0aW9uVmFsdWUgKiAxMDAgLyBhdmFpbGFibGVXaWR0aCkpO1xufSIsImNvbnN0IF9leGNsdWRlZCA9IFtcImlzUmVuZGVyZWRJblNpZGViYXJcIl0sXG4gICAgICBfZXhjbHVkZWQyID0gW1wiaXNPcGVuXCIsIFwicG9zaXRpb25cIiwgXCJjb2xvclwiXSxcbiAgICAgIF9leGNsdWRlZDMgPSBbXCJpc1JlbmRlcmVkSW5TaWRlYmFyXCIsIFwiZ3JhZGllbnRQaWNrZXJEb21SZWZcIl07XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG4vKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7IGNvbG9yZCB9IGZyb20gJ2NvbG9yZCc7XG4vKipcbiAqIFdvcmRQcmVzcyBkZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgeyB1c2VJbnN0YW5jZUlkIH0gZnJvbSAnQHdvcmRwcmVzcy9jb21wb3NlJztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlTWVtbywgY3JlYXRlRWxlbWVudCB9IGZyb20gJ0B3b3JkcHJlc3MvZWxlbWVudCc7XG5pbXBvcnQgeyBwbHVzIH0gZnJvbSAnQHdvcmRwcmVzcy9pY29ucyc7XG5pbXBvcnQgeyBMRUZULCBSSUdIVCB9IGZyb20gJ0B3b3JkcHJlc3Mva2V5Y29kZXMnO1xuaW1wb3J0IHsgRHJvcGRvd24sIEJ1dHRvbiwgQ29sb3JQaWNrZXIgfSBmcm9tICdAd29yZHByZXNzL2NvbXBvbmVudHMnO1xuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgeyBfXywgc3ByaW50ZiB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IHsgYWRkQ29udHJvbFBvaW50LCBjbGFtcFBlcmNlbnQsIHJlbW92ZUNvbnRyb2xQb2ludCwgdXBkYXRlQ29udHJvbFBvaW50Q29sb3IsIHVwZGF0ZUNvbnRyb2xQb2ludENvbG9yQnlQb3NpdGlvbiwgdXBkYXRlQ29udHJvbFBvaW50UG9zaXRpb24sIGdldEhvcml6b250YWxSZWxhdGl2ZUdyYWRpZW50UG9zaXRpb24gfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEdSQURJRU5UX01BUktFUlNfV0lEVEgsIE1JTklNVU1fU0lHTklGSUNBTlRfTU9WRSwgS0VZQk9BUkRfQ09OVFJPTF9QT0lOVF9WQVJJQVRJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVDb2xvciB9IGZyb20gJy4uLy4uLy4uLy4uL2hlbHBlcnMvbm9ybWFsaXplLWNvbG9yJztcbmV4cG9ydCBmdW5jdGlvbiBDdXN0b21Db2xvclBpY2tlckRyb3Bkb3duKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBpc1JlbmRlcmVkSW5TaWRlYmFyXG4gIH0gPSBfcmVmLFxuICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICByZXR1cm4gY3JlYXRlRWxlbWVudChEcm9wZG93biwgX2V4dGVuZHMoe1xuICAgIGNvbnRlbnRDbGFzc05hbWU6IGNsYXNzbmFtZXMoJ2NvbXBvbmVudHMtY29sb3ItcGFsZXR0ZV9fY3VzdG9tLWNvbG9yLWRyb3Bkb3duLWNvbnRlbnQnLCB7XG4gICAgICAnaXMtcmVuZGVyZWQtaW4tc2lkZWJhcic6IGlzUmVuZGVyZWRJblNpZGViYXJcbiAgICB9KVxuICB9LCBwcm9wcykpO1xufVxuXG5mdW5jdGlvbiBDb250cm9sUG9pbnRCdXR0b24oX3JlZjIpIHtcbiAgbGV0IHtcbiAgICBpc09wZW4sXG4gICAgcG9zaXRpb24sXG4gICAgY29sb3JcbiAgfSA9IF9yZWYyLFxuICAgICAgYWRkaXRpb25hbFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBfZXhjbHVkZWQyKTtcblxuICBjb25zdCBpbnN0YW5jZUlkID0gdXNlSW5zdGFuY2VJZChDb250cm9sUG9pbnRCdXR0b24pO1xuICBjb25zdCBkZXNjcmlwdGlvbklkID0gYGNvbXBvbmVudHMtY3VzdG9tLWdyYWRpZW50LXBpY2tlcl9fY29udHJvbC1wb2ludC1idXR0b24tZGVzY3JpcHRpb24tJHtpbnN0YW5jZUlkfWA7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjcmVhdGVFbGVtZW50KEJ1dHRvbiwgX2V4dGVuZHMoe1xuICAgIFwiYXJpYS1sYWJlbFwiOiBzcHJpbnRmKCAvLyB0cmFuc2xhdG9yczogJTEkczogZ3JhZGllbnQgcG9zaXRpb24gZS5nOiA3MCwgJTIkczogZ3JhZGllbnQgY29sb3IgY29kZSBlLmc6IHJnYig1MiwxMjEsMTUxKS5cbiAgICBfXygnR3JhZGllbnQgY29udHJvbCBwb2ludCBhdCBwb3NpdGlvbiAlMSRzJSUgd2l0aCBjb2xvciBjb2RlICUyJHMuJyksIHBvc2l0aW9uLCBjb2xvciksXG4gICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IGRlc2NyaXB0aW9uSWQsXG4gICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwidHJ1ZVwiLFxuICAgIFwiYXJpYS1leHBhbmRlZFwiOiBpc09wZW4sXG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjb21wb25lbnRzLWN1c3RvbS1ncmFkaWVudC1waWNrZXJfX2NvbnRyb2wtcG9pbnQtYnV0dG9uJywge1xuICAgICAgJ2lzLWFjdGl2ZSc6IGlzT3BlblxuICAgIH0pLFxuICAgIHN0eWxlOiB7XG4gICAgICBsZWZ0OiBgJHtwb3NpdGlvbn0lYFxuICAgIH1cbiAgfSwgYWRkaXRpb25hbFByb3BzKSkpO1xufVxuXG5mdW5jdGlvbiBHcmFkaWVudENvbG9yUGlja2VyRHJvcGRvd24oX3JlZjMpIHtcbiAgbGV0IHtcbiAgICBpc1JlbmRlcmVkSW5TaWRlYmFyLFxuICAgIGdyYWRpZW50UGlja2VyRG9tUmVmXG4gIH0gPSBfcmVmMyxcbiAgICAgIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYzLCBfZXhjbHVkZWQzKTtcblxuICBjb25zdCBwb3BvdmVyUHJvcHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBjbGFzc05hbWU6ICdjb21wb25lbnRzLWN1c3RvbS1ncmFkaWVudC1waWNrZXJfX2NvbG9yLXBpY2tlci1wb3BvdmVyJyxcbiAgICAgIHBvc2l0aW9uOiAndG9wJ1xuICAgIH07XG5cbiAgICBpZiAoaXNSZW5kZXJlZEluU2lkZWJhcikge1xuICAgICAgcmVzdWx0LmFuY2hvclJlZiA9IGdyYWRpZW50UGlja2VyRG9tUmVmLmN1cnJlbnQ7XG4gICAgICByZXN1bHQucG9zaXRpb24gPSAnYm90dG9tIGxlZnQnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtncmFkaWVudFBpY2tlckRvbVJlZi5jdXJyZW50LCBpc1JlbmRlcmVkSW5TaWRlYmFyXSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KEN1c3RvbUNvbG9yUGlja2VyRHJvcGRvd24sIF9leHRlbmRzKHtcbiAgICBpc1JlbmRlcmVkSW5TaWRlYmFyOiBpc1JlbmRlcmVkSW5TaWRlYmFyLFxuICAgIHBvcG92ZXJQcm9wczogcG9wb3ZlclByb3BzXG4gIH0sIHByb3BzKSk7XG59XG5cbmZ1bmN0aW9uIENvbnRyb2xQb2ludHMoX3JlZjQpIHtcbiAgbGV0IHtcbiAgICBkaXNhYmxlUmVtb3ZlLFxuICAgIGRpc2FibGVBbHBoYSxcbiAgICBncmFkaWVudFBpY2tlckRvbVJlZixcbiAgICBpZ25vcmVNYXJrZXJQb3NpdGlvbixcbiAgICB2YWx1ZTogY29udHJvbFBvaW50cyxcbiAgICBvbkNoYW5nZSxcbiAgICBvblN0YXJ0Q29udHJvbFBvaW50Q2hhbmdlLFxuICAgIG9uU3RvcENvbnRyb2xQb2ludENoYW5nZSxcbiAgICBfX2V4cGVyaW1lbnRhbElzUmVuZGVyZWRJblNpZGViYXJcbiAgfSA9IF9yZWY0O1xuICBjb25zdCBjb250cm9sUG9pbnRNb3ZlU3RhdGUgPSB1c2VSZWYoKTtcblxuICBjb25zdCBvbk1vdXNlTW92ZSA9IGV2ZW50ID0+IHtcbiAgICBjb25zdCByZWxhdGl2ZVBvc2l0aW9uID0gZ2V0SG9yaXpvbnRhbFJlbGF0aXZlR3JhZGllbnRQb3NpdGlvbihldmVudC5jbGllbnRYLCBncmFkaWVudFBpY2tlckRvbVJlZi5jdXJyZW50LCBHUkFESUVOVF9NQVJLRVJTX1dJRFRIKTtcbiAgICBjb25zdCB7XG4gICAgICBpbml0aWFsUG9zaXRpb24sXG4gICAgICBpbmRleCxcbiAgICAgIHNpZ25pZmljYW50TW92ZUhhcHBlbmVkXG4gICAgfSA9IGNvbnRyb2xQb2ludE1vdmVTdGF0ZS5jdXJyZW50O1xuXG4gICAgaWYgKCFzaWduaWZpY2FudE1vdmVIYXBwZW5lZCAmJiBNYXRoLmFicyhpbml0aWFsUG9zaXRpb24gLSByZWxhdGl2ZVBvc2l0aW9uKSA+PSBNSU5JTVVNX1NJR05JRklDQU5UX01PVkUpIHtcbiAgICAgIGNvbnRyb2xQb2ludE1vdmVTdGF0ZS5jdXJyZW50LnNpZ25pZmljYW50TW92ZUhhcHBlbmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZSh1cGRhdGVDb250cm9sUG9pbnRQb3NpdGlvbihjb250cm9sUG9pbnRzLCBpbmRleCwgcmVsYXRpdmVQb3NpdGlvbikpO1xuICB9O1xuXG4gIGNvbnN0IGNsZWFuRXZlbnRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciAmJiBjb250cm9sUG9pbnRNb3ZlU3RhdGUuY3VycmVudCAmJiBjb250cm9sUG9pbnRNb3ZlU3RhdGUuY3VycmVudC5saXN0ZW5lcnNBY3RpdmF0ZWQpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNsZWFuRXZlbnRMaXN0ZW5lcnMpO1xuICAgICAgb25TdG9wQ29udHJvbFBvaW50Q2hhbmdlKCk7XG4gICAgICBjb250cm9sUG9pbnRNb3ZlU3RhdGUuY3VycmVudC5saXN0ZW5lcnNBY3RpdmF0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xlYW5FdmVudExpc3RlbmVycygpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGNvbnRyb2xQb2ludHMubWFwKChwb2ludCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpbml0aWFsUG9zaXRpb24gPSBwb2ludCA9PT0gbnVsbCB8fCBwb2ludCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcG9pbnQucG9zaXRpb247XG4gICAgcmV0dXJuIGlnbm9yZU1hcmtlclBvc2l0aW9uICE9PSBpbml0aWFsUG9zaXRpb24gJiYgY3JlYXRlRWxlbWVudChHcmFkaWVudENvbG9yUGlja2VyRHJvcGRvd24sIHtcbiAgICAgIGdyYWRpZW50UGlja2VyRG9tUmVmOiBncmFkaWVudFBpY2tlckRvbVJlZixcbiAgICAgIGlzUmVuZGVyZWRJblNpZGViYXI6IF9fZXhwZXJpbWVudGFsSXNSZW5kZXJlZEluU2lkZWJhcixcbiAgICAgIGtleTogaW5kZXgsXG4gICAgICBvbkNsb3NlOiBvblN0b3BDb250cm9sUG9pbnRDaGFuZ2UsXG4gICAgICByZW5kZXJUb2dnbGU6IF9yZWY1ID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBpc09wZW4sXG4gICAgICAgICAgb25Ub2dnbGVcbiAgICAgICAgfSA9IF9yZWY1O1xuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChDb250cm9sUG9pbnRCdXR0b24sIHtcbiAgICAgICAgICBrZXk6IGluZGV4LFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb250cm9sUG9pbnRNb3ZlU3RhdGUuY3VycmVudCAmJiBjb250cm9sUG9pbnRNb3ZlU3RhdGUuY3VycmVudC5zaWduaWZpY2FudE1vdmVIYXBwZW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgICAgb25TdG9wQ29udHJvbFBvaW50Q2hhbmdlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvblN0YXJ0Q29udHJvbFBvaW50Q2hhbmdlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9uVG9nZ2xlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1vdXNlRG93bjogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICBjb250cm9sUG9pbnRNb3ZlU3RhdGUuY3VycmVudCA9IHtcbiAgICAgICAgICAgICAgICBpbml0aWFsUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgc2lnbmlmaWNhbnRNb3ZlSGFwcGVuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxpc3RlbmVyc0FjdGl2YXRlZDogdHJ1ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBvblN0YXJ0Q29udHJvbFBvaW50Q2hhbmdlKCk7XG4gICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2xlYW5FdmVudExpc3RlbmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbktleURvd246IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBMRUZUKSB7XG4gICAgICAgICAgICAgIC8vIFN0b3AgcHJvcGFnYXRpb24gb2YgdGhlIGtleSBwcmVzcyBldmVudCB0byBhdm9pZCBmb2N1cyBtb3ZpbmdcbiAgICAgICAgICAgICAgLy8gdG8gYW5vdGhlciBlZGl0b3IgYXJlYS5cbiAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIG9uQ2hhbmdlKHVwZGF0ZUNvbnRyb2xQb2ludFBvc2l0aW9uKGNvbnRyb2xQb2ludHMsIGluZGV4LCBjbGFtcFBlcmNlbnQocG9pbnQucG9zaXRpb24gLSBLRVlCT0FSRF9DT05UUk9MX1BPSU5UX1ZBUklBVElPTikpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gUklHSFQpIHtcbiAgICAgICAgICAgICAgLy8gU3RvcCBwcm9wYWdhdGlvbiBvZiB0aGUga2V5IHByZXNzIGV2ZW50IHRvIGF2b2lkIGZvY3VzIG1vdmluZ1xuICAgICAgICAgICAgICAvLyB0byBhbm90aGVyIGVkaXRvciBhcmVhLlxuICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgb25DaGFuZ2UodXBkYXRlQ29udHJvbFBvaW50UG9zaXRpb24oY29udHJvbFBvaW50cywgaW5kZXgsIGNsYW1wUGVyY2VudChwb2ludC5wb3NpdGlvbiArIEtFWUJPQVJEX0NPTlRST0xfUE9JTlRfVkFSSUFUSU9OKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaXNPcGVuOiBpc09wZW4sXG4gICAgICAgICAgcG9zaXRpb246IHBvaW50LnBvc2l0aW9uLFxuICAgICAgICAgIGNvbG9yOiBwb2ludC5jb2xvclxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICByZW5kZXJDb250ZW50OiBfcmVmNiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgb25DbG9zZVxuICAgICAgICB9ID0gX3JlZjY7XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IHdwLmNvbXBvbmVudHMuR3JhZGllbnRQaWNrZXIgPyAnY3QtZ3V0ZW5iZXJnLWNvbG9yLXBpY2tlci1uZXcnIDogJ2N0LWd1dGVuYmVyZy1jb2xvci1waWNrZXInXG4gICAgICAgIH0sIGNyZWF0ZUVsZW1lbnQoQ29sb3JQaWNrZXIsIF9leHRlbmRzKHtcbiAgICAgICAgICBlbmFibGVBbHBoYTogIWRpc2FibGVBbHBoYSxcbiAgICAgICAgICBjb2xvcjogcG9pbnQuY29sb3JcbiAgICAgICAgfSwgd3AuY29tcG9uZW50cy5HcmFkaWVudFBpY2tlciA/IHtcbiAgICAgICAgICBvbkNoYW5nZTogY29sb3IgPT4ge1xuICAgICAgICAgICAgb25DaGFuZ2UodXBkYXRlQ29udHJvbFBvaW50Q29sb3IoY29udHJvbFBvaW50cywgaW5kZXgsIG5vcm1hbGl6ZUNvbG9yKGNvbG9yKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSA6IHtcbiAgICAgICAgICBvbkNoYW5nZUNvbXBsZXRlOiByZXN1bHQgPT4ge1xuICAgICAgICAgICAgb25DaGFuZ2UodXBkYXRlQ29udHJvbFBvaW50Q29sb3IoY29udHJvbFBvaW50cywgaW5kZXgsIHJlc3VsdC5yZ2IuYSA9PT0gMSA/IHJlc3VsdC5oZXggOiBgcmdiYSgke3Jlc3VsdC5yZ2Iucn0sICR7cmVzdWx0LnJnYi5nfSwgJHtyZXN1bHQucmdiLmJ9LCAke3Jlc3VsdC5yZ2IuYX0pYCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiY3QtY29sb3ItcGlja2VyLXZhbHVlXCJcbiAgICAgICAgfSwgY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB2YWx1ZTogbm9ybWFsaXplQ29sb3IocG9pbnQuY29sb3IpLFxuICAgICAgICAgIG9uQ2hhbmdlOiBlID0+IHtcbiAgICAgICAgICAgIG9uQ2hhbmdlKHVwZGF0ZUNvbnRyb2xQb2ludENvbG9yKGNvbnRyb2xQb2ludHMsIGluZGV4LCBub3JtYWxpemVDb2xvcihlLnRhcmdldC52YWx1ZSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKSksICFkaXNhYmxlUmVtb3ZlICYmIGNvbnRyb2xQb2ludHMubGVuZ3RoID4gMiAmJiBjcmVhdGVFbGVtZW50KEJ1dHRvbiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJjb21wb25lbnRzLWN1c3RvbS1ncmFkaWVudC1waWNrZXJfX3JlbW92ZS1jb250cm9sLXBvaW50XCIsXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgb25DaGFuZ2UocmVtb3ZlQ29udHJvbFBvaW50KGNvbnRyb2xQb2ludHMsIGluZGV4KSk7XG4gICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YXJpYW50OiBcImxpbmtcIlxuICAgICAgICB9LCBfXygnUmVtb3ZlIENvbnRyb2wgUG9pbnQnKSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gSW5zZXJ0UG9pbnQoX3JlZjcpIHtcbiAgbGV0IHtcbiAgICB2YWx1ZTogY29udHJvbFBvaW50cyxcbiAgICBvbkNoYW5nZSxcbiAgICBvbk9wZW5JbnNlcnRlcixcbiAgICBvbkNsb3NlSW5zZXJ0ZXIsXG4gICAgaW5zZXJ0UG9zaXRpb24sXG4gICAgZGlzYWJsZUFscGhhLFxuICAgIF9fZXhwZXJpbWVudGFsSXNSZW5kZXJlZEluU2lkZWJhcixcbiAgICBncmFkaWVudFBpY2tlckRvbVJlZlxuICB9ID0gX3JlZjc7XG4gIGNvbnN0IFthbHJlYWR5SW5zZXJ0ZWRQb2ludCwgc2V0QWxyZWFkeUluc2VydGVkUG9pbnRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaW5zZXJ0ZWRDb2xvciwgc2V0SW5zZXJ0ZWRDb2xvcl0gPSB1c2VTdGF0ZSgnI2ZmZicpO1xuICByZXR1cm4gY3JlYXRlRWxlbWVudChHcmFkaWVudENvbG9yUGlja2VyRHJvcGRvd24sIHtcbiAgICBncmFkaWVudFBpY2tlckRvbVJlZjogZ3JhZGllbnRQaWNrZXJEb21SZWYsXG4gICAgaXNSZW5kZXJlZEluU2lkZWJhcjogX19leHBlcmltZW50YWxJc1JlbmRlcmVkSW5TaWRlYmFyLFxuICAgIGNsYXNzTmFtZTogXCJjb21wb25lbnRzLWN1c3RvbS1ncmFkaWVudC1waWNrZXJfX2luc2VydGVyXCIsXG4gICAgb25DbG9zZTogKCkgPT4ge1xuICAgICAgb25DbG9zZUluc2VydGVyKCk7XG4gICAgfSxcbiAgICByZW5kZXJUb2dnbGU6IF9yZWY4ID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIGlzT3BlbixcbiAgICAgICAgb25Ub2dnbGVcbiAgICAgIH0gPSBfcmVmODtcbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KEJ1dHRvbiwge1xuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogaXNPcGVuLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJ0cnVlXCIsXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgICAgICBvbkNsb3NlSW5zZXJ0ZXIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0QWxyZWFkeUluc2VydGVkUG9pbnQoZmFsc2UpO1xuICAgICAgICAgICAgb25PcGVuSW5zZXJ0ZXIoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvblRvZ2dsZSgpO1xuICAgICAgICB9LFxuICAgICAgICBjbGFzc05hbWU6IFwiY29tcG9uZW50cy1jdXN0b20tZ3JhZGllbnQtcGlja2VyX19pbnNlcnQtcG9pbnRcIixcbiAgICAgICAgaWNvbjogcGx1cyxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBsZWZ0OiBpbnNlcnRQb3NpdGlvbiAhPT0gbnVsbCA/IGAke2luc2VydFBvc2l0aW9ufSVgIDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVuZGVyQ29udGVudDogKCkgPT4gY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IHdwLmNvbXBvbmVudHMuR3JhZGllbnRQaWNrZXIgPyAnY3QtZ3V0ZW5iZXJnLWNvbG9yLXBpY2tlci1uZXcnIDogJ2N0LWd1dGVuYmVyZy1jb2xvci1waWNrZXInXG4gICAgfSwgY3JlYXRlRWxlbWVudChDb2xvclBpY2tlciwgX2V4dGVuZHMoe1xuICAgICAgZW5hYmxlQWxwaGE6ICFkaXNhYmxlQWxwaGEsXG4gICAgICBjb2xvcjogaW5zZXJ0ZWRDb2xvclxuICAgIH0sIHdwLmNvbXBvbmVudHMuR3JhZGllbnRQaWNrZXIgPyB7XG4gICAgICBvbkNoYW5nZTogY29sb3IgPT4ge1xuICAgICAgICBpZiAoIWFscmVhZHlJbnNlcnRlZFBvaW50KSB7XG4gICAgICAgICAgb25DaGFuZ2UoYWRkQ29udHJvbFBvaW50KGNvbnRyb2xQb2ludHMsIGluc2VydFBvc2l0aW9uLCBub3JtYWxpemVDb2xvcihjb2xvcikpKTtcbiAgICAgICAgICBzZXRBbHJlYWR5SW5zZXJ0ZWRQb2ludCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbkNoYW5nZSh1cGRhdGVDb250cm9sUG9pbnRDb2xvckJ5UG9zaXRpb24oY29udHJvbFBvaW50cywgaW5zZXJ0UG9zaXRpb24sIG5vcm1hbGl6ZUNvbG9yKGNvbG9yKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0SW5zZXJ0ZWRDb2xvcihjb2xvcik7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIG9uQ2hhbmdlQ29tcGxldGU6IHJlc3VsdCA9PiB7XG4gICAgICAgIGlmICghYWxyZWFkeUluc2VydGVkUG9pbnQpIHtcbiAgICAgICAgICBvbkNoYW5nZShhZGRDb250cm9sUG9pbnQoY29udHJvbFBvaW50cywgaW5zZXJ0UG9zaXRpb24sIHJlc3VsdC5yZ2IuYSA9PT0gMSA/IHJlc3VsdC5oZXggOiBgcmdiYSgke3Jlc3VsdC5yZ2Iucn0sICR7cmVzdWx0LnJnYi5nfSwgJHtyZXN1bHQucmdiLmJ9LCAke3Jlc3VsdC5yZ2IuYX0pYCkpO1xuICAgICAgICAgIHNldEFscmVhZHlJbnNlcnRlZFBvaW50KHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uQ2hhbmdlKHVwZGF0ZUNvbnRyb2xQb2ludENvbG9yQnlQb3NpdGlvbihjb250cm9sUG9pbnRzLCBpbnNlcnRQb3NpdGlvbiwgcmVzdWx0LnJnYi5hID09PSAxID8gcmVzdWx0LmhleCA6IGByZ2JhKCR7cmVzdWx0LnJnYi5yfSwgJHtyZXN1bHQucmdiLmd9LCAke3Jlc3VsdC5yZ2IuYn0sICR7cmVzdWx0LnJnYi5hfSlgKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRJbnNlcnRlZENvbG9yKHJlc3VsdC5yZ2IuYSA9PT0gMSA/IHJlc3VsdC5oZXggOiBgcmdiYSgke3Jlc3VsdC5yZ2Iucn0sICR7cmVzdWx0LnJnYi5nfSwgJHtyZXN1bHQucmdiLmJ9LCAke3Jlc3VsdC5yZ2IuYX0pYCk7XG4gICAgICB9XG4gICAgfSkpLCBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJjdC1jb2xvci1waWNrZXItdmFsdWVcIlxuICAgIH0sIGNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7XG4gICAgICB2YWx1ZTogbm9ybWFsaXplQ29sb3IoaW5zZXJ0ZWRDb2xvciksXG4gICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIG9uQ2hhbmdlOiBfcmVmOSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICB2YWx1ZTogY29sb3JcbiAgICAgICAgICB9XG4gICAgICAgIH0gPSBfcmVmOTtcblxuICAgICAgICBpZiAoIWFscmVhZHlJbnNlcnRlZFBvaW50KSB7XG4gICAgICAgICAgb25DaGFuZ2UoYWRkQ29udHJvbFBvaW50KGNvbnRyb2xQb2ludHMsIGluc2VydFBvc2l0aW9uLCBub3JtYWxpemVDb2xvcihjb2xvcikpKTtcbiAgICAgICAgICBzZXRBbHJlYWR5SW5zZXJ0ZWRQb2ludCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbkNoYW5nZSh1cGRhdGVDb250cm9sUG9pbnRDb2xvckJ5UG9zaXRpb24oY29udHJvbFBvaW50cywgaW5zZXJ0UG9zaXRpb24sIG5vcm1hbGl6ZUNvbG9yKGNvbG9yKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0SW5zZXJ0ZWRDb2xvcihjb2xvcik7XG4gICAgICB9XG4gICAgfSkpKVxuICB9KTtcbn1cblxuQ29udHJvbFBvaW50cy5JbnNlcnRQb2ludCA9IEluc2VydFBvaW50O1xuZXhwb3J0IGRlZmF1bHQgQ29udHJvbFBvaW50czsiLCJpbXBvcnQgX3NvbWUgZnJvbSBcImxvZGFzaC9zb21lXCI7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50Jztcbi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cblxuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG4vKipcbiAqIFdvcmRQcmVzcyBkZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgeyB1c2VSZWYsIHVzZVJlZHVjZXIgfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgQ29udHJvbFBvaW50cyBmcm9tICcuL2NvbnRyb2wtcG9pbnRzJztcbmltcG9ydCB7IGdldEhvcml6b250YWxSZWxhdGl2ZUdyYWRpZW50UG9zaXRpb24gfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IElOU0VSVF9QT0lOVF9XSURUSCwgTUlOSU1VTV9ESVNUQU5DRV9CRVRXRUVOX0lOU0VSVEVSX0FORF9QT0lOVCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZnVuY3Rpb24gY3VzdG9tR3JhZGllbnRCYXJSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ01PVkVfSU5TRVJURVInOlxuICAgICAgaWYgKHN0YXRlLmlkID09PSAnSURMRScgfHwgc3RhdGUuaWQgPT09ICdNT1ZJTkdfSU5TRVJURVInKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6ICdNT1ZJTkdfSU5TRVJURVInLFxuICAgICAgICAgIGluc2VydFBvc2l0aW9uOiBhY3Rpb24uaW5zZXJ0UG9zaXRpb25cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdTVE9QX0lOU0VSVEVSX01PVkUnOlxuICAgICAgaWYgKHN0YXRlLmlkID09PSAnTU9WSU5HX0lOU0VSVEVSJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiAnSURMRSdcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdPUEVOX0lOU0VSVEVSJzpcbiAgICAgIGlmIChzdGF0ZS5pZCA9PT0gJ01PVklOR19JTlNFUlRFUicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogJ0lOU0VSVElOR19DT05UUk9MX1BPSU5UJyxcbiAgICAgICAgICBpbnNlcnRQb3NpdGlvbjogc3RhdGUuaW5zZXJ0UG9zaXRpb25cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdDTE9TRV9JTlNFUlRFUic6XG4gICAgICBpZiAoc3RhdGUuaWQgPT09ICdJTlNFUlRJTkdfQ09OVFJPTF9QT0lOVCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogJ0lETEUnXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnU1RBUlRfQ09OVFJPTF9DSEFOR0UnOlxuICAgICAgaWYgKHN0YXRlLmlkID09PSAnSURMRScpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogJ01PVklOR19DT05UUk9MX1BPSU5UJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ1NUT1BfQ09OVFJPTF9DSEFOR0UnOlxuICAgICAgaWYgKHN0YXRlLmlkID09PSAnTU9WSU5HX0NPTlRST0xfUE9JTlQnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6ICdJRExFJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuY29uc3QgY3VzdG9tR3JhZGllbnRCYXJSZWR1Y2VySW5pdGlhbFN0YXRlID0ge1xuICBpZDogJ0lETEUnXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ3VzdG9tR3JhZGllbnRCYXIoX3JlZikge1xuICBsZXQge1xuICAgIGJhY2tncm91bmQsXG4gICAgaGFzR3JhZGllbnQsXG4gICAgdmFsdWU6IGNvbnRyb2xQb2ludHMsXG4gICAgb25DaGFuZ2UsXG4gICAgZGlzYWJsZUluc2VydGVyID0gZmFsc2UsXG4gICAgZGlzYWJsZUFscGhhID0gZmFsc2UsXG4gICAgX19leHBlcmltZW50YWxJc1JlbmRlcmVkSW5TaWRlYmFyXG4gIH0gPSBfcmVmO1xuICBjb25zdCBncmFkaWVudFBpY2tlckRvbVJlZiA9IHVzZVJlZigpO1xuICBjb25zdCBbZ3JhZGllbnRCYXJTdGF0ZSwgZ3JhZGllbnRCYXJTdGF0ZURpc3BhdGNoXSA9IHVzZVJlZHVjZXIoY3VzdG9tR3JhZGllbnRCYXJSZWR1Y2VyLCBjdXN0b21HcmFkaWVudEJhclJlZHVjZXJJbml0aWFsU3RhdGUpO1xuXG4gIGNvbnN0IG9uTW91c2VFbnRlckFuZE1vdmUgPSBldmVudCA9PiB7XG4gICAgY29uc3QgaW5zZXJ0UG9zaXRpb24gPSBnZXRIb3Jpem9udGFsUmVsYXRpdmVHcmFkaWVudFBvc2l0aW9uKGV2ZW50LmNsaWVudFgsIGdyYWRpZW50UGlja2VyRG9tUmVmLmN1cnJlbnQsIElOU0VSVF9QT0lOVF9XSURUSCk7IC8vIElmIHRoZSBpbnNlcnQgcG9pbnQgaXMgY2xvc2UgdG8gYW4gZXhpc3RpbmcgY29udHJvbCBwb2ludCBkb24ndCBzaG93IGl0LlxuXG4gICAgaWYgKF9zb21lKGNvbnRyb2xQb2ludHMsIF9yZWYyID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIHBvc2l0aW9uXG4gICAgICB9ID0gX3JlZjI7XG4gICAgICByZXR1cm4gTWF0aC5hYnMoaW5zZXJ0UG9zaXRpb24gLSBwb3NpdGlvbikgPCBNSU5JTVVNX0RJU1RBTkNFX0JFVFdFRU5fSU5TRVJURVJfQU5EX1BPSU5UO1xuICAgIH0pKSB7XG4gICAgICBpZiAoZ3JhZGllbnRCYXJTdGF0ZS5pZCA9PT0gJ01PVklOR19JTlNFUlRFUicpIHtcbiAgICAgICAgZ3JhZGllbnRCYXJTdGF0ZURpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiAnU1RPUF9JTlNFUlRFUl9NT1ZFJ1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdyYWRpZW50QmFyU3RhdGVEaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnTU9WRV9JTlNFUlRFUicsXG4gICAgICBpbnNlcnRQb3NpdGlvblxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IG9uTW91c2VMZWF2ZSA9ICgpID0+IHtcbiAgICBncmFkaWVudEJhclN0YXRlRGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NUT1BfSU5TRVJURVJfTU9WRSdcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBpc01vdmluZ0luc2VydGVyID0gZ3JhZGllbnRCYXJTdGF0ZS5pZCA9PT0gJ01PVklOR19JTlNFUlRFUic7XG4gIGNvbnN0IGlzSW5zZXJ0aW5nQ29udHJvbFBvaW50ID0gZ3JhZGllbnRCYXJTdGF0ZS5pZCA9PT0gJ0lOU0VSVElOR19DT05UUk9MX1BPSU5UJztcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogZ3JhZGllbnRQaWNrZXJEb21SZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc25hbWVzKCdjb21wb25lbnRzLWN1c3RvbS1ncmFkaWVudC1waWNrZXJfX2dyYWRpZW50LWJhcicsIHtcbiAgICAgICdoYXMtZ3JhZGllbnQnOiBoYXNHcmFkaWVudFxuICAgIH0pLFxuICAgIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVyQW5kTW92ZSxcbiAgICBvbk1vdXNlTW92ZTogb25Nb3VzZUVudGVyQW5kTW92ZSxcbiAgICBzdHlsZToge1xuICAgICAgYmFja2dyb3VuZFxuICAgIH0sXG4gICAgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmVcbiAgfSwgY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImNvbXBvbmVudHMtY3VzdG9tLWdyYWRpZW50LXBpY2tlcl9fbWFya2Vycy1jb250YWluZXJcIlxuICB9LCAhZGlzYWJsZUluc2VydGVyICYmIChpc01vdmluZ0luc2VydGVyIHx8IGlzSW5zZXJ0aW5nQ29udHJvbFBvaW50KSAmJiBjcmVhdGVFbGVtZW50KENvbnRyb2xQb2ludHMuSW5zZXJ0UG9pbnQsIHtcbiAgICBfX2V4cGVyaW1lbnRhbElzUmVuZGVyZWRJblNpZGViYXI6IF9fZXhwZXJpbWVudGFsSXNSZW5kZXJlZEluU2lkZWJhcixcbiAgICBncmFkaWVudFBpY2tlckRvbVJlZjogZ3JhZGllbnRQaWNrZXJEb21SZWYsXG4gICAgZGlzYWJsZUFscGhhOiBkaXNhYmxlQWxwaGEsXG4gICAgaW5zZXJ0UG9zaXRpb246IGdyYWRpZW50QmFyU3RhdGUuaW5zZXJ0UG9zaXRpb24sXG4gICAgdmFsdWU6IGNvbnRyb2xQb2ludHMsXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgIG9uT3Blbkluc2VydGVyOiAoKSA9PiB7XG4gICAgICBncmFkaWVudEJhclN0YXRlRGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnT1BFTl9JTlNFUlRFUidcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb25DbG9zZUluc2VydGVyOiAoKSA9PiB7XG4gICAgICBncmFkaWVudEJhclN0YXRlRGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnQ0xPU0VfSU5TRVJURVInXG4gICAgICB9KTtcbiAgICB9XG4gIH0pLCBjcmVhdGVFbGVtZW50KENvbnRyb2xQb2ludHMsIHtcbiAgICBfX2V4cGVyaW1lbnRhbElzUmVuZGVyZWRJblNpZGViYXI6IF9fZXhwZXJpbWVudGFsSXNSZW5kZXJlZEluU2lkZWJhcixcbiAgICBkaXNhYmxlQWxwaGE6IGRpc2FibGVBbHBoYSxcbiAgICBkaXNhYmxlUmVtb3ZlOiBkaXNhYmxlSW5zZXJ0ZXIsXG4gICAgZ3JhZGllbnRQaWNrZXJEb21SZWY6IGdyYWRpZW50UGlja2VyRG9tUmVmLFxuICAgIGlnbm9yZU1hcmtlclBvc2l0aW9uOiBpc0luc2VydGluZ0NvbnRyb2xQb2ludCA/IGdyYWRpZW50QmFyU3RhdGUuaW5zZXJ0UG9zaXRpb24gOiB1bmRlZmluZWQsXG4gICAgdmFsdWU6IGNvbnRyb2xQb2ludHMsXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgIG9uU3RhcnRDb250cm9sUG9pbnRDaGFuZ2U6ICgpID0+IHtcbiAgICAgIGdyYWRpZW50QmFyU3RhdGVEaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6ICdTVEFSVF9DT05UUk9MX0NIQU5HRSdcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgb25TdG9wQ29udHJvbFBvaW50Q2hhbmdlOiAoKSA9PiB7XG4gICAgICBncmFkaWVudEJhclN0YXRlRGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnU1RPUF9DT05UUk9MX0NIQU5HRSdcbiAgICAgIH0pO1xuICAgIH1cbiAgfSkpKTtcbn0iLCIvKipcbiAqIFdvcmRQcmVzcyBkZXBlbmRlbmNpZXNcbiAqL1xuaW1wb3J0IHsgX18gfSBmcm9tICdjdC1pMThuJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX0dSQURJRU5UID0gJ2xpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoNiwgMTQ3LCAyMjcsIDEpIDAlLCByZ2IoMTU1LCA4MSwgMjI0KSAxMDAlKSc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9MSU5FQVJfR1JBRElFTlRfQU5HTEUgPSAxODA7XG5leHBvcnQgY29uc3QgSE9SSVpPTlRBTF9HUkFESUVOVF9PUklFTlRBVElPTiA9IHtcbiAgdHlwZTogJ2FuZ3VsYXInLFxuICB2YWx1ZTogOTBcbn07XG5leHBvcnQgY29uc3QgR1JBRElFTlRfT1BUSU9OUyA9IFt7XG4gIHZhbHVlOiAnbGluZWFyLWdyYWRpZW50JyxcbiAgbGFiZWw6IF9fKCdMaW5lYXInLCAnYmxvY2tzeScpXG59LCB7XG4gIHZhbHVlOiAncmFkaWFsLWdyYWRpZW50JyxcbiAgbGFiZWw6IF9fKCdSYWRpYWwnLCAnYmxvY2tzeScpXG59XTtcbmV4cG9ydCBjb25zdCBESVJFQ1RJT05BTF9PUklFTlRBVElPTl9BTkdMRV9NQVAgPSB7XG4gIHRvcDogMCxcbiAgJ3RvcCByaWdodCc6IDQ1LFxuICAncmlnaHQgdG9wJzogNDUsXG4gIHJpZ2h0OiA5MCxcbiAgJ3JpZ2h0IGJvdHRvbSc6IDEzNSxcbiAgJ2JvdHRvbSByaWdodCc6IDEzNSxcbiAgYm90dG9tOiAxODAsXG4gICdib3R0b20gbGVmdCc6IDIyNSxcbiAgJ2xlZnQgYm90dG9tJzogMjI1LFxuICBsZWZ0OiAyNzAsXG4gICd0b3AgbGVmdCc6IDMxNSxcbiAgJ2xlZnQgdG9wJzogMzE1XG59OyIsImltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gvZ2V0XCI7XG5pbXBvcnQgX2NvbXBhY3QgZnJvbSBcImxvZGFzaC9jb21wYWN0XCI7XG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplR3JhZGllbnRDb2xvcihfcmVmKSB7XG4gIGxldCB7XG4gICAgdHlwZSxcbiAgICB2YWx1ZVxuICB9ID0gX3JlZjtcblxuICBpZiAodHlwZSA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdoZXgnKSB7XG4gICAgcmV0dXJuIGAjJHt2YWx1ZX1gO1xuICB9XG5cbiAgcmV0dXJuIGAke3R5cGV9KCR7dmFsdWUuam9pbignLCcpfSlgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUdyYWRpZW50UG9zaXRpb24ocG9zaXRpb24pIHtcbiAgaWYgKCFwb3NpdGlvbikge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB2YWx1ZSxcbiAgICB0eXBlXG4gIH0gPSBwb3NpdGlvbjtcbiAgcmV0dXJuIGAke3ZhbHVlfSR7dHlwZX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUdyYWRpZW50Q29sb3JTdG9wKF9yZWYyKSB7XG4gIGxldCB7XG4gICAgdHlwZSxcbiAgICB2YWx1ZSxcbiAgICBsZW5ndGhcbiAgfSA9IF9yZWYyO1xuICByZXR1cm4gYCR7c2VyaWFsaXplR3JhZGllbnRDb2xvcih7XG4gICAgdHlwZSxcbiAgICB2YWx1ZVxuICB9KX0gJHtzZXJpYWxpemVHcmFkaWVudFBvc2l0aW9uKGxlbmd0aCl9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVHcmFkaWVudE9yaWVudGF0aW9uKG9yaWVudGF0aW9uKSB7XG4gIGlmICghb3JpZW50YXRpb24gfHwgb3JpZW50YXRpb24udHlwZSAhPT0gJ2FuZ3VsYXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGAke29yaWVudGF0aW9uLnZhbHVlfWRlZ2A7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplR3JhZGllbnQoX3JlZjMpIHtcbiAgbGV0IHtcbiAgICB0eXBlLFxuICAgIG9yaWVudGF0aW9uLFxuICAgIGNvbG9yU3RvcHNcbiAgfSA9IF9yZWYzO1xuICBjb25zdCBzZXJpYWxpemVkT3JpZW50YXRpb24gPSBzZXJpYWxpemVHcmFkaWVudE9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTtcbiAgY29uc3Qgc2VyaWFsaXplZENvbG9yU3RvcHMgPSBjb2xvclN0b3BzLnNvcnQoKGNvbG9yU3RvcDEsIGNvbG9yU3RvcDIpID0+IHtcbiAgICByZXR1cm4gX2dldChjb2xvclN0b3AxLCBbJ2xlbmd0aCcsICd2YWx1ZSddLCAwKSAtIF9nZXQoY29sb3JTdG9wMiwgWydsZW5ndGgnLCAndmFsdWUnXSwgMCk7XG4gIH0pLm1hcChzZXJpYWxpemVHcmFkaWVudENvbG9yU3RvcCk7XG4gIHJldHVybiBgJHt0eXBlfSgke19jb21wYWN0KFtzZXJpYWxpemVkT3JpZW50YXRpb24sIC4uLnNlcmlhbGl6ZWRDb2xvclN0b3BzXSkuam9pbignLCcpfSlgO1xufSIsImZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCBncmFkaWVudFBhcnNlciBmcm9tICdncmFkaWVudC1wYXJzZXInO1xuaW1wb3J0IHsgY29sb3JkLCBleHRlbmQgfSBmcm9tICdjb2xvcmQnO1xuaW1wb3J0IG5hbWVzUGx1Z2luIGZyb20gJ2NvbG9yZC9wbHVnaW5zL25hbWVzJztcbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cblxuaW1wb3J0IHsgREVGQVVMVF9HUkFESUVOVCwgSE9SSVpPTlRBTF9HUkFESUVOVF9PUklFTlRBVElPTiwgRElSRUNUSU9OQUxfT1JJRU5UQVRJT05fQU5HTEVfTUFQIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgc2VyaWFsaXplR3JhZGllbnQgfSBmcm9tICcuL3NlcmlhbGl6ZXInO1xuZXh0ZW5kKFtuYW1lc1BsdWdpbl0pO1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVhckdyYWRpZW50UmVwcmVzZW50YXRpb24oZ3JhZGllbnRBU1QpIHtcbiAgcmV0dXJuIHNlcmlhbGl6ZUdyYWRpZW50KHtcbiAgICB0eXBlOiAnbGluZWFyLWdyYWRpZW50JyxcbiAgICBvcmllbnRhdGlvbjogSE9SSVpPTlRBTF9HUkFESUVOVF9PUklFTlRBVElPTixcbiAgICBjb2xvclN0b3BzOiBncmFkaWVudEFTVC5jb2xvclN0b3BzXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoYXNVbnN1cHBvcnRlZExlbmd0aChpdGVtKSB7XG4gIHJldHVybiBpdGVtLmxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGl0ZW0ubGVuZ3RoLnR5cGUgIT09ICclJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdyYWRpZW50QXN0V2l0aERlZmF1bHQodmFsdWUpIHtcbiAgdmFyIF9ncmFkaWVudEFTVCRvcmllbnRhdDtcblxuICAvLyBncmFkaWVudEFTVCB3aWxsIGNvbnRhaW4gdGhlIGdyYWRpZW50IEFTVCBhcyBwYXJzZWQgYnkgZ3JhZGllbnQtcGFyc2VyIG5wbSBtb2R1bGUuXG4gIC8vIE1vcmUgaW5mb3JtYXRpb24gb2YgaXRzIHN0cnVjdHVyZSBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZ3JhZGllbnQtcGFyc2VyI2FzdC5cbiAgbGV0IGdyYWRpZW50QVNUO1xuICBsZXQgdGVtcG9yYXJ5SW52YWxpZFZhbHVlID0gdmFsdWUubWF0Y2goL1xcfiguKilcXH4vLCAnJyk7XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFx+LipcXH4vLCAncmdiKDUwMCwgNTAwLCA1MDApJyk7XG5cbiAgdHJ5IHtcbiAgICBncmFkaWVudEFTVCA9IGdyYWRpZW50UGFyc2VyLnBhcnNlKHZhbHVlKVswXTtcbiAgICBncmFkaWVudEFTVC52YWx1ZSA9IHZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGdyYWRpZW50QVNUID0gZ3JhZGllbnRQYXJzZXIucGFyc2UoREVGQVVMVF9HUkFESUVOVClbMF07XG4gICAgZ3JhZGllbnRBU1QudmFsdWUgPSBERUZBVUxUX0dSQURJRU5UO1xuICB9XG5cbiAgaWYgKCgoX2dyYWRpZW50QVNUJG9yaWVudGF0ID0gZ3JhZGllbnRBU1Qub3JpZW50YXRpb24pID09PSBudWxsIHx8IF9ncmFkaWVudEFTVCRvcmllbnRhdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dyYWRpZW50QVNUJG9yaWVudGF0LnR5cGUpID09PSAnZGlyZWN0aW9uYWwnKSB7XG4gICAgZ3JhZGllbnRBU1Qub3JpZW50YXRpb24udHlwZSA9ICdhbmd1bGFyJztcbiAgICBncmFkaWVudEFTVC5vcmllbnRhdGlvbi52YWx1ZSA9IERJUkVDVElPTkFMX09SSUVOVEFUSU9OX0FOR0xFX01BUFtncmFkaWVudEFTVC5vcmllbnRhdGlvbi52YWx1ZV0udG9TdHJpbmcoKTtcbiAgfVxuXG4gIGlmIChncmFkaWVudEFTVC5jb2xvclN0b3BzLnNvbWUoaGFzVW5zdXBwb3J0ZWRMZW5ndGgpKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29sb3JTdG9wc1xuICAgIH0gPSBncmFkaWVudEFTVDtcbiAgICBjb25zdCBzdGVwID0gMTAwIC8gKGNvbG9yU3RvcHMubGVuZ3RoIC0gMSk7XG4gICAgY29sb3JTdG9wcy5mb3JFYWNoKChzdG9wLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHN0b3AudmFsdWVbMF0gPT09ICc1MDAnKSB7XG4gICAgICAgIHN0b3AudHlwZSA9ICdsaXRlcmFsJztcbiAgICAgICAgc3RvcC52YWx1ZSA9ICcnO1xuICAgICAgfVxuXG4gICAgICBzdG9wLmxlbmd0aCA9IHtcbiAgICAgICAgdmFsdWU6IHN0ZXAgKiBpbmRleCxcbiAgICAgICAgdHlwZTogJyUnXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGdyYWRpZW50QVNULnZhbHVlID0gc2VyaWFsaXplR3JhZGllbnQoZ3JhZGllbnRBU1QpO1xuICB9XG5cbiAgZ3JhZGllbnRBU1QuY29sb3JTdG9wcy5mb3JFYWNoKChzdG9wLCBpbmRleCkgPT4ge1xuICAgIGlmIChzdG9wLnZhbHVlWzBdID09PSAnNTAwJyAmJiB0ZW1wb3JhcnlJbnZhbGlkVmFsdWUpIHtcbiAgICAgIHN0b3AudHlwZSA9ICdsaXRlcmFsJztcbiAgICAgIHN0b3AudmFsdWUgPSB0ZW1wb3JhcnlJbnZhbGlkVmFsdWVbMV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGdyYWRpZW50QVNUO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEdyYWRpZW50QXN0V2l0aENvbnRyb2xQb2ludHMoZ3JhZGllbnRBU1QsIG5ld0NvbnRyb2xQb2ludHMpIHtcbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ3JhZGllbnRBU1QpLCB7fSwge1xuICAgIGNvbG9yU3RvcHM6IG5ld0NvbnRyb2xQb2ludHMubWFwKF9yZWYgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgcG9zaXRpb24sXG4gICAgICAgIGNvbG9yXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIGxldCBwYXJzZWRDb2xvciA9IGNvbG9yZChjb2xvcik7XG4gICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICBsZW5ndGg6IHtcbiAgICAgICAgICB0eXBlOiAnJScsXG4gICAgICAgICAgdmFsdWU6IHBvc2l0aW9uLnRvU3RyaW5nKClcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogJ2xpdGVyYWwnLFxuICAgICAgICB2YWx1ZTogYH4ke2NvbG9yfX5gXG4gICAgICB9O1xuXG4gICAgICBpZiAocGFyc2VkQ29sb3IucGFyc2VkKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICByLFxuICAgICAgICAgIGcsXG4gICAgICAgICAgYixcbiAgICAgICAgICBhXG4gICAgICAgIH0gPSBwYXJzZWRDb2xvci50b1JnYigpO1xuICAgICAgICByZXN1bHQudHlwZSA9IGEgPCAxID8gJ3JnYmEnIDogJ3JnYic7XG4gICAgICAgIHJlc3VsdC52YWx1ZSA9IGEgPCAxID8gW3IsIGcsIGIsIGFdIDogW3IsIGcsIGJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pXG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3BDc3NDb2xvcihjb2xvclN0b3ApIHtcbiAgc3dpdGNoIChjb2xvclN0b3AudHlwZSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgICByZXR1cm4gYCMke2NvbG9yU3RvcC52YWx1ZX1gO1xuXG4gICAgY2FzZSAnbGl0ZXJhbCc6XG4gICAgICByZXR1cm4gY29sb3JTdG9wLnZhbHVlO1xuXG4gICAgY2FzZSAncmdiJzpcbiAgICBjYXNlICdyZ2JhJzpcbiAgICAgIHJldHVybiBgJHtjb2xvclN0b3AudHlwZX0oJHtjb2xvclN0b3AudmFsdWUuam9pbignLCcpfSlgO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFNob3VsZCBiZSB1bnJlYWNoYWJsZSBpZiBwYXNzaW5nIGFuIEFTVCBmcm9tIGdyYWRpZW50LXBhcnNlci5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmFmYWVsY2FyaWNpby9ncmFkaWVudC1wYXJzZXIjYXN0LlxuICAgICAgcmV0dXJuICd0cmFuc3BhcmVudCc7XG4gIH1cbn0iLCJpbXBvcnQgX29taXQgZnJvbSBcImxvZGFzaC9vbWl0XCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnQHdvcmRwcmVzcy9lbGVtZW50Jztcbi8qKlxuICogRXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cblxuLyoqXG4gKiBXb3JkUHJlc3MgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCB7IF9fIH0gZnJvbSAnY3QtaTE4bic7XG5pbXBvcnQgeyBTZWxlY3RDb250cm9sLCBGbGV4LCBGbGV4QmxvY2sgfSBmcm9tICdAd29yZHByZXNzL2NvbXBvbmVudHMnO1xuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xuXG5pbXBvcnQgQW5nbGVQaWNrZXJDb250cm9sIGZyb20gJy4vYW5nbGUtcGlja2VyLWNvbnRyb2wnO1xuaW1wb3J0IEN1c3RvbUdyYWRpZW50QmFyIGZyb20gJy4vY3VzdG9tLWdyYWRpZW50LWJhcic7XG5pbXBvcnQgeyBnZXRHcmFkaWVudEFzdFdpdGhEZWZhdWx0LCBnZXRMaW5lYXJHcmFkaWVudFJlcHJlc2VudGF0aW9uLCBnZXRHcmFkaWVudEFzdFdpdGhDb250cm9sUG9pbnRzLCBnZXRTdG9wQ3NzQ29sb3IgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUdyYWRpZW50IH0gZnJvbSAnLi9zZXJpYWxpemVyJztcbmltcG9ydCB7IERFRkFVTFRfTElORUFSX0dSQURJRU5UX0FOR0xFLCBIT1JJWk9OVEFMX0dSQURJRU5UX09SSUVOVEFUSU9OLCBHUkFESUVOVF9PUFRJT05TLCBERUZBVUxUX0dSQURJRU5UIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5jb25zdCBHcmFkaWVudEFuZ2xlUGlja2VyID0gX3JlZiA9PiB7XG4gIGxldCB7XG4gICAgZ3JhZGllbnRBU1QsXG4gICAgaGFzR3JhZGllbnQsXG4gICAgb25DaGFuZ2VcbiAgfSA9IF9yZWY7XG5cbiAgY29uc3QgYW5nbGUgPSBfZ2V0KGdyYWRpZW50QVNULCBbJ29yaWVudGF0aW9uJywgJ3ZhbHVlJ10sIERFRkFVTFRfTElORUFSX0dSQURJRU5UX0FOR0xFKTtcblxuICBjb25zdCBvbkFuZ2xlQ2hhbmdlID0gbmV3QW5nbGUgPT4ge1xuICAgIG9uQ2hhbmdlKHNlcmlhbGl6ZUdyYWRpZW50KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ3JhZGllbnRBU1QpLCB7fSwge1xuICAgICAgb3JpZW50YXRpb246IHtcbiAgICAgICAgdHlwZTogJ2FuZ3VsYXInLFxuICAgICAgICB2YWx1ZTogbmV3QW5nbGVcbiAgICAgIH1cbiAgICB9KSkpO1xuICB9O1xuXG4gIHJldHVybiBjcmVhdGVFbGVtZW50KEFuZ2xlUGlja2VyQ29udHJvbCwge1xuICAgIG9uQ2hhbmdlOiBvbkFuZ2xlQ2hhbmdlLFxuICAgIGxhYmVsUG9zaXRpb246IFwidG9wXCIsXG4gICAgdmFsdWU6IGhhc0dyYWRpZW50ID8gYW5nbGUgOiAnJ1xuICB9KTtcbn07XG5cbmNvbnN0IEdyYWRpZW50VHlwZVBpY2tlciA9IF9yZWYyID0+IHtcbiAgbGV0IHtcbiAgICBncmFkaWVudEFTVCxcbiAgICBoYXNHcmFkaWVudCxcbiAgICBvbkNoYW5nZVxuICB9ID0gX3JlZjI7XG4gIGNvbnN0IHtcbiAgICB0eXBlXG4gIH0gPSBncmFkaWVudEFTVDtcblxuICBjb25zdCBvblNldExpbmVhckdyYWRpZW50ID0gKCkgPT4ge1xuICAgIG9uQ2hhbmdlKHNlcmlhbGl6ZUdyYWRpZW50KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBncmFkaWVudEFTVCksIGdyYWRpZW50QVNULm9yaWVudGF0aW9uID8ge30gOiB7XG4gICAgICBvcmllbnRhdGlvbjogSE9SSVpPTlRBTF9HUkFESUVOVF9PUklFTlRBVElPTlxuICAgIH0pLCB7fSwge1xuICAgICAgdHlwZTogJ2xpbmVhci1ncmFkaWVudCdcbiAgICB9KSkpO1xuICB9O1xuXG4gIGNvbnN0IG9uU2V0UmFkaWFsR3JhZGllbnQgPSAoKSA9PiB7XG4gICAgb25DaGFuZ2Uoc2VyaWFsaXplR3JhZGllbnQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfb21pdChncmFkaWVudEFTVCwgWydvcmllbnRhdGlvbiddKSksIHt9LCB7XG4gICAgICB0eXBlOiAncmFkaWFsLWdyYWRpZW50J1xuICAgIH0pKSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlT25DaGFuZ2UgPSBuZXh0ID0+IHtcbiAgICBpZiAobmV4dCA9PT0gJ2xpbmVhci1ncmFkaWVudCcpIHtcbiAgICAgIG9uU2V0TGluZWFyR3JhZGllbnQoKTtcbiAgICB9XG5cbiAgICBpZiAobmV4dCA9PT0gJ3JhZGlhbC1ncmFkaWVudCcpIHtcbiAgICAgIG9uU2V0UmFkaWFsR3JhZGllbnQoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoU2VsZWN0Q29udHJvbCwge1xuICAgIGNsYXNzTmFtZTogXCJjb21wb25lbnRzLWN1c3RvbS1ncmFkaWVudC1waWNrZXJfX3R5cGUtcGlja2VyXCIsXG4gICAgbGFiZWw6IF9fKCdUeXBlJyksXG4gICAgbGFiZWxQb3NpdGlvbjogXCJ0b3BcIixcbiAgICBvbkNoYW5nZTogaGFuZGxlT25DaGFuZ2UsXG4gICAgb3B0aW9uczogR1JBRElFTlRfT1BUSU9OUyxcbiAgICBzaXplOiBcIl9fdW5zdGFibGUtbGFyZ2VcIixcbiAgICB2YWx1ZTogaGFzR3JhZGllbnQgJiYgdHlwZVxuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEN1c3RvbUdyYWRpZW50UGlja2VyKF9yZWYzKSB7XG4gIGxldCB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gICAgX19leHBlcmltZW50YWxJc1JlbmRlcmVkSW5TaWRlYmFyXG4gIH0gPSBfcmVmMztcbiAgY29uc3QgZ3JhZGllbnRBU1QgPSBnZXRHcmFkaWVudEFzdFdpdGhEZWZhdWx0KHZhbHVlKTsgLy8gT24gcmFkaWFsIGdyYWRpZW50cyB0aGUgYmFyIHNob3VsZCBkaXNwbGF5IGEgbGluZWFyIGdyYWRpZW50LlxuICAvLyBPbiByYWRpYWwgZ3JhZGllbnRzIHRoZSBiYXIgcmVwcmVzZW50cyBhIHNsaWNlIG9mIHRoZSBncmFkaWVudCBmcm9tIHRoZSBjZW50ZXIgdW50aWwgdGhlIG91dHNpZGUuXG4gIC8vIE9uIGxpbmVyIGdyYWRpZW50cyB0aGUgYmFyIHJlcHJlc2VudHMgdGhlIGNvbG9yIHN0b3BzIGZyb20gbGVmdCB0byByaWdodCBpbmRlcGVuZGVudGx5IG9mIHRoZSBhbmdsZS5cblxuICBjb25zdCBiYWNrZ3JvdW5kID0gZ2V0TGluZWFyR3JhZGllbnRSZXByZXNlbnRhdGlvbihncmFkaWVudEFTVCk7XG4gIGNvbnN0IGhhc0dyYWRpZW50ID0gZ3JhZGllbnRBU1QudmFsdWUgIT09IERFRkFVTFRfR1JBRElFTlQ7IC8vIENvbnRyb2wgcG9pbnRzIGNvbG9yIG9wdGlvbiBtYXkgYmUgaGV4IGZyb20gcHJlc2V0cywgY3VzdG9tIGNvbG9ycyB3aWxsIGJlIHJnYi5cbiAgLy8gVGhlIHBvc2l0aW9uIHNob3VsZCBhbHdheXMgYmUgYSBwZXJjZW50YWdlLlxuXG4gIGNvbnN0IGNvbnRyb2xQb2ludHMgPSBncmFkaWVudEFTVC5jb2xvclN0b3BzLm1hcChjb2xvclN0b3AgPT4gKHtcbiAgICBjb2xvcjogZ2V0U3RvcENzc0NvbG9yKGNvbG9yU3RvcCksXG4gICAgcG9zaXRpb246IHBhcnNlSW50KGNvbG9yU3RvcC5sZW5ndGgudmFsdWUpXG4gIH0pKTsgLy8gZmxleC1ncm93OiA1O1xuXG4gIGNvbnN0IEFjY2Vzc29yeVdyYXBwZXIgPSBGbGV4QmxvY2s7XG4gIGNvbnN0IFNlbGVjdFdyYXBwZXIgPSBGbGV4QmxvY2s7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwiY29tcG9uZW50cy1jdXN0b20tZ3JhZGllbnQtcGlja2VyXCJcbiAgfSwgY3JlYXRlRWxlbWVudChDdXN0b21HcmFkaWVudEJhciwge1xuICAgIF9fZXhwZXJpbWVudGFsSXNSZW5kZXJlZEluU2lkZWJhcjogX19leHBlcmltZW50YWxJc1JlbmRlcmVkSW5TaWRlYmFyLFxuICAgIGJhY2tncm91bmQ6IGJhY2tncm91bmQsXG4gICAgaGFzR3JhZGllbnQ6IGhhc0dyYWRpZW50LFxuICAgIHZhbHVlOiBjb250cm9sUG9pbnRzLFxuICAgIG9uQ2hhbmdlOiBuZXdDb250cm9sUG9pbnRzID0+IHtcbiAgICAgIG9uQ2hhbmdlKHNlcmlhbGl6ZUdyYWRpZW50KGdldEdyYWRpZW50QXN0V2l0aENvbnRyb2xQb2ludHMoZ3JhZGllbnRBU1QsIG5ld0NvbnRyb2xQb2ludHMpKSk7XG4gICAgfVxuICB9KSwgY3JlYXRlRWxlbWVudChGbGV4LCB7XG4gICAgZ2FwOiAzLFxuICAgIGNsYXNzTmFtZTogXCJjb21wb25lbnRzLWN1c3RvbS1ncmFkaWVudC1waWNrZXJfX3VpLWxpbmVcIlxuICB9LCBjcmVhdGVFbGVtZW50KFNlbGVjdFdyYXBwZXIsIG51bGwsIGNyZWF0ZUVsZW1lbnQoR3JhZGllbnRUeXBlUGlja2VyLCB7XG4gICAgZ3JhZGllbnRBU1Q6IGdyYWRpZW50QVNULFxuICAgIGhhc0dyYWRpZW50OiBoYXNHcmFkaWVudCxcbiAgICBvbkNoYW5nZTogb25DaGFuZ2VcbiAgfSkpLCBjcmVhdGVFbGVtZW50KEFjY2Vzc29yeVdyYXBwZXIsIG51bGwsIGdyYWRpZW50QVNULnR5cGUgPT09ICdsaW5lYXItZ3JhZGllbnQnICYmIGNyZWF0ZUVsZW1lbnQoR3JhZGllbnRBbmdsZVBpY2tlciwge1xuICAgIGdyYWRpZW50QVNUOiBncmFkaWVudEFTVCxcbiAgICBoYXNHcmFkaWVudDogaGFzR3JhZGllbnQsXG4gICAgb25DaGFuZ2U6IG9uQ2hhbmdlXG4gIH0pKSkpO1xufSIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG4vKipcbiAqIEV4dGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5cbi8qKlxuICogV29yZFByZXNzIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgeyBfXywgc3ByaW50ZiB9IGZyb20gJ2N0LWkxOG4nO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdAd29yZHByZXNzL2VsZW1lbnQnO1xuaW1wb3J0IHsgX19leHBlcmltZW50YWxIZWFkaW5nIGFzIEhlYWRpbmcsIF9fZXhwZXJpbWVudGFsVlN0YWNrIGFzIFZTdGFjayB9IGZyb20gJ0B3b3JkcHJlc3MvY29tcG9uZW50cyc7XG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5cbmltcG9ydCBDaXJjdWxhck9wdGlvblBpY2tlciBmcm9tICcuL2NpcmN1bGFyLW9wdGlvbi1waWNrZXInO1xuaW1wb3J0IEN1c3RvbUdyYWRpZW50UGlja2VyIGZyb20gJy4vY3VzdG9tLWdyYWRpZW50LXBpY2tlcic7XG5cbmZ1bmN0aW9uIFNpbmdsZU9yaWdpbihfcmVmKSB7XG4gIGxldCB7XG4gICAgY2xhc3NOYW1lLFxuICAgIGNsZWFyR3JhZGllbnQsXG4gICAgZ3JhZGllbnRzLFxuICAgIG9uQ2hhbmdlLFxuICAgIHZhbHVlLFxuICAgIGFjdGlvbnMsXG4gICAgY29udGVudFxuICB9ID0gX3JlZjtcbiAgY29uc3QgZ3JhZGllbnRPcHRpb25zID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIChncmFkaWVudHMgfHwgW10pLm1hcChfcmVmMiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBncmFkaWVudCxcbiAgICAgICAgbmFtZVxuICAgICAgfSA9IF9yZWYyO1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ2lyY3VsYXJPcHRpb25QaWNrZXIuT3B0aW9uLCB7XG4gICAgICAgIGtleTogZ3JhZGllbnQsXG4gICAgICAgIHZhbHVlOiBncmFkaWVudCxcbiAgICAgICAgaXNTZWxlY3RlZDogdmFsdWUgPT09IGdyYWRpZW50LFxuICAgICAgICB0b29sdGlwVGV4dDogbmFtZSB8fCAvLyB0cmFuc2xhdG9yczogJXM6IGdyYWRpZW50IGNvZGUgZS5nOiBcImxpbmVhci1ncmFkaWVudCg5MGRlZywgcmdiYSg5OCwxNiwxNTMsMSkgMCUsIHJnYmEoMTcyLDExMCwyMiwxKSAxMDAlKTtcIi5cbiAgICAgICAgc3ByaW50ZihfXygnR3JhZGllbnQgY29kZTogJXMnKSwgZ3JhZGllbnQpLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGNvbG9yOiAncmdiYSggMCwwLDAsMCApJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBncmFkaWVudFxuICAgICAgICB9LFxuICAgICAgICBvbkNsaWNrOiB2YWx1ZSA9PT0gZ3JhZGllbnQgPyBjbGVhckdyYWRpZW50IDogKCkgPT4gb25DaGFuZ2UoZ3JhZGllbnQpLFxuICAgICAgICBcImFyaWEtbGFiZWxcIjogbmFtZSA/IC8vIHRyYW5zbGF0b3JzOiAlczogVGhlIG5hbWUgb2YgdGhlIGdyYWRpZW50IGUuZzogXCJBbmd1bGFyIHJlZCB0byBibHVlXCIuXG4gICAgICAgIHNwcmludGYoX18oJ0dyYWRpZW50OiAlcycpLCBuYW1lKSA6IC8vIHRyYW5zbGF0b3JzOiAlczogZ3JhZGllbnQgY29kZSBlLmc6IFwibGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2JhKDk4LDE2LDE1MywxKSAwJSwgcmdiYSgxNzIsMTEwLDIyLDEpIDEwMCUpO1wiLlxuICAgICAgICBzcHJpbnRmKF9fKCdHcmFkaWVudCBjb2RlOiAlcycpLCBncmFkaWVudClcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LCBbZ3JhZGllbnRzLCB2YWx1ZSwgb25DaGFuZ2UsIGNsZWFyR3JhZGllbnRdKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ2lyY3VsYXJPcHRpb25QaWNrZXIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvcHRpb25zOiBncmFkaWVudE9wdGlvbnMsXG4gICAgYWN0aW9uczogYWN0aW9uc1xuICB9LCBjb250ZW50KTtcbn1cblxuZnVuY3Rpb24gTXVsdGlwbGVPcmlnaW4oX3JlZjMpIHtcbiAgbGV0IHtcbiAgICBjbGFzc05hbWUsXG4gICAgY2xlYXJHcmFkaWVudCxcbiAgICBncmFkaWVudHMsXG4gICAgb25DaGFuZ2UsXG4gICAgdmFsdWUsXG4gICAgYWN0aW9ucyxcbiAgICBjb250ZW50XG4gIH0gPSBfcmVmMztcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoVlN0YWNrLCB7XG4gICAgc3BhY2luZzogMyxcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCAoZ3JhZGllbnRzIHx8IFtdKS5tYXAoKF9yZWY0LCBpbmRleCkgPT4ge1xuICAgIGxldCB7XG4gICAgICBuYW1lLFxuICAgICAgZ3JhZGllbnRzOiBncmFkaWVudFNldFxuICAgIH0gPSBfcmVmNDtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChWU3RhY2ssIHtcbiAgICAgIHNwYWNpbmc6IDIsXG4gICAgICBrZXk6IGluZGV4XG4gICAgfSwgY3JlYXRlRWxlbWVudChIZWFkaW5nLCBudWxsLCBuYW1lKSwgY3JlYXRlRWxlbWVudChTaW5nbGVPcmlnaW4sIF9leHRlbmRzKHtcbiAgICAgIGNsZWFyR3JhZGllbnQ6IGNsZWFyR3JhZGllbnQsXG4gICAgICBncmFkaWVudHM6IGdyYWRpZW50U2V0LFxuICAgICAgb25DaGFuZ2U6IG9uQ2hhbmdlLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSwgZ3JhZGllbnRzLmxlbmd0aCA9PT0gaW5kZXggKyAxID8ge1xuICAgICAgYWN0aW9ucyxcbiAgICAgIGNvbnRlbnRcbiAgICB9IDoge30pKSk7XG4gIH0pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gR3JhZGllbnRQaWNrZXIoX3JlZjUpIHtcbiAgbGV0IHtcbiAgICBjbGFzc05hbWUsXG4gICAgZ3JhZGllbnRzLFxuICAgIG9uQ2hhbmdlLFxuICAgIHZhbHVlLFxuICAgIGNsZWFyYWJsZSA9IHRydWUsXG4gICAgZGlzYWJsZUN1c3RvbUdyYWRpZW50cyA9IGZhbHNlLFxuICAgIF9fZXhwZXJpbWVudGFsSGFzTXVsdGlwbGVPcmlnaW5zLFxuICAgIF9fZXhwZXJpbWVudGFsSXNSZW5kZXJlZEluU2lkZWJhclxuICB9ID0gX3JlZjU7XG4gIGNvbnN0IGNsZWFyR3JhZGllbnQgPSB1c2VDYWxsYmFjaygoKSA9PiBvbkNoYW5nZSh1bmRlZmluZWQpLCBbb25DaGFuZ2VdKTtcbiAgY29uc3QgQ29tcG9uZW50ID0gX19leHBlcmltZW50YWxIYXNNdWx0aXBsZU9yaWdpbnMgJiYgZ3JhZGllbnRzICE9PSBudWxsICYmIGdyYWRpZW50cyAhPT0gdm9pZCAwICYmIGdyYWRpZW50cy5sZW5ndGggPyBNdWx0aXBsZU9yaWdpbiA6IFNpbmdsZU9yaWdpbjtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgY2xlYXJhYmxlOiBjbGVhcmFibGUsXG4gICAgY2xlYXJHcmFkaWVudDogY2xlYXJHcmFkaWVudCxcbiAgICBncmFkaWVudHM6IGdyYWRpZW50cyxcbiAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGFjdGlvbnM6IGNsZWFyYWJsZSAmJiAoKGdyYWRpZW50cyA9PT0gbnVsbCB8fCBncmFkaWVudHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdyYWRpZW50cy5sZW5ndGgpIHx8ICFkaXNhYmxlQ3VzdG9tR3JhZGllbnRzKSAmJiBjcmVhdGVFbGVtZW50KENpcmN1bGFyT3B0aW9uUGlja2VyLkJ1dHRvbkFjdGlvbiwge1xuICAgICAgb25DbGljazogY2xlYXJHcmFkaWVudFxuICAgIH0sIF9fKCdDbGVhcicpKSxcbiAgICBjb250ZW50OiAhZGlzYWJsZUN1c3RvbUdyYWRpZW50cyAmJiBjcmVhdGVFbGVtZW50KEN1c3RvbUdyYWRpZW50UGlja2VyLCB7XG4gICAgICBfX2V4cGVyaW1lbnRhbElzUmVuZGVyZWRJblNpZGViYXI6IF9fZXhwZXJpbWVudGFsSXNSZW5kZXJlZEluU2lkZWJhcixcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZVxuICAgIH0pXG4gIH0pO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1188\n")}}]);