UNPKG

35.9 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6var _exportNames = {
7 invertBase16Theme: true,
8 createStyling: true,
9 getBase16Theme: true,
10 invertTheme: true,
11 Base16Theme: true
12};
13Object.defineProperty(exports, "Base16Theme", {
14 enumerable: true,
15 get: function get() {
16 return base16.Base16Theme;
17 }
18});
19exports.invertTheme = exports.getBase16Theme = exports.createStyling = exports.invertBase16Theme = void 0;
20
21var base16 = _interopRequireWildcard(require("base16"));
22
23var _color = _interopRequireDefault(require("color"));
24
25var _lodash = _interopRequireDefault(require("lodash.curry"));
26
27var _colorConverters = require("./colorConverters");
28
29var _types = require("./types");
30
31Object.keys(_types).forEach(function (key) {
32 if (key === "default" || key === "__esModule") return;
33 if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
34 Object.defineProperty(exports, key, {
35 enumerable: true,
36 get: function get() {
37 return _types[key];
38 }
39 });
40});
41
42function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
43
44function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
45
46function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
47
48function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
49
50function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
51
52function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
53
54function _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; }
55
56function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
57
58function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
59
60function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
61
62function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
63
64function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
65
66function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
67
68var DEFAULT_BASE16 = base16["default"];
69var BASE16_KEYS = Object.keys(DEFAULT_BASE16); // we need a correcting factor, so that a dark, but not black background color
70// converts to bright enough inversed color
71
72var flip = function flip(x) {
73 return x < 0.25 ? 1 : x < 0.5 ? 0.9 - x : 1.1 - x;
74};
75
76var invertColor = function invertColor(hexString) {
77 var color = (0, _color["default"])(hexString);
78
79 var _rgb2yuv = (0, _colorConverters.rgb2yuv)(color.array()),
80 _rgb2yuv2 = _slicedToArray(_rgb2yuv, 3),
81 y = _rgb2yuv2[0],
82 u = _rgb2yuv2[1],
83 v = _rgb2yuv2[2];
84
85 var flippedYuv = [flip(y), u, v];
86 var rgb = (0, _colorConverters.yuv2rgb)(flippedYuv);
87 return _color["default"].rgb(rgb).hex();
88};
89
90var merger = function merger(styling) {
91 return function (prevStyling) {
92 return {
93 className: [prevStyling.className, styling.className].filter(Boolean).join(' '),
94 style: _objectSpread(_objectSpread({}, prevStyling.style || {}), styling.style || {})
95 };
96 };
97};
98
99var mergeStyling = function mergeStyling(customStyling, defaultStyling) {
100 if (customStyling === undefined) {
101 return defaultStyling;
102 }
103
104 if (defaultStyling === undefined) {
105 return customStyling;
106 }
107
108 var customType = _typeof(customStyling);
109
110 var defaultType = _typeof(defaultStyling);
111
112 switch (customType) {
113 case 'string':
114 switch (defaultType) {
115 case 'string':
116 return [defaultStyling, customStyling].filter(Boolean).join(' ');
117
118 case 'object':
119 return merger({
120 className: customStyling,
121 style: defaultStyling
122 });
123
124 case 'function':
125 return function (styling) {
126 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
127 args[_key - 1] = arguments[_key];
128 }
129
130 return merger({
131 className: customStyling
132 })(defaultStyling.apply(void 0, [styling].concat(args)));
133 };
134 }
135
136 break;
137
138 case 'object':
139 switch (defaultType) {
140 case 'string':
141 return merger({
142 className: defaultStyling,
143 style: customStyling
144 });
145
146 case 'object':
147 return _objectSpread(_objectSpread({}, defaultStyling), customStyling);
148
149 case 'function':
150 return function (styling) {
151 for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
152 args[_key2 - 1] = arguments[_key2];
153 }
154
155 return merger({
156 style: customStyling
157 })(defaultStyling.apply(void 0, [styling].concat(args)));
158 };
159 }
160
161 break;
162
163 case 'function':
164 switch (defaultType) {
165 case 'string':
166 return function (styling) {
167 for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
168 args[_key3 - 1] = arguments[_key3];
169 }
170
171 return customStyling.apply(void 0, [merger(styling)({
172 className: defaultStyling
173 })].concat(args));
174 };
175
176 case 'object':
177 return function (styling) {
178 for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
179 args[_key4 - 1] = arguments[_key4];
180 }
181
182 return customStyling.apply(void 0, [merger(styling)({
183 style: defaultStyling
184 })].concat(args));
185 };
186
187 case 'function':
188 return function (styling) {
189 for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
190 args[_key5 - 1] = arguments[_key5];
191 }
192
193 return customStyling.apply(void 0, [defaultStyling.apply(void 0, [styling].concat(args))].concat(args));
194 };
195 }
196
197 }
198};
199
200var mergeStylings = function mergeStylings(customStylings, defaultStylings) {
201 var keys = Object.keys(defaultStylings);
202
203 for (var key in customStylings) {
204 if (keys.indexOf(key) === -1) keys.push(key);
205 }
206
207 return keys.reduce(function (mergedStyling, key) {
208 return mergedStyling[key] = mergeStyling(customStylings[key], defaultStylings[key]), mergedStyling;
209 }, {});
210};
211
212var getStylingByKeys = function getStylingByKeys(mergedStyling, keys) {
213 for (var _len6 = arguments.length, args = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) {
214 args[_key6 - 2] = arguments[_key6];
215 }
216
217 if (keys === null) {
218 return mergedStyling;
219 }
220
221 if (!Array.isArray(keys)) {
222 keys = [keys];
223 }
224
225 var styles = keys.map(function (key) {
226 return mergedStyling[key];
227 }).filter(Boolean);
228 var props = styles.reduce(function (obj, s) {
229 if (typeof s === 'string') {
230 obj.className = [obj.className, s].filter(Boolean).join(' ');
231 } else if (_typeof(s) === 'object') {
232 obj.style = _objectSpread(_objectSpread({}, obj.style), s);
233 } else if (typeof s === 'function') {
234 obj = _objectSpread(_objectSpread({}, obj), s.apply(void 0, [obj].concat(args)));
235 }
236
237 return obj;
238 }, {
239 className: '',
240 style: {}
241 });
242
243 if (!props.className) {
244 delete props.className;
245 }
246
247 if (Object.keys(props.style).length === 0) {
248 delete props.style;
249 }
250
251 return props;
252};
253
254var invertBase16Theme = function invertBase16Theme(base16Theme) {
255 return Object.keys(base16Theme).reduce(function (t, key) {
256 return t[key] = /^base/.test(key) ? invertColor(base16Theme[key]) : key === 'scheme' ? base16Theme[key] + ':inverted' : base16Theme[key], t;
257 }, {});
258};
259
260exports.invertBase16Theme = invertBase16Theme;
261var createStyling = (0, _lodash["default"])(function (getStylingFromBase16) {
262 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
263 var themeOrStyling = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
264 var _options$defaultBase = options.defaultBase16,
265 defaultBase16 = _options$defaultBase === void 0 ? DEFAULT_BASE16 : _options$defaultBase,
266 _options$base16Themes = options.base16Themes,
267 base16Themes = _options$base16Themes === void 0 ? null : _options$base16Themes;
268 var base16Theme = getBase16Theme(themeOrStyling, base16Themes);
269
270 if (base16Theme) {
271 themeOrStyling = _objectSpread(_objectSpread({}, base16Theme), themeOrStyling);
272 }
273
274 var theme = BASE16_KEYS.reduce(function (t, key) {
275 return t[key] = themeOrStyling[key] || defaultBase16[key], t;
276 }, {});
277 var customStyling = Object.keys(themeOrStyling).reduce(function (s, key) {
278 return BASE16_KEYS.indexOf(key) === -1 ? (s[key] = themeOrStyling[key], s) : s;
279 }, {});
280 var defaultStyling = getStylingFromBase16(theme);
281 var mergedStyling = mergeStylings(customStyling, defaultStyling);
282
283 for (var _len7 = arguments.length, args = new Array(_len7 > 3 ? _len7 - 3 : 0), _key7 = 3; _key7 < _len7; _key7++) {
284 args[_key7 - 3] = arguments[_key7];
285 }
286
287 return (0, _lodash["default"])(getStylingByKeys, 2).apply(void 0, [mergedStyling].concat(args));
288}, 3);
289exports.createStyling = createStyling;
290
291var isStylingConfig = function isStylingConfig(theme) {
292 return !!theme.extend;
293};
294
295var getBase16Theme = function getBase16Theme(theme, base16Themes) {
296 if (theme && isStylingConfig(theme) && theme.extend) {
297 theme = theme.extend;
298 }
299
300 if (typeof theme === 'string') {
301 var _theme$split = theme.split(':'),
302 _theme$split2 = _slicedToArray(_theme$split, 2),
303 _themeName = _theme$split2[0],
304 modifier = _theme$split2[1];
305
306 if (base16Themes) {
307 theme = base16Themes[_themeName];
308 } else {
309 theme = base16[_themeName];
310 }
311
312 if (modifier === 'inverted') {
313 theme = invertBase16Theme(theme);
314 }
315 }
316
317 return theme && Object.prototype.hasOwnProperty.call(theme, 'base00') ? theme : undefined;
318};
319
320exports.getBase16Theme = getBase16Theme;
321
322var invertTheme = function invertTheme(theme) {
323 if (typeof theme === 'string') {
324 return "".concat(theme, ":inverted");
325 }
326
327 if (theme && isStylingConfig(theme) && theme.extend) {
328 if (typeof theme.extend === 'string') {
329 return _objectSpread(_objectSpread({}, theme), {}, {
330 extend: "".concat(theme.extend, ":inverted")
331 });
332 }
333
334 return _objectSpread(_objectSpread({}, theme), {}, {
335 extend: invertBase16Theme(theme.extend)
336 });
337 }
338
339 if (theme) {
340 return invertBase16Theme(theme);
341 }
342
343 return theme;
344};
345
346exports.invertTheme = invertTheme;
347//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJERUZBVUxUX0JBU0UxNiIsImJhc2UxNiIsIkJBU0UxNl9LRVlTIiwiT2JqZWN0Iiwia2V5cyIsImZsaXAiLCJ4IiwiaW52ZXJ0Q29sb3IiLCJoZXhTdHJpbmciLCJjb2xvciIsImFycmF5IiwieSIsInUiLCJ2IiwiZmxpcHBlZFl1diIsInJnYiIsIkNvbG9yIiwiaGV4IiwibWVyZ2VyIiwic3R5bGluZyIsInByZXZTdHlsaW5nIiwiY2xhc3NOYW1lIiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJzdHlsZSIsIm1lcmdlU3R5bGluZyIsImN1c3RvbVN0eWxpbmciLCJkZWZhdWx0U3R5bGluZyIsInVuZGVmaW5lZCIsImN1c3RvbVR5cGUiLCJkZWZhdWx0VHlwZSIsImFyZ3MiLCJtZXJnZVN0eWxpbmdzIiwiY3VzdG9tU3R5bGluZ3MiLCJkZWZhdWx0U3R5bGluZ3MiLCJrZXkiLCJpbmRleE9mIiwicHVzaCIsInJlZHVjZSIsIm1lcmdlZFN0eWxpbmciLCJnZXRTdHlsaW5nQnlLZXlzIiwiQXJyYXkiLCJpc0FycmF5Iiwic3R5bGVzIiwibWFwIiwicHJvcHMiLCJvYmoiLCJzIiwibGVuZ3RoIiwiaW52ZXJ0QmFzZTE2VGhlbWUiLCJiYXNlMTZUaGVtZSIsInQiLCJ0ZXN0IiwiY3JlYXRlU3R5bGluZyIsImdldFN0eWxpbmdGcm9tQmFzZTE2Iiwib3B0aW9ucyIsInRoZW1lT3JTdHlsaW5nIiwiZGVmYXVsdEJhc2UxNiIsImJhc2UxNlRoZW1lcyIsImdldEJhc2UxNlRoZW1lIiwidGhlbWUiLCJpc1N0eWxpbmdDb25maWciLCJleHRlbmQiLCJzcGxpdCIsInRoZW1lTmFtZSIsIm1vZGlmaWVyIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaW52ZXJ0VGhlbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBb1NBOztBQUFB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RUFBa0I7QUFDaEJFLE1BQUFBLEtBQUssR0FBR0YsWUFBWSxDQUFDTSxVQUFELENBQXBCO0FBQ0QsS0FGRCxNQUVPO0FBQ0xKLE1BQUFBLEtBQUssR0FBRzVELE1BQU0sQ0FBQ2dFLFVBQUQsQ0FBZDtBQUNEOztBQUNELFFBQUlDLFFBQVEsS0FBSyxVQUFqQixFQUE2QjtBQUMzQkwsTUFBQUEsS0FBSyxHQUFHWCxpQkFBaUIsQ0FBQ1csS0FBRCxDQUF6QjtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0EsS0FBSyxJQUFJMUQsTUFBTSxDQUFDZ0UsU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDUixLQUFyQyxFQUE0QyxRQUE1QyxDQUFULEdBQ0ZBLEtBREUsR0FFSGhDLFNBRko7QUFHRCxDQXZCTTs7OztBQXlCQSxJQUFNeUMsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ1QsS0FBRCxFQUFpRDtBQUMxRSxNQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IscUJBQVVBLEtBQVY7QUFDRDs7QUFFRCxNQUFJQSxLQUFLLElBQUlDLGVBQWUsQ0FBQ0QsS0FBRCxDQUF4QixJQUFtQ0EsS0FBSyxDQUFDRSxNQUE3QyxFQUFxRDtBQUNuRCxRQUFJLE9BQU9GLEtBQUssQ0FBQ0UsTUFBYixLQUF3QixRQUE1QixFQUFzQztBQUNwQyw2Q0FBWUYsS0FBWjtBQUFtQkUsUUFBQUEsTUFBTSxZQUFLRixLQUFLLENBQUNFLE1BQVg7QUFBekI7QUFDRDs7QUFFRCwyQ0FDS0YsS0FETDtBQUVFRSxNQUFBQSxNQUFNLEVBQUViLGlCQUFpQixDQUFDVyxLQUFLLENBQUNFLE1BQVA7QUFGM0I7QUFJRDs7QUFFRCxNQUFJRixLQUFKLEVBQVc7QUFDVCxXQUFPWCxpQkFBaUIsQ0FBQ1csS0FBRCxDQUF4QjtBQUNEOztBQUVELFNBQU9BLEtBQVA7QUFDRCxDQXJCTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJhc2UxNiBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IHsgQmFzZTE2VGhlbWUgfSBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IENvbG9yIGZyb20gJ2NvbG9yJztcbmltcG9ydCAqIGFzIENTUyBmcm9tICdjc3N0eXBlJztcbmltcG9ydCBjdXJyeSBmcm9tICdsb2Rhc2guY3VycnknO1xuaW1wb3J0IHsgQ29sb3IgYXMgQ29sb3JUdXBsZSwgeXV2MnJnYiwgcmdiMnl1diB9IGZyb20gJy4vY29sb3JDb252ZXJ0ZXJzJztcbmltcG9ydCB7XG4gIFN0eWxpbmcsXG4gIFN0eWxpbmdDb25maWcsXG4gIFN0eWxpbmdGdW5jdGlvbixcbiAgU3R5bGluZ1ZhbHVlLFxuICBTdHlsaW5nVmFsdWVGdW5jdGlvbixcbiAgVGhlbWUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBERUZBVUxUX0JBU0UxNiA9IGJhc2UxNi5kZWZhdWx0O1xuXG5jb25zdCBCQVNFMTZfS0VZUyA9IE9iamVjdC5rZXlzKERFRkFVTFRfQkFTRTE2KTtcblxuLy8gd2UgbmVlZCBhIGNvcnJlY3RpbmcgZmFjdG9yLCBzbyB0aGF0IGEgZGFyaywgYnV0IG5vdCBibGFjayBiYWNrZ3JvdW5kIGNvbG9yXG4vLyBjb252ZXJ0cyB0byBicmlnaHQgZW5vdWdoIGludmVyc2VkIGNvbG9yXG5jb25zdCBmbGlwID0gKHg6IG51bWJlcikgPT4gKHggPCAwLjI1ID8gMSA6IHggPCAwLjUgPyAwLjkgLSB4IDogMS4xIC0geCk7XG5cbmNvbnN0IGludmVydENvbG9yID0gKGhleFN0cmluZzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNvbG9yID0gQ29sb3IoaGV4U3RyaW5nKTtcbiAgY29uc3QgW3ksIHUsIHZdID0gcmdiMnl1dihjb2xvci5hcnJheSgpIGFzIENvbG9yVHVwbGUpO1xuICBjb25zdCBmbGlwcGVkWXV2OiBDb2xvclR1cGxlID0gW2ZsaXAoeSksIHUsIHZdO1xuICBjb25zdCByZ2IgPSB5dXYycmdiKGZsaXBwZWRZdXYpO1xuICByZXR1cm4gQ29sb3IucmdiKHJnYikuaGV4KCk7XG59O1xuXG5jb25zdCBtZXJnZXIgPSAoc3R5bGluZzogUGFydGlhbDxTdHlsaW5nPikgPT4ge1xuICByZXR1cm4gKHByZXZTdHlsaW5nOiBQYXJ0aWFsPFN0eWxpbmc+KSA9PiAoe1xuICAgIGNsYXNzTmFtZTogW3ByZXZTdHlsaW5nLmNsYXNzTmFtZSwgc3R5bGluZy5jbGFzc05hbWVdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbignICcpLFxuICAgIHN0eWxlOiB7IC4uLihwcmV2U3R5bGluZy5zdHlsZSB8fCB7fSksIC4uLihzdHlsaW5nLnN0eWxlIHx8IHt9KSB9LFxuICB9KTtcbn07XG5cbmNvbnN0IG1lcmdlU3R5bGluZyA9IChcbiAgY3VzdG9tU3R5bGluZzogU3R5bGluZ1ZhbHVlLFxuICBkZWZhdWx0U3R5bGluZzogU3R5bGluZ1ZhbHVlXG4pOiBTdHlsaW5nVmFsdWUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoY3VzdG9tU3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRTdHlsaW5nO1xuICB9XG4gIGlmIChkZWZhdWx0U3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0eWxpbmc7XG4gIH1cblxuICBjb25zdCBjdXN0b21UeXBlID0gdHlwZW9mIGN1c3RvbVN0eWxpbmc7XG4gIGNvbnN0IGRlZmF1bHRUeXBlID0gdHlwZW9mIGRlZmF1bHRTdHlsaW5nO1xuXG4gIHN3aXRjaCAoY3VzdG9tVHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIFtkZWZhdWx0U3R5bGluZywgY3VzdG9tU3R5bGluZ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY3VzdG9tU3R5bGluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZzogU3R5bGluZywgLi4uYXJnczogYW55W10pID0+XG4gICAgICAgICAgICBtZXJnZXIoe1xuICAgICAgICAgICAgICBjbGFzc05hbWU6IGN1c3RvbVN0eWxpbmcgYXMgc3RyaW5nLFxuICAgICAgICAgICAgfSkoKGRlZmF1bHRTdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShzdHlsaW5nLCAuLi5hcmdzKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgc3dpdGNoIChkZWZhdWx0VHlwZSkge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIHJldHVybiBtZXJnZXIoe1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBkZWZhdWx0U3R5bGluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICBzdHlsZTogY3VzdG9tU3R5bGluZyBhcyBDU1MuUHJvcGVydGllczxzdHJpbmcgfCBudW1iZXI+LFxuICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi4oZGVmYXVsdFN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiksXG4gICAgICAgICAgICAuLi4oY3VzdG9tU3R5bGluZyBhcyBDU1MuUHJvcGVydGllczxzdHJpbmcgfCBudW1iZXI+KSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIChzdHlsaW5nOiBTdHlsaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT5cbiAgICAgICAgICAgIG1lcmdlcih7XG4gICAgICAgICAgICAgIHN0eWxlOiBjdXN0b21TdHlsaW5nIGFzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4sXG4gICAgICAgICAgICB9KSgoZGVmYXVsdFN0eWxpbmcgYXMgU3R5bGluZ1ZhbHVlRnVuY3Rpb24pKHN0eWxpbmcsIC4uLmFyZ3MpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gKHN0eWxpbmcsIC4uLmFyZ3MpID0+XG4gICAgICAgICAgICAoY3VzdG9tU3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoXG4gICAgICAgICAgICAgIG1lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBkZWZhdWx0U3R5bGluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApO1xuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZywgLi4uYXJncykgPT5cbiAgICAgICAgICAgIChjdXN0b21TdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgbWVyZ2VyKHN0eWxpbmcpKHtcbiAgICAgICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gKHN0eWxpbmcsIC4uLmFyZ3MpID0+XG4gICAgICAgICAgICAoY3VzdG9tU3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoXG4gICAgICAgICAgICAgIChkZWZhdWx0U3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoXG4gICAgICAgICAgICAgICAgc3R5bGluZyxcbiAgICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICAgICkgYXMgU3R5bGluZyxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKTtcbiAgICAgIH1cbiAgfVxufTtcblxuY29uc3QgbWVyZ2VTdHlsaW5ncyA9IChcbiAgY3VzdG9tU3R5bGluZ3M6IFN0eWxpbmdDb25maWcsXG4gIGRlZmF1bHRTdHlsaW5nczogU3R5bGluZ0NvbmZpZ1xuKTogU3R5bGluZ0NvbmZpZyA9PiB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0U3R5bGluZ3MpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBjdXN0b21TdHlsaW5ncykge1xuICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIGtleXMucHVzaChrZXkpO1xuICB9XG5cbiAgcmV0dXJuIGtleXMucmVkdWNlKFxuICAgIChtZXJnZWRTdHlsaW5nLCBrZXkpID0+IChcbiAgICAgIChtZXJnZWRTdHlsaW5nW2tleSBhcyBrZXlvZiBTdHlsaW5nQ29uZmlnXSA9IG1lcmdlU3R5bGluZyhcbiAgICAgICAgY3VzdG9tU3R5bGluZ3Nba2V5XSBhcyBTdHlsaW5nVmFsdWUsXG4gICAgICAgIGRlZmF1bHRTdHlsaW5nc1trZXldIGFzIFN0eWxpbmdWYWx1ZVxuICAgICAgKSBhcyBTdHlsaW5nVmFsdWUpLFxuICAgICAgbWVyZ2VkU3R5bGluZ1xuICAgICksXG4gICAge30gYXMgU3R5bGluZ0NvbmZpZ1xuICApO1xufTtcblxuY29uc3QgZ2V0U3R5bGluZ0J5S2V5cyA9IChcbiAgbWVyZ2VkU3R5bGluZzogU3R5bGluZ0NvbmZpZyxcbiAga2V5czogKHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkKSB8IChzdHJpbmcgfCBmYWxzZSB8IHVuZGVmaW5lZClbXSxcbiAgLi4uYXJnczogYW55W11cbik6IFN0eWxpbmcgPT4ge1xuICBpZiAoa2V5cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiAobWVyZ2VkU3R5bGluZyBhcyB1bmtub3duKSBhcyBTdHlsaW5nO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAga2V5cyA9IFtrZXlzXTtcbiAgfVxuXG4gIGNvbnN0IHN0eWxlcyA9IGtleXNcbiAgICAubWFwKChrZXkpID0+IG1lcmdlZFN0eWxpbmdba2V5IGFzIHN0cmluZ10pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcblxuICBjb25zdCBwcm9wcyA9IHN0eWxlcy5yZWR1Y2UoXG4gICAgKG9iaiwgcykgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgICBvYmouY2xhc3NOYW1lID0gW29iai5jbGFzc05hbWUsIHNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvYmouc3R5bGUgPSB7IC4uLm9iai5zdHlsZSwgLi4ucyB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmogPSB7IC4uLm9iaiwgLi4ucyhvYmosIC4uLmFyZ3MpIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICB7IGNsYXNzTmFtZTogJycsIHN0eWxlOiB7fSB9XG4gICk7XG5cbiAgaWYgKCFwcm9wcy5jbGFzc05hbWUpIHtcbiAgICBkZWxldGUgcHJvcHMuY2xhc3NOYW1lO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHByb3BzLnN0eWxlKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgcHJvcHMuc3R5bGU7XG4gIH1cblxuICByZXR1cm4gcHJvcHM7XG59O1xuXG5leHBvcnQgY29uc3QgaW52ZXJ0QmFzZTE2VGhlbWUgPSAoYmFzZTE2VGhlbWU6IEJhc2UxNlRoZW1lKTogQmFzZTE2VGhlbWUgPT5cbiAgT2JqZWN0LmtleXMoYmFzZTE2VGhlbWUpLnJlZHVjZShcbiAgICAodCwga2V5KSA9PiAoXG4gICAgICAodFtrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdID0gL15iYXNlLy50ZXN0KGtleSlcbiAgICAgICAgPyBpbnZlcnRDb2xvcihiYXNlMTZUaGVtZVtrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdKVxuICAgICAgICA6IGtleSA9PT0gJ3NjaGVtZSdcbiAgICAgICAgPyBiYXNlMTZUaGVtZVtrZXldICsgJzppbnZlcnRlZCdcbiAgICAgICAgOiBiYXNlMTZUaGVtZVtrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdKSxcbiAgICAgIHRcbiAgICApLFxuICAgIHt9IGFzIEJhc2UxNlRoZW1lXG4gICk7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTdHlsaW5nID0gY3VycnkoXG4gIChcbiAgICBnZXRTdHlsaW5nRnJvbUJhc2UxNjogKGJhc2UxNlRoZW1lOiBCYXNlMTZUaGVtZSkgPT4gU3R5bGluZ0NvbmZpZyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBkZWZhdWx0QmFzZTE2PzogQmFzZTE2VGhlbWU7XG4gICAgICBiYXNlMTZUaGVtZXM/OiB7IFt0aGVtZU5hbWU6IHN0cmluZ106IEJhc2UxNlRoZW1lIH07XG4gICAgfSA9IHt9LFxuICAgIHRoZW1lT3JTdHlsaW5nOiBUaGVtZSA9IHt9LFxuICAgIC4uLmFyZ3NcbiAgKTogU3R5bGluZ0Z1bmN0aW9uID0+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRCYXNlMTYgPSBERUZBVUxUX0JBU0UxNiwgYmFzZTE2VGhlbWVzID0gbnVsbCB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGJhc2UxNlRoZW1lID0gZ2V0QmFzZTE2VGhlbWUodGhlbWVPclN0eWxpbmcsIGJhc2UxNlRoZW1lcyk7XG4gICAgaWYgKGJhc2UxNlRoZW1lKSB7XG4gICAgICB0aGVtZU9yU3R5bGluZyA9IHtcbiAgICAgICAgLi4uYmFzZTE2VGhlbWUsXG4gICAgICAgIC4uLih0aGVtZU9yU3R5bGluZyBhcyBCYXNlMTZUaGVtZSB8IFN0eWxpbmdDb25maWcpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0aGVtZSA9IEJBU0UxNl9LRVlTLnJlZHVjZShcbiAgICAgICh0LCBrZXkpID0+IChcbiAgICAgICAgKHRba2V5IGFzIGtleW9mIEJhc2UxNlRoZW1lXSA9XG4gICAgICAgICAgKHRoZW1lT3JTdHlsaW5nIGFzIEJhc2UxNlRoZW1lKVtrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdIHx8XG4gICAgICAgICAgZGVmYXVsdEJhc2UxNltrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdKSxcbiAgICAgICAgdFxuICAgICAgKSxcbiAgICAgIHt9IGFzIEJhc2UxNlRoZW1lXG4gICAgKTtcblxuICAgIGNvbnN0IGN1c3RvbVN0eWxpbmcgPSBPYmplY3Qua2V5cyh0aGVtZU9yU3R5bGluZykucmVkdWNlKFxuICAgICAgKHMsIGtleSkgPT5cbiAgICAgICAgQkFTRTE2X0tFWVMuaW5kZXhPZihrZXkpID09PSAtMVxuICAgICAgICAgID8gKChzW2tleV0gPSAodGhlbWVPclN0eWxpbmcgYXMgU3R5bGluZ0NvbmZpZylba2V5XSksIHMpXG4gICAgICAgICAgOiBzLFxuICAgICAge30gYXMgU3R5bGluZ0NvbmZpZ1xuICAgICk7XG5cbiAgICBjb25zdCBkZWZhdWx0U3R5bGluZyA9IGdldFN0eWxpbmdGcm9tQmFzZTE2KHRoZW1lKTtcblxuICAgIGNvbnN0IG1lcmdlZFN0eWxpbmcgPSBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmcsIGRlZmF1bHRTdHlsaW5nKTtcblxuICAgIHJldHVybiBjdXJyeShnZXRTdHlsaW5nQnlLZXlzLCAyKShtZXJnZWRTdHlsaW5nLCAuLi5hcmdzKTtcbiAgfSxcbiAgM1xuKTtcblxuY29uc3QgaXNTdHlsaW5nQ29uZmlnID0gKHRoZW1lOiBUaGVtZSk6IHRoZW1lIGlzIFN0eWxpbmdDb25maWcgPT5cbiAgISEodGhlbWUgYXMgU3R5bGluZ0NvbmZpZykuZXh0ZW5kO1xuXG5leHBvcnQgY29uc3QgZ2V0QmFzZTE2VGhlbWUgPSAoXG4gIHRoZW1lOiBUaGVtZSxcbiAgYmFzZTE2VGhlbWVzPzogeyBbdGhlbWVOYW1lOiBzdHJpbmddOiBCYXNlMTZUaGVtZSB9IHwgbnVsbFxuKTogQmFzZTE2VGhlbWUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodGhlbWUgJiYgaXNTdHlsaW5nQ29uZmlnKHRoZW1lKSAmJiB0aGVtZS5leHRlbmQpIHtcbiAgICB0aGVtZSA9IHRoZW1lLmV4dGVuZCBhcyBzdHJpbmcgfCBCYXNlMTZUaGVtZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGhlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgW3RoZW1lTmFtZSwgbW9kaWZpZXJdID0gdGhlbWUuc3BsaXQoJzonKTtcbiAgICBpZiAoYmFzZTE2VGhlbWVzKSB7XG4gICAgICB0aGVtZSA9IGJhc2UxNlRoZW1lc1t0aGVtZU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGVtZSA9IGJhc2UxNlt0aGVtZU5hbWUgYXMga2V5b2YgdHlwZW9mIGJhc2UxNl07XG4gICAgfVxuICAgIGlmIChtb2RpZmllciA9PT0gJ2ludmVydGVkJykge1xuICAgICAgdGhlbWUgPSBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoZW1lICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGVtZSwgJ2Jhc2UwMCcpXG4gICAgPyAodGhlbWUgYXMgQmFzZTE2VGhlbWUpXG4gICAgOiB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgaW52ZXJ0VGhlbWUgPSAodGhlbWU6IFRoZW1lIHwgdW5kZWZpbmVkKTogVGhlbWUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZW9mIHRoZW1lID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBgJHt0aGVtZX06aW52ZXJ0ZWRgO1xuICB9XG5cbiAgaWYgKHRoZW1lICYmIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkgJiYgdGhlbWUuZXh0ZW5kKSB7XG4gICAgaWYgKHR5cGVvZiB0aGVtZS5leHRlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyAuLi50aGVtZSwgZXh0ZW5kOiBgJHt0aGVtZS5leHRlbmR9OmludmVydGVkYCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGVtZSxcbiAgICAgIGV4dGVuZDogaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUuZXh0ZW5kIGFzIEJhc2UxNlRoZW1lKSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHRoZW1lKSB7XG4gICAgcmV0dXJuIGludmVydEJhc2UxNlRoZW1lKHRoZW1lIGFzIEJhc2UxNlRoZW1lKTtcbiAgfVxuXG4gIHJldHVybiB0aGVtZTtcbn07XG5cbmV4cG9ydCB7IEJhc2UxNlRoZW1lIH07XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
\No newline at end of file