made with requirebin
Created
November 16, 2017 18:49
-
-
Save birkir/d78ac6067c85c27e56a8fc4d60604f0f to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const css2rn = require('css-to-react-native'); | |
const input = document.getElementById('code'); | |
const result = document.getElementById('result'); | |
const strrf = str => str.trim().replace(/^"/, "'").replace(/",?$/, "'"); | |
const btn = document.querySelector('#go'); | |
btn.addEventListener('click', () => { | |
const rules = input.value.replace(/\/\*(.|\n)*?\*\//, '').split(';').map(item => item.split(':').map(x => String(x).trim())).filter(x => x && x[0] !== ''); | |
const output = JSON.stringify(css2rn.default(rules), null, 2); | |
const ok = output.replace(/ \"(.*)\":(.*)\n/g, (n, a, b) => { return ` ${a}: ${strrf(b)},\n`; }).replace(/,,/g, ','); | |
result.value = ok.substr(1, ok.length - 2).trim().replace(/\n\s+/g, '\n'); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
setTimeout(function(){ | |
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
// shim for using process in browser | |
var process = module.exports = {}; | |
// cached from whatever global is present so that test runners that stub it | |
// don't break things. But we need to wrap it in a try catch in case it is | |
// wrapped in strict mode code which doesn't define any globals. It's inside a | |
// function because try/catches deoptimize in certain engines. | |
var cachedSetTimeout; | |
var cachedClearTimeout; | |
function defaultSetTimout() { | |
throw new Error('setTimeout has not been defined'); | |
} | |
function defaultClearTimeout () { | |
throw new Error('clearTimeout has not been defined'); | |
} | |
(function () { | |
try { | |
if (typeof setTimeout === 'function') { | |
cachedSetTimeout = setTimeout; | |
} else { | |
cachedSetTimeout = defaultSetTimout; | |
} | |
} catch (e) { | |
cachedSetTimeout = defaultSetTimout; | |
} | |
try { | |
if (typeof clearTimeout === 'function') { | |
cachedClearTimeout = clearTimeout; | |
} else { | |
cachedClearTimeout = defaultClearTimeout; | |
} | |
} catch (e) { | |
cachedClearTimeout = defaultClearTimeout; | |
} | |
} ()) | |
function runTimeout(fun) { | |
if (cachedSetTimeout === setTimeout) { | |
//normal enviroments in sane situations | |
return setTimeout(fun, 0); | |
} | |
// if setTimeout wasn't available but was latter defined | |
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { | |
cachedSetTimeout = setTimeout; | |
return setTimeout(fun, 0); | |
} | |
try { | |
// when when somebody has screwed with setTimeout but no I.E. maddness | |
return cachedSetTimeout(fun, 0); | |
} catch(e){ | |
try { | |
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally | |
return cachedSetTimeout.call(null, fun, 0); | |
} catch(e){ | |
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error | |
return cachedSetTimeout.call(this, fun, 0); | |
} | |
} | |
} | |
function runClearTimeout(marker) { | |
if (cachedClearTimeout === clearTimeout) { | |
//normal enviroments in sane situations | |
return clearTimeout(marker); | |
} | |
// if clearTimeout wasn't available but was latter defined | |
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { | |
cachedClearTimeout = clearTimeout; | |
return clearTimeout(marker); | |
} | |
try { | |
// when when somebody has screwed with setTimeout but no I.E. maddness | |
return cachedClearTimeout(marker); | |
} catch (e){ | |
try { | |
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally | |
return cachedClearTimeout.call(null, marker); | |
} catch (e){ | |
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. | |
// Some versions of I.E. have different rules for clearTimeout vs setTimeout | |
return cachedClearTimeout.call(this, marker); | |
} | |
} | |
} | |
var queue = []; | |
var draining = false; | |
var currentQueue; | |
var queueIndex = -1; | |
function cleanUpNextTick() { | |
if (!draining || !currentQueue) { | |
return; | |
} | |
draining = false; | |
if (currentQueue.length) { | |
queue = currentQueue.concat(queue); | |
} else { | |
queueIndex = -1; | |
} | |
if (queue.length) { | |
drainQueue(); | |
} | |
} | |
function drainQueue() { | |
if (draining) { | |
return; | |
} | |
var timeout = runTimeout(cleanUpNextTick); | |
draining = true; | |
var len = queue.length; | |
while(len) { | |
currentQueue = queue; | |
queue = []; | |
while (++queueIndex < len) { | |
if (currentQueue) { | |
currentQueue[queueIndex].run(); | |
} | |
} | |
queueIndex = -1; | |
len = queue.length; | |
} | |
currentQueue = null; | |
draining = false; | |
runClearTimeout(timeout); | |
} | |
process.nextTick = function (fun) { | |
var args = new Array(arguments.length - 1); | |
if (arguments.length > 1) { | |
for (var i = 1; i < arguments.length; i++) { | |
args[i - 1] = arguments[i]; | |
} | |
} | |
queue.push(new Item(fun, args)); | |
if (queue.length === 1 && !draining) { | |
runTimeout(drainQueue); | |
} | |
}; | |
// v8 likes predictible objects | |
function Item(fun, array) { | |
this.fun = fun; | |
this.array = array; | |
} | |
Item.prototype.run = function () { | |
this.fun.apply(null, this.array); | |
}; | |
process.title = 'browser'; | |
process.browser = true; | |
process.env = {}; | |
process.argv = []; | |
process.version = ''; // empty string to avoid regexp issues | |
process.versions = {}; | |
function noop() {} | |
process.on = noop; | |
process.addListener = noop; | |
process.once = noop; | |
process.off = noop; | |
process.removeListener = noop; | |
process.removeAllListeners = noop; | |
process.emit = noop; | |
process.binding = function (name) { | |
throw new Error('process.binding is not supported'); | |
}; | |
process.cwd = function () { return '/' }; | |
process.chdir = function (dir) { | |
throw new Error('process.chdir is not supported'); | |
}; | |
process.umask = function() { return 0; }; | |
},{}],2:[function(require,module,exports){ | |
'use strict'; | |
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | |
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | |
var SYMBOL_MATCH = 'SYMBOL_MATCH'; | |
module.exports = function () { | |
function TokenStream(nodes, parent) { | |
_classCallCheck(this, TokenStream); | |
this.nodes = nodes; | |
this.parent = parent; | |
this.lastFunction = null; | |
this.lastValue = null; | |
} | |
_createClass(TokenStream, [{ | |
key: 'hasTokens', | |
value: function hasTokens() { | |
return this.nodes.length > 0; | |
} | |
}, { | |
key: 'lookahead', | |
value: function lookahead() { | |
return new TokenStream(this.nodes.slice(1), this.parent); | |
} | |
}, { | |
key: SYMBOL_MATCH, | |
value: function value() { | |
var node = this.node; | |
if (!node) return null; | |
for (var i = 0; i < arguments.length; i += 1) { | |
var tokenDescriptor = arguments.length <= i ? undefined : arguments[i]; | |
var value = tokenDescriptor(node); | |
if (value !== null) { | |
this.nodes = this.nodes.slice(1); | |
this.lastFunction = null; | |
this.lastValue = value; | |
return value; | |
} | |
} | |
return null; | |
} | |
}, { | |
key: 'matches', | |
value: function matches() { | |
return this[SYMBOL_MATCH].apply(this, arguments) !== null; | |
} | |
}, { | |
key: 'expect', | |
value: function expect() { | |
var value = this[SYMBOL_MATCH].apply(this, arguments); | |
if (value !== null) return value; | |
return this.throw(); | |
} | |
}, { | |
key: 'matchFunction', | |
value: function matchFunction() { | |
var node = this.node; | |
if (node.type !== 'function') return null; | |
var value = new TokenStream(node.nodes, node); | |
this.nodes = this.nodes.slice(1); | |
this.lastFunction = value; | |
this.lastValue = null; | |
return value; | |
} | |
}, { | |
key: 'expectFunction', | |
value: function expectFunction() { | |
var value = this.matchFunction(); | |
if (value !== null) return value; | |
return this.throw(); | |
} | |
}, { | |
key: 'expectEmpty', | |
value: function expectEmpty() { | |
if (this.hasTokens()) this.throw(); | |
} | |
}, { | |
key: 'throw', | |
value: function _throw() { | |
throw new Error('Unexpected token type: ' + this.node.type); | |
} | |
}, { | |
key: 'node', | |
get: function get() { | |
return this.nodes[0]; | |
} | |
}]); | |
return TokenStream; | |
}(); | |
},{}],3:[function(require,module,exports){ | |
'use strict'; | |
var _require = require('postcss-value-parser'), | |
stringify = _require.stringify; | |
var cssColorKeywords = require('css-color-keywords'); | |
var matchString = function matchString(node) { | |
if (node.type !== 'string') return null; | |
return node.value.replace(/\\([0-9a-f]{1,6})(?:\s|$)/gi, function (match, charCode) { | |
return String.fromCharCode(parseInt(charCode, 16)); | |
}).replace(/\\/g, ''); | |
}; | |
var hexColorRe = /^(#(?:[0-9a-f]{3,4}){1,2})$/i; | |
var cssFunctionNameRe = /^(rgba?|hsla?|hwb|lab|lch|gray|color)$/; | |
var matchColor = function matchColor(node) { | |
if (node.type === 'word' && (hexColorRe.test(node.value) || node.value in cssColorKeywords)) { | |
return node.value; | |
} else if (node.type === 'function' && cssFunctionNameRe.test(node.value)) { | |
return stringify(node); | |
} | |
return null; | |
}; | |
var noneRe = /^(none)$/i; | |
var autoRe = /^(auto)$/i; | |
var identRe = /(^-?[_a-z][_a-z0-9-]*$)/i; | |
// Note if these are wrong, you'll need to change index.js too | |
var numberRe = /^([+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?)$/; | |
// Note lengthRe is sneaky: you can omit units for 0 | |
var lengthRe = /^(0$|(?:[+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?)(?=px$))/; | |
var angleRe = /^([+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?(?:deg|rad))$/; | |
var percentRe = /^([+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?%)$/; | |
var noopToken = function noopToken(predicate) { | |
return function (node) { | |
return predicate(node) ? '<token>' : null; | |
}; | |
}; | |
var valueForTypeToken = function valueForTypeToken(type) { | |
return function (node) { | |
return node.type === type ? node.value : null; | |
}; | |
}; | |
var regExpToken = function regExpToken(regExp) { | |
var transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String; | |
return function (node) { | |
if (node.type !== 'word') return null; | |
var match = node.value.match(regExp); | |
if (match === null) return null; | |
var value = transform(match[1]); | |
return value; | |
}; | |
}; | |
module.exports.regExpToken = regExpToken; | |
module.exports.tokens = { | |
SPACE: noopToken(function (node) { | |
return node.type === 'space'; | |
}), | |
SLASH: noopToken(function (node) { | |
return node.type === 'div' && node.value === '/'; | |
}), | |
COMMA: noopToken(function (node) { | |
return node.type === 'div' && node.value === ','; | |
}), | |
WORD: valueForTypeToken('word'), | |
NONE: regExpToken(noneRe), | |
AUTO: regExpToken(autoRe), | |
NUMBER: regExpToken(numberRe, Number), | |
LENGTH: regExpToken(lengthRe, Number), | |
ANGLE: regExpToken(angleRe), | |
PERCENT: regExpToken(percentRe), | |
IDENT: regExpToken(identRe), | |
STRING: matchString, | |
COLOR: matchColor | |
}; | |
},{"css-color-keywords":11,"postcss-value-parser":14}],4:[function(require,module,exports){ | |
'use strict'; | |
var _require = require('../tokenTypes'), | |
tokens = _require.tokens; | |
var NONE = tokens.NONE, | |
AUTO = tokens.AUTO, | |
NUMBER = tokens.NUMBER, | |
LENGTH = tokens.LENGTH, | |
SPACE = tokens.SPACE; | |
var defaultFlexGrow = 1; | |
var defaultFlexShrink = 1; | |
var defaultFlexBasis = 0; | |
module.exports = function (tokenStream) { | |
var flexGrow = void 0; | |
var flexShrink = void 0; | |
var flexBasis = void 0; | |
if (tokenStream.matches(NONE)) { | |
tokenStream.expectEmpty(); | |
return { $merge: { flexGrow: 0, flexShrink: 0 } }; | |
} else if (tokenStream.matches(AUTO)) { | |
tokenStream.expectEmpty(); | |
return { $merge: { flexGrow: 1, flexShrink: 1 } }; | |
} | |
var partsParsed = 0; | |
while (partsParsed < 2 && tokenStream.hasTokens()) { | |
if (partsParsed !== 0) tokenStream.expect(SPACE); | |
if (flexGrow === undefined && tokenStream.matches(NUMBER)) { | |
flexGrow = tokenStream.lastValue; | |
if (tokenStream.lookahead().matches(NUMBER)) { | |
tokenStream.expect(SPACE); | |
flexShrink = tokenStream.expect(NUMBER); | |
} | |
} else if (flexBasis === undefined && tokenStream.matches(LENGTH)) { | |
flexBasis = tokenStream.lastValue; | |
} else { | |
tokenStream.throw(); | |
} | |
partsParsed += 1; | |
} | |
tokenStream.expectEmpty(); | |
if (flexGrow === undefined) flexGrow = defaultFlexGrow; | |
if (flexShrink === undefined) flexShrink = defaultFlexShrink; | |
if (flexBasis === undefined) flexBasis = defaultFlexBasis; | |
return { $merge: { flexGrow: flexGrow, flexShrink: flexShrink, flexBasis: flexBasis } }; | |
}; | |
},{"../tokenTypes":3}],5:[function(require,module,exports){ | |
'use strict'; | |
var parseFontFamily = require('./fontFamily'); | |
var _require = require('../tokenTypes'), | |
regExpToken = _require.regExpToken, | |
tokens = _require.tokens; | |
var SPACE = tokens.SPACE, | |
LENGTH = tokens.LENGTH, | |
NUMBER = tokens.NUMBER, | |
SLASH = tokens.SLASH; | |
var NORMAL = regExpToken(/^(normal)$/); | |
var STYLE = regExpToken(/^(italic)$/); | |
var WEIGHT = regExpToken(/^([1-9]00|bold)$/); | |
var VARIANT = regExpToken(/^(small-caps)$/); | |
var defaultFontStyle = 'normal'; | |
var defaultFontWeight = 'normal'; | |
var defaultFontVariant = []; | |
module.exports = function (tokenStream) { | |
var fontStyle = void 0; | |
var fontWeight = void 0; | |
var fontVariant = void 0; | |
// let fontSize; | |
var lineHeight = void 0; | |
// let fontFamily; | |
var numStyleWeightVariantMatched = 0; | |
while (numStyleWeightVariantMatched < 3 && tokenStream.hasTokens()) { | |
if (tokenStream.matches(NORMAL)) { | |
/* pass */ | |
} else if (fontStyle === undefined && tokenStream.matches(STYLE)) { | |
fontStyle = tokenStream.lastValue; | |
} else if (fontWeight === undefined && tokenStream.matches(WEIGHT)) { | |
fontWeight = tokenStream.lastValue; | |
} else if (fontVariant === undefined && tokenStream.matches(VARIANT)) { | |
fontVariant = [tokenStream.lastValue]; | |
} else { | |
break; | |
} | |
tokenStream.expect(SPACE); | |
numStyleWeightVariantMatched += 1; | |
} | |
var fontSize = tokenStream.expect(LENGTH); | |
if (tokenStream.matches(SLASH)) { | |
if (tokenStream.matches(NUMBER)) { | |
lineHeight = fontSize * tokenStream.lastValue; | |
} else { | |
lineHeight = tokenStream.expect(LENGTH); | |
} | |
} | |
tokenStream.expect(SPACE); | |
var fontFamily = parseFontFamily(tokenStream); | |
if (fontStyle === undefined) fontStyle = defaultFontStyle; | |
if (fontWeight === undefined) fontWeight = defaultFontWeight; | |
if (fontVariant === undefined) fontVariant = defaultFontVariant; | |
var out = { fontStyle: fontStyle, fontWeight: fontWeight, fontVariant: fontVariant, fontSize: fontSize, fontFamily: fontFamily }; | |
if (lineHeight !== undefined) out.lineHeight = lineHeight; | |
return { $merge: out }; | |
}; | |
},{"../tokenTypes":3,"./fontFamily":6}],6:[function(require,module,exports){ | |
'use strict'; | |
var _require = require('../tokenTypes'), | |
tokens = _require.tokens; | |
var SPACE = tokens.SPACE, | |
IDENT = tokens.IDENT, | |
STRING = tokens.STRING; | |
module.exports = function (tokenStream) { | |
var fontFamily = void 0; | |
if (tokenStream.matches(STRING)) { | |
fontFamily = tokenStream.lastValue; | |
} else { | |
fontFamily = tokenStream.expect(IDENT); | |
while (tokenStream.hasTokens()) { | |
tokenStream.expect(SPACE); | |
var nextIdent = tokenStream.expect(IDENT); | |
fontFamily += ' ' + nextIdent; | |
} | |
} | |
tokenStream.expectEmpty(); | |
return fontFamily; | |
}; | |
},{"../tokenTypes":3}],7:[function(require,module,exports){ | |
'use strict'; | |
var _require = require('../tokenTypes'), | |
regExpToken = _require.regExpToken, | |
tokens = _require.tokens; | |
var flex = require('./flex'); | |
var font = require('./font'); | |
var fontFamily = require('./fontFamily'); | |
var transform = require('./transform'); | |
var _require2 = require('./util'), | |
directionFactory = _require2.directionFactory, | |
anyOrderFactory = _require2.anyOrderFactory, | |
shadowOffsetFactory = _require2.shadowOffsetFactory; | |
var IDENT = tokens.IDENT, | |
WORD = tokens.WORD, | |
COLOR = tokens.COLOR; | |
var background = function background(tokenStream) { | |
return { $merge: { backgroundColor: tokenStream.expect(COLOR) } }; | |
}; | |
var border = anyOrderFactory({ | |
borderWidth: { | |
token: tokens.LENGTH, | |
default: 1 | |
}, | |
borderColor: { | |
token: COLOR, | |
default: 'black' | |
}, | |
borderStyle: { | |
token: regExpToken(/^(solid|dashed|dotted)$/), | |
default: 'solid' | |
} | |
}); | |
var borderColor = directionFactory({ | |
types: [WORD], | |
prefix: 'border', | |
suffix: 'Color' | |
}); | |
var borderRadius = directionFactory({ | |
directions: ['TopRight', 'BottomRight', 'BottomLeft', 'TopLeft'], | |
prefix: 'border', | |
suffix: 'Radius' | |
}); | |
var borderWidth = directionFactory({ prefix: 'border', suffix: 'Width' }); | |
var margin = directionFactory({ prefix: 'margin' }); | |
var padding = directionFactory({ prefix: 'padding' }); | |
var flexFlow = anyOrderFactory({ | |
flexWrap: { | |
token: regExpToken(/(nowrap|wrap|wrap-reverse)/), | |
default: 'nowrap' | |
}, | |
flexDirection: { | |
token: regExpToken(/(row|row-reverse|column|column-reverse)/), | |
default: 'row' | |
} | |
}); | |
var fontVariant = function fontVariant(tokenStream) { | |
return [tokenStream.expect(IDENT)]; | |
}; | |
var fontWeight = function fontWeight(tokenStream) { | |
return tokenStream.expect(WORD); | |
}; // Also match numbers as strings | |
var shadowOffset = shadowOffsetFactory(); | |
var textShadowOffset = shadowOffsetFactory(); | |
module.exports = { | |
background: background, | |
border: border, | |
borderColor: borderColor, | |
borderRadius: borderRadius, | |
borderWidth: borderWidth, | |
flex: flex, | |
flexFlow: flexFlow, | |
font: font, | |
fontFamily: fontFamily, | |
fontVariant: fontVariant, | |
fontWeight: fontWeight, | |
margin: margin, | |
padding: padding, | |
shadowOffset: shadowOffset, | |
textShadowOffset: textShadowOffset, | |
transform: transform | |
}; | |
},{"../tokenTypes":3,"./flex":4,"./font":5,"./fontFamily":6,"./transform":8,"./util":9}],8:[function(require,module,exports){ | |
'use strict'; | |
function _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; } | |
var _require = require('../tokenTypes'), | |
tokens = _require.tokens; | |
var SPACE = tokens.SPACE, | |
COMMA = tokens.COMMA, | |
LENGTH = tokens.LENGTH, | |
NUMBER = tokens.NUMBER, | |
ANGLE = tokens.ANGLE; | |
var oneOfType = function oneOfType(tokenType) { | |
return function (functionStream) { | |
var value = functionStream.expect(tokenType); | |
functionStream.expectEmpty(); | |
return value; | |
}; | |
}; | |
var singleNumber = oneOfType(NUMBER); | |
var singleLength = oneOfType(LENGTH); | |
var singleAngle = oneOfType(ANGLE); | |
var xyTransformFactory = function xyTransformFactory(tokenType) { | |
return function (key, valueIfOmitted) { | |
return function (functionStream) { | |
var x = functionStream.expect(tokenType); | |
var y = void 0; | |
if (functionStream.hasTokens()) { | |
functionStream.expect(COMMA); | |
y = functionStream.expect(tokenType); | |
} else if (valueIfOmitted !== undefined) { | |
y = valueIfOmitted; | |
} else { | |
// Assumption, if x === y, then we can omit XY | |
// I.e. scale(5) => [{ scale: 5 }] rather than [{ scaleX: 5 }, { scaleY: 5 }] | |
return x; | |
} | |
functionStream.expectEmpty(); | |
return [_defineProperty({}, key + 'Y', y), _defineProperty({}, key + 'X', x)]; | |
}; | |
}; | |
}; | |
var xyNumber = xyTransformFactory(NUMBER); | |
var xyLength = xyTransformFactory(LENGTH); | |
var xyAngle = xyTransformFactory(ANGLE); | |
var partTransforms = { | |
perspective: singleNumber, | |
scale: xyNumber('scale'), | |
scaleX: singleNumber, | |
scaleY: singleNumber, | |
translate: xyLength('translate', 0), | |
translateX: singleLength, | |
translateY: singleLength, | |
rotate: singleAngle, | |
rotateX: singleAngle, | |
rotateY: singleAngle, | |
rotateZ: singleAngle, | |
skewX: singleAngle, | |
skewY: singleAngle, | |
skew: xyAngle('skew', '0deg') | |
}; | |
module.exports = function (tokenStream) { | |
var transforms = []; | |
var didParseFirst = false; | |
while (tokenStream.hasTokens()) { | |
if (didParseFirst) tokenStream.expect(SPACE); | |
var functionStream = tokenStream.expectFunction(); | |
var transformName = functionStream.parent.value; | |
var transformedValues = partTransforms[transformName](functionStream); | |
if (!Array.isArray(transformedValues)) { | |
transformedValues = [_defineProperty({}, transformName, transformedValues)]; | |
} | |
transforms = transformedValues.concat(transforms); | |
didParseFirst = true; | |
} | |
return transforms; | |
}; | |
},{"../tokenTypes":3}],9:[function(require,module,exports){ | |
'use strict'; | |
function _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; } | |
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } | |
var _require = require('../tokenTypes'), | |
tokens = _require.tokens; | |
var LENGTH = tokens.LENGTH, | |
PERCENT = tokens.PERCENT, | |
SPACE = tokens.SPACE; | |
module.exports.directionFactory = function (_ref) { | |
var _ref$types = _ref.types, | |
types = _ref$types === undefined ? [LENGTH, PERCENT] : _ref$types, | |
_ref$directions = _ref.directions, | |
directions = _ref$directions === undefined ? ['Top', 'Right', 'Bottom', 'Left'] : _ref$directions, | |
_ref$prefix = _ref.prefix, | |
prefix = _ref$prefix === undefined ? '' : _ref$prefix, | |
_ref$suffix = _ref.suffix, | |
suffix = _ref$suffix === undefined ? '' : _ref$suffix; | |
return function (tokenStream) { | |
var _output; | |
var values = []; | |
// borderWidth doesn't currently allow a percent value, but may do in the future | |
values.push(tokenStream.expect.apply(tokenStream, _toConsumableArray(types))); | |
while (values.length < 4 && tokenStream.hasTokens()) { | |
tokenStream.expect(SPACE); | |
values.push(tokenStream.expect.apply(tokenStream, _toConsumableArray(types))); | |
} | |
tokenStream.expectEmpty(); | |
var top = values[0], | |
_values$ = values[1], | |
right = _values$ === undefined ? top : _values$, | |
_values$2 = values[2], | |
bottom = _values$2 === undefined ? top : _values$2, | |
_values$3 = values[3], | |
left = _values$3 === undefined ? right : _values$3; | |
var keyFor = function keyFor(n) { | |
return '' + prefix + directions[n] + suffix; | |
}; | |
var output = (_output = {}, _defineProperty(_output, keyFor(0), top), _defineProperty(_output, keyFor(1), right), _defineProperty(_output, keyFor(2), bottom), _defineProperty(_output, keyFor(3), left), _output); | |
return { $merge: output }; | |
}; | |
}; | |
module.exports.anyOrderFactory = function (properties) { | |
var delim = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SPACE; | |
return function (tokenStream) { | |
var propertyNames = Object.keys(properties); | |
var values = propertyNames.reduce(function (accum, propertyName) { | |
accum[propertyName] === undefined; // eslint-disable-line | |
return accum; | |
}, {}); | |
var numParsed = 0; | |
while (numParsed < propertyNames.length && tokenStream.hasTokens()) { | |
if (numParsed) tokenStream.expect(delim); | |
var matchedPropertyName = propertyNames.find(function (propertyName) { | |
return values[propertyName] === undefined && tokenStream.matches(properties[propertyName].token); | |
}); | |
if (!matchedPropertyName) { | |
tokenStream.throw(); | |
} else { | |
values[matchedPropertyName] = tokenStream.lastValue; | |
} | |
numParsed += 1; | |
} | |
tokenStream.expectEmpty(); | |
propertyNames.forEach(function (propertyName) { | |
if (values[propertyName] === undefined) values[propertyName] = properties[propertyName].default; | |
}); | |
return { $merge: values }; | |
}; | |
}; | |
module.exports.shadowOffsetFactory = function () { | |
return function (tokenStream) { | |
var width = tokenStream.expect(LENGTH); | |
var height = tokenStream.matches(SPACE) ? tokenStream.expect(LENGTH) : width; | |
tokenStream.expectEmpty(); | |
return { width: width, height: height }; | |
}; | |
}; | |
},{"../tokenTypes":3}],10:[function(require,module,exports){ | |
module.exports={ | |
"black": "#000000", | |
"silver": "#c0c0c0", | |
"gray": "#808080", | |
"white": "#ffffff", | |
"maroon": "#800000", | |
"red": "#ff0000", | |
"purple": "#800080", | |
"fuchsia": "#ff00ff", | |
"green": "#008000", | |
"lime": "#00ff00", | |
"olive": "#808000", | |
"yellow": "#ffff00", | |
"navy": "#000080", | |
"blue": "#0000ff", | |
"teal": "#008080", | |
"aqua": "#00ffff", | |
"orange": "#ffa500", | |
"aliceblue": "#f0f8ff", | |
"antiquewhite": "#faebd7", | |
"aquamarine": "#7fffd4", | |
"azure": "#f0ffff", | |
"beige": "#f5f5dc", | |
"bisque": "#ffe4c4", | |
"blanchedalmond": "#ffebcd", | |
"blueviolet": "#8a2be2", | |
"brown": "#a52a2a", | |
"burlywood": "#deb887", | |
"cadetblue": "#5f9ea0", | |
"chartreuse": "#7fff00", | |
"chocolate": "#d2691e", | |
"coral": "#ff7f50", | |
"cornflowerblue": "#6495ed", | |
"cornsilk": "#fff8dc", | |
"crimson": "#dc143c", | |
"darkblue": "#00008b", | |
"darkcyan": "#008b8b", | |
"darkgoldenrod": "#b8860b", | |
"darkgray": "#a9a9a9", | |
"darkgreen": "#006400", | |
"darkgrey": "#a9a9a9", | |
"darkkhaki": "#bdb76b", | |
"darkmagenta": "#8b008b", | |
"darkolivegreen": "#556b2f", | |
"darkorange": "#ff8c00", | |
"darkorchid": "#9932cc", | |
"darkred": "#8b0000", | |
"darksalmon": "#e9967a", | |
"darkseagreen": "#8fbc8f", | |
"darkslateblue": "#483d8b", | |
"darkslategray": "#2f4f4f", | |
"darkslategrey": "#2f4f4f", | |
"darkturquoise": "#00ced1", | |
"darkviolet": "#9400d3", | |
"deeppink": "#ff1493", | |
"deepskyblue": "#00bfff", | |
"dimgray": "#696969", | |
"dimgrey": "#696969", | |
"dodgerblue": "#1e90ff", | |
"firebrick": "#b22222", | |
"floralwhite": "#fffaf0", | |
"forestgreen": "#228b22", | |
"gainsboro": "#dcdcdc", | |
"ghostwhite": "#f8f8ff", | |
"gold": "#ffd700", | |
"goldenrod": "#daa520", | |
"greenyellow": "#adff2f", | |
"grey": "#808080", | |
"honeydew": "#f0fff0", | |
"hotpink": "#ff69b4", | |
"indianred": "#cd5c5c", | |
"indigo": "#4b0082", | |
"ivory": "#fffff0", | |
"khaki": "#f0e68c", | |
"lavender": "#e6e6fa", | |
"lavenderblush": "#fff0f5", | |
"lawngreen": "#7cfc00", | |
"lemonchiffon": "#fffacd", | |
"lightblue": "#add8e6", | |
"lightcoral": "#f08080", | |
"lightcyan": "#e0ffff", | |
"lightgoldenrodyellow": "#fafad2", | |
"lightgray": "#d3d3d3", | |
"lightgreen": "#90ee90", | |
"lightgrey": "#d3d3d3", | |
"lightpink": "#ffb6c1", | |
"lightsalmon": "#ffa07a", | |
"lightseagreen": "#20b2aa", | |
"lightskyblue": "#87cefa", | |
"lightslategray": "#778899", | |
"lightslategrey": "#778899", | |
"lightsteelblue": "#b0c4de", | |
"lightyellow": "#ffffe0", | |
"limegreen": "#32cd32", | |
"linen": "#faf0e6", | |
"mediumaquamarine": "#66cdaa", | |
"mediumblue": "#0000cd", | |
"mediumorchid": "#ba55d3", | |
"mediumpurple": "#9370db", | |
"mediumseagreen": "#3cb371", | |
"mediumslateblue": "#7b68ee", | |
"mediumspringgreen": "#00fa9a", | |
"mediumturquoise": "#48d1cc", | |
"mediumvioletred": "#c71585", | |
"midnightblue": "#191970", | |
"mintcream": "#f5fffa", | |
"mistyrose": "#ffe4e1", | |
"moccasin": "#ffe4b5", | |
"navajowhite": "#ffdead", | |
"oldlace": "#fdf5e6", | |
"olivedrab": "#6b8e23", | |
"orangered": "#ff4500", | |
"orchid": "#da70d6", | |
"palegoldenrod": "#eee8aa", | |
"palegreen": "#98fb98", | |
"paleturquoise": "#afeeee", | |
"palevioletred": "#db7093", | |
"papayawhip": "#ffefd5", | |
"peachpuff": "#ffdab9", | |
"peru": "#cd853f", | |
"pink": "#ffc0cb", | |
"plum": "#dda0dd", | |
"powderblue": "#b0e0e6", | |
"rosybrown": "#bc8f8f", | |
"royalblue": "#4169e1", | |
"saddlebrown": "#8b4513", | |
"salmon": "#fa8072", | |
"sandybrown": "#f4a460", | |
"seagreen": "#2e8b57", | |
"seashell": "#fff5ee", | |
"sienna": "#a0522d", | |
"skyblue": "#87ceeb", | |
"slateblue": "#6a5acd", | |
"slategray": "#708090", | |
"slategrey": "#708090", | |
"snow": "#fffafa", | |
"springgreen": "#00ff7f", | |
"steelblue": "#4682b4", | |
"tan": "#d2b48c", | |
"thistle": "#d8bfd8", | |
"tomato": "#ff6347", | |
"turquoise": "#40e0d0", | |
"violet": "#ee82ee", | |
"wheat": "#f5deb3", | |
"whitesmoke": "#f5f5f5", | |
"yellowgreen": "#9acd32", | |
"rebeccapurple": "#663399" | |
} | |
},{}],11:[function(require,module,exports){ | |
'use strict' | |
module.exports = require('./colors.json') | |
},{"./colors.json":10}],12:[function(require,module,exports){ | |
"use strict"; | |
/** | |
* Copyright (c) 2013-present, Facebook, Inc. | |
* All rights reserved. | |
* | |
* This source code is licensed under the BSD-style license found in the | |
* LICENSE file in the root directory of this source tree. An additional grant | |
* of patent rights can be found in the PATENTS file in the same directory. | |
* | |
* @typechecks | |
*/ | |
var _hyphenPattern = /-(.)/g; | |
/** | |
* Camelcases a hyphenated string, for example: | |
* | |
* > camelize('background-color') | |
* < "backgroundColor" | |
* | |
* @param {string} string | |
* @return {string} | |
*/ | |
function camelize(string) { | |
return string.replace(_hyphenPattern, function (_, character) { | |
return character.toUpperCase(); | |
}); | |
} | |
module.exports = camelize; | |
},{}],13:[function(require,module,exports){ | |
/** | |
* Copyright (c) 2013-present, Facebook, Inc. | |
* All rights reserved. | |
* | |
* This source code is licensed under the BSD-style license found in the | |
* LICENSE file in the root directory of this source tree. An additional grant | |
* of patent rights can be found in the PATENTS file in the same directory. | |
* | |
* @typechecks | |
*/ | |
'use strict'; | |
var camelize = require('./camelize'); | |
var msPattern = /^-ms-/; | |
/** | |
* Camelcases a hyphenated CSS property name, for example: | |
* | |
* > camelizeStyleName('background-color') | |
* < "backgroundColor" | |
* > camelizeStyleName('-moz-transition') | |
* < "MozTransition" | |
* > camelizeStyleName('-ms-transition') | |
* < "msTransition" | |
* | |
* As Andi Smith suggests | |
* (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix | |
* is converted to lowercase `ms`. | |
* | |
* @param {string} string | |
* @return {string} | |
*/ | |
function camelizeStyleName(string) { | |
return camelize(string.replace(msPattern, 'ms-')); | |
} | |
module.exports = camelizeStyleName; | |
},{"./camelize":12}],14:[function(require,module,exports){ | |
var parse = require('./parse'); | |
var walk = require('./walk'); | |
var stringify = require('./stringify'); | |
function ValueParser(value) { | |
if (this instanceof ValueParser) { | |
this.nodes = parse(value); | |
return this; | |
} | |
return new ValueParser(value); | |
} | |
ValueParser.prototype.toString = function () { | |
return Array.isArray(this.nodes) ? stringify(this.nodes) : ''; | |
}; | |
ValueParser.prototype.walk = function (cb, bubble) { | |
walk(this.nodes, cb, bubble); | |
return this; | |
}; | |
ValueParser.unit = require('./unit'); | |
ValueParser.walk = walk; | |
ValueParser.stringify = stringify; | |
module.exports = ValueParser; | |
},{"./parse":15,"./stringify":16,"./unit":17,"./walk":18}],15:[function(require,module,exports){ | |
var openParentheses = '('.charCodeAt(0); | |
var closeParentheses = ')'.charCodeAt(0); | |
var singleQuote = '\''.charCodeAt(0); | |
var doubleQuote = '"'.charCodeAt(0); | |
var backslash = '\\'.charCodeAt(0); | |
var slash = '/'.charCodeAt(0); | |
var comma = ','.charCodeAt(0); | |
var colon = ':'.charCodeAt(0); | |
var star = '*'.charCodeAt(0); | |
module.exports = function (input) { | |
var tokens = []; | |
var value = input; | |
var next, quote, prev, token, escape, escapePos, whitespacePos; | |
var pos = 0; | |
var code = value.charCodeAt(pos); | |
var max = value.length; | |
var stack = [{ nodes: tokens }]; | |
var balanced = 0; | |
var parent; | |
var name = ''; | |
var before = ''; | |
var after = ''; | |
while (pos < max) { | |
// Whitespaces | |
if (code <= 32) { | |
next = pos; | |
do { | |
next += 1; | |
code = value.charCodeAt(next); | |
} while (code <= 32); | |
token = value.slice(pos, next); | |
prev = tokens[tokens.length - 1]; | |
if (code === closeParentheses && balanced) { | |
after = token; | |
} else if (prev && prev.type === 'div') { | |
prev.after = token; | |
} else if (code === comma || code === colon || code === slash && value.charCodeAt(next + 1) !== star) { | |
before = token; | |
} else { | |
tokens.push({ | |
type: 'space', | |
sourceIndex: pos, | |
value: token | |
}); | |
} | |
pos = next; | |
// Quotes | |
} else if (code === singleQuote || code === doubleQuote) { | |
next = pos; | |
quote = code === singleQuote ? '\'' : '"'; | |
token = { | |
type: 'string', | |
sourceIndex: pos, | |
quote: quote | |
}; | |
do { | |
escape = false; | |
next = value.indexOf(quote, next + 1); | |
if (~next) { | |
escapePos = next; | |
while (value.charCodeAt(escapePos - 1) === backslash) { | |
escapePos -= 1; | |
escape = !escape; | |
} | |
} else { | |
value += quote; | |
next = value.length - 1; | |
token.unclosed = true; | |
} | |
} while (escape); | |
token.value = value.slice(pos + 1, next); | |
tokens.push(token); | |
pos = next + 1; | |
code = value.charCodeAt(pos); | |
// Comments | |
} else if (code === slash && value.charCodeAt(pos + 1) === star) { | |
token = { | |
type: 'comment', | |
sourceIndex: pos | |
}; | |
next = value.indexOf('*/', pos); | |
if (next === -1) { | |
token.unclosed = true; | |
next = value.length; | |
} | |
token.value = value.slice(pos + 2, next); | |
tokens.push(token); | |
pos = next + 2; | |
code = value.charCodeAt(pos); | |
// Dividers | |
} else if (code === slash || code === comma || code === colon) { | |
token = value[pos]; | |
tokens.push({ | |
type: 'div', | |
sourceIndex: pos - before.length, | |
value: token, | |
before: before, | |
after: '' | |
}); | |
before = ''; | |
pos += 1; | |
code = value.charCodeAt(pos); | |
// Open parentheses | |
} else if (openParentheses === code) { | |
// Whitespaces after open parentheses | |
next = pos; | |
do { | |
next += 1; | |
code = value.charCodeAt(next); | |
} while (code <= 32); | |
token = { | |
type: 'function', | |
sourceIndex: pos - name.length, | |
value: name, | |
before: value.slice(pos + 1, next) | |
}; | |
pos = next; | |
if (name === 'url' && code !== singleQuote && code !== doubleQuote) { | |
next -= 1; | |
do { | |
escape = false; | |
next = value.indexOf(')', next + 1); | |
if (~next) { | |
escapePos = next; | |
while (value.charCodeAt(escapePos - 1) === backslash) { | |
escapePos -= 1; | |
escape = !escape; | |
} | |
} else { | |
value += ')'; | |
next = value.length - 1; | |
token.unclosed = true; | |
} | |
} while (escape); | |
// Whitespaces before closed | |
whitespacePos = next; | |
do { | |
whitespacePos -= 1; | |
code = value.charCodeAt(whitespacePos); | |
} while (code <= 32); | |
if (pos !== whitespacePos + 1) { | |
token.nodes = [{ | |
type: 'word', | |
sourceIndex: pos, | |
value: value.slice(pos, whitespacePos + 1) | |
}]; | |
} else { | |
token.nodes = []; | |
} | |
if (token.unclosed && whitespacePos + 1 !== next) { | |
token.after = ''; | |
token.nodes.push({ | |
type: 'space', | |
sourceIndex: whitespacePos + 1, | |
value: value.slice(whitespacePos + 1, next) | |
}); | |
} else { | |
token.after = value.slice(whitespacePos + 1, next); | |
} | |
pos = next + 1; | |
code = value.charCodeAt(pos); | |
tokens.push(token); | |
} else { | |
balanced += 1; | |
token.after = ''; | |
tokens.push(token); | |
stack.push(token); | |
tokens = token.nodes = []; | |
parent = token; | |
} | |
name = ''; | |
// Close parentheses | |
} else if (closeParentheses === code && balanced) { | |
pos += 1; | |
code = value.charCodeAt(pos); | |
parent.after = after; | |
after = ''; | |
balanced -= 1; | |
stack.pop(); | |
parent = stack[balanced]; | |
tokens = parent.nodes; | |
// Words | |
} else { | |
next = pos; | |
do { | |
if (code === backslash) { | |
next += 1; | |
} | |
next += 1; | |
code = value.charCodeAt(next); | |
} while (next < max && !( | |
code <= 32 || | |
code === singleQuote || | |
code === doubleQuote || | |
code === comma || | |
code === colon || | |
code === slash || | |
code === openParentheses || | |
code === closeParentheses && balanced | |
)); | |
token = value.slice(pos, next); | |
if (openParentheses === code) { | |
name = token; | |
} else { | |
tokens.push({ | |
type: 'word', | |
sourceIndex: pos, | |
value: token | |
}); | |
} | |
pos = next; | |
} | |
} | |
for (pos = stack.length - 1; pos; pos -= 1) { | |
stack[pos].unclosed = true; | |
} | |
return stack[0].nodes; | |
}; | |
},{}],16:[function(require,module,exports){ | |
function stringifyNode(node, custom) { | |
var type = node.type; | |
var value = node.value; | |
var buf; | |
var customResult; | |
if (custom && (customResult = custom(node)) !== undefined) { | |
return customResult; | |
} else if (type === 'word' || type === 'space') { | |
return value; | |
} else if (type === 'string') { | |
buf = node.quote || ''; | |
return buf + value + (node.unclosed ? '' : buf); | |
} else if (type === 'comment') { | |
return '/*' + value + (node.unclosed ? '' : '*/'); | |
} else if (type === 'div') { | |
return (node.before || '') + value + (node.after || ''); | |
} else if (Array.isArray(node.nodes)) { | |
buf = stringify(node.nodes); | |
if (type !== 'function') { | |
return buf; | |
} | |
return value + '(' + (node.before || '') + buf + (node.after || '') + (node.unclosed ? '' : ')'); | |
} | |
return value; | |
} | |
function stringify(nodes, custom) { | |
var result, i; | |
if (Array.isArray(nodes)) { | |
result = ''; | |
for (i = nodes.length - 1; ~i; i -= 1) { | |
result = stringifyNode(nodes[i], custom) + result; | |
} | |
return result; | |
} | |
return stringifyNode(nodes, custom); | |
} | |
module.exports = stringify; | |
},{}],17:[function(require,module,exports){ | |
var minus = '-'.charCodeAt(0); | |
var plus = '+'.charCodeAt(0); | |
var dot = '.'.charCodeAt(0); | |
module.exports = function (value) { | |
var pos = 0; | |
var length = value.length; | |
var dotted = false; | |
var containsNumber = false; | |
var code; | |
var number = ''; | |
while (pos < length) { | |
code = value.charCodeAt(pos); | |
if (code >= 48 && code <= 57) { | |
number += value[pos]; | |
containsNumber = true; | |
} else if (code === dot) { | |
if (dotted) { | |
break; | |
} | |
dotted = true; | |
number += value[pos]; | |
} else if (code === plus || code === minus) { | |
if (pos !== 0) { | |
break; | |
} | |
number += value[pos]; | |
} else { | |
break; | |
} | |
pos += 1; | |
} | |
return containsNumber ? { | |
number: number, | |
unit: value.slice(pos) | |
} : false; | |
}; | |
},{}],18:[function(require,module,exports){ | |
module.exports = function walk(nodes, cb, bubble) { | |
var i, max, node, result; | |
for (i = 0, max = nodes.length; i < max; i += 1) { | |
node = nodes[i]; | |
if (!bubble) { | |
result = cb(node, i, nodes); | |
} | |
if (result !== false && node.type === 'function' && Array.isArray(node.nodes)) { | |
walk(node.nodes, cb, bubble); | |
} | |
if (bubble) { | |
cb(node, i, nodes); | |
} | |
} | |
}; | |
},{}],"css-to-react-native":[function(require,module,exports){ | |
(function (process){ | |
'use strict'; | |
Object.defineProperty(exports, "__esModule", { | |
value: true | |
}); | |
function _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; } | |
/* eslint-disable no-param-reassign */ | |
var parse = require('postcss-value-parser'); | |
var camelizeStyleName = require('fbjs/lib/camelizeStyleName'); | |
var transforms = require('./transforms'); | |
var TokenStream = require('./TokenStream'); | |
// Note if this is wrong, you'll need to change tokenTypes.js too | |
var numberOrLengthRe = /^([+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?)(?:px)?$/i; | |
var boolRe = /^true|false$/i; | |
// Undocumented export | |
var transformRawValue = exports.transformRawValue = function transformRawValue(input) { | |
var value = input.trim(); | |
var numberMatch = value.match(numberOrLengthRe); | |
if (numberMatch !== null) return Number(numberMatch[1]); | |
var boolMatch = input.match(boolRe); | |
if (boolMatch !== null) return boolMatch[0].toLowerCase() === 'true'; | |
return value; | |
}; | |
var baseTransformShorthandValue = function baseTransformShorthandValue(propName, inputValue) { | |
var ast = parse(inputValue.trim()); | |
var tokenStream = new TokenStream(ast.nodes); | |
return transforms[propName](tokenStream); | |
}; | |
var transformShorthandValue = process.env.NODE_ENV === 'production' ? baseTransformShorthandValue : function (propName, inputValue) { | |
try { | |
return baseTransformShorthandValue(propName, inputValue); | |
} catch (e) { | |
throw new Error('Failed to parse declaration "' + propName + ': ' + inputValue + '"'); | |
} | |
}; | |
var getStylesForProperty = exports.getStylesForProperty = function getStylesForProperty(propName, inputValue, allowShorthand) { | |
var isRawValue = allowShorthand === false || !(propName in transforms); | |
var propValue = isRawValue ? transformRawValue(inputValue) : transformShorthandValue(propName, inputValue.trim()); | |
return propValue && propValue.$merge ? propValue.$merge : _defineProperty({}, propName, propValue); | |
}; | |
var getPropertyName = exports.getPropertyName = camelizeStyleName; | |
exports.default = function (rules) { | |
var shorthandBlacklist = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; | |
return rules.reduce(function (accum, rule) { | |
var propertyName = getPropertyName(rule[0]); | |
var value = rule[1]; | |
var allowShorthand = shorthandBlacklist.indexOf(propertyName) === -1; | |
return Object.assign(accum, getStylesForProperty(propertyName, value, allowShorthand)); | |
}, {}); | |
}; | |
}).call(this,require('_process')) | |
},{"./TokenStream":2,"./transforms":7,"_process":1,"fbjs/lib/camelizeStyleName":13,"postcss-value-parser":14}]},{},[]) | |
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsImRpc3QvVG9rZW5TdHJlYW0uanMiLCJkaXN0L3Rva2VuVHlwZXMuanMiLCJkaXN0L3RyYW5zZm9ybXMvZmxleC5qcyIsImRpc3QvdHJhbnNmb3Jtcy9mb250LmpzIiwiZGlzdC90cmFuc2Zvcm1zL2ZvbnRGYW1pbHkuanMiLCJkaXN0L3RyYW5zZm9ybXMvaW5kZXguanMiLCJkaXN0L3RyYW5zZm9ybXMvdHJhbnNmb3JtLmpzIiwiZGlzdC90cmFuc2Zvcm1zL3V0aWwuanMiLCJub2RlX21vZHVsZXMvY3NzLWNvbG9yLWtleXdvcmRzL2NvbG9ycy5qc29uIiwibm9kZV9tb2R1bGVzL2Nzcy1jb2xvci1rZXl3b3Jkcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9jYW1lbGl6ZS5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9jYW1lbGl6ZVN0eWxlTmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9wb3N0Y3NzLXZhbHVlLXBhcnNlci9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9zdGNzcy12YWx1ZS1wYXJzZXIvbGliL3BhcnNlLmpzIiwibm9kZV9tb2R1bGVzL3Bvc3Rjc3MtdmFsdWUtcGFyc2VyL2xpYi9zdHJpbmdpZnkuanMiLCJub2RlX21vZHVsZXMvcG9zdGNzcy12YWx1ZS1wYXJzZXIvbGliL3VuaXQuanMiLCJub2RlX21vZHVsZXMvcG9zdGNzcy12YWx1ZS1wYXJzZXIvbGliL3dhbGsuanMiLCJkaXN0L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFNZTUJPTF9NQVRDSCA9ICdTWU1CT0xfTUFUQ0gnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVG9rZW5TdHJlYW0obm9kZXMsIHBhcmVudCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb2tlblN0cmVhbSk7XG5cbiAgICB0aGlzLm5vZGVzID0gbm9kZXM7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5sYXN0RnVuY3Rpb24gPSBudWxsO1xuICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUb2tlblN0cmVhbSwgW3tcbiAgICBrZXk6ICdoYXNUb2tlbnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNUb2tlbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5sZW5ndGggPiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2xvb2thaGVhZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvb2thaGVhZCgpIHtcbiAgICAgIHJldHVybiBuZXcgVG9rZW5TdHJlYW0odGhpcy5ub2Rlcy5zbGljZSgxKSwgdGhpcy5wYXJlbnQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogU1lNQk9MX01BVENILFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlO1xuXG4gICAgICBpZiAoIW5vZGUpIHJldHVybiBudWxsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgdG9rZW5EZXNjcmlwdG9yID0gYXJndW1lbnRzLmxlbmd0aCA8PSBpID8gdW5kZWZpbmVkIDogYXJndW1lbnRzW2ldO1xuICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbkRlc2NyaXB0b3Iobm9kZSk7XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5ub2RlcyA9IHRoaXMubm9kZXMuc2xpY2UoMSk7XG4gICAgICAgICAgdGhpcy5sYXN0RnVuY3Rpb24gPSBudWxsO1xuICAgICAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21hdGNoZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXRjaGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXNbU1lNQk9MX01BVENIXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICE9PSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2V4cGVjdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4cGVjdCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXNbU1lNQk9MX01BVENIXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSByZXR1cm4gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcy50aHJvdygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21hdGNoRnVuY3Rpb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXRjaEZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGU7XG4gICAgICBpZiAobm9kZS50eXBlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB2YWx1ZSA9IG5ldyBUb2tlblN0cmVhbShub2RlLm5vZGVzLCBub2RlKTtcbiAgICAgIHRoaXMubm9kZXMgPSB0aGlzLm5vZGVzLnNsaWNlKDEpO1xuICAgICAgdGhpcy5sYXN0RnVuY3Rpb24gPSB2YWx1ZTtcbiAgICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdleHBlY3RGdW5jdGlvbicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4cGVjdEZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5tYXRjaEZ1bmN0aW9uKCk7XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwpIHJldHVybiB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzLnRocm93KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZXhwZWN0RW1wdHknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHBlY3RFbXB0eSgpIHtcbiAgICAgIGlmICh0aGlzLmhhc1Rva2VucygpKSB0aGlzLnRocm93KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndGhyb3cnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdGhyb3coKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdG9rZW4gdHlwZTogJyArIHRoaXMubm9kZS50eXBlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdub2RlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzWzBdO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUb2tlblN0cmVhbTtcbn0oKTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJ3Bvc3Rjc3MtdmFsdWUtcGFyc2VyJyksXG4gICAgc3RyaW5naWZ5ID0gX3JlcXVpcmUuc3RyaW5naWZ5O1xuXG52YXIgY3NzQ29sb3JLZXl3b3JkcyA9IHJlcXVpcmUoJ2Nzcy1jb2xvci1rZXl3b3JkcycpO1xuXG52YXIgbWF0Y2hTdHJpbmcgPSBmdW5jdGlvbiBtYXRjaFN0cmluZyhub2RlKSB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIG5vZGUudmFsdWUucmVwbGFjZSgvXFxcXChbMC05YS1mXXsxLDZ9KSg/Olxcc3wkKS9naSwgZnVuY3Rpb24gKG1hdGNoLCBjaGFyQ29kZSkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGNoYXJDb2RlLCAxNikpO1xuICB9KS5yZXBsYWNlKC9cXFxcL2csICcnKTtcbn07XG5cbnZhciBoZXhDb2xvclJlID0gL14oIyg/OlswLTlhLWZdezMsNH0pezEsMn0pJC9pO1xudmFyIGNzc0Z1bmN0aW9uTmFtZVJlID0gL14ocmdiYT98aHNsYT98aHdifGxhYnxsY2h8Z3JheXxjb2xvcikkLztcblxudmFyIG1hdGNoQ29sb3IgPSBmdW5jdGlvbiBtYXRjaENvbG9yKG5vZGUpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3dvcmQnICYmIChoZXhDb2xvclJlLnRlc3Qobm9kZS52YWx1ZSkgfHwgbm9kZS52YWx1ZSBpbiBjc3NDb2xvcktleXdvcmRzKSkge1xuICAgIHJldHVybiBub2RlLnZhbHVlO1xuICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiBjc3NGdW5jdGlvbk5hbWVSZS50ZXN0KG5vZGUudmFsdWUpKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeShub2RlKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBub25lUmUgPSAvXihub25lKSQvaTtcbnZhciBhdXRvUmUgPSAvXihhdXRvKSQvaTtcbnZhciBpZGVudFJlID0gLyheLT9bX2Etel1bX2EtejAtOS1dKiQpL2k7XG4vLyBOb3RlIGlmIHRoZXNlIGFyZSB3cm9uZywgeW91J2xsIG5lZWQgdG8gY2hhbmdlIGluZGV4LmpzIHRvb1xudmFyIG51bWJlclJlID0gL14oWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W0VlXVsrLV0/XFxkKyk/KSQvO1xuLy8gTm90ZSBsZW5ndGhSZSBpcyBzbmVha3k6IHlvdSBjYW4gb21pdCB1bml0cyBmb3IgMFxudmFyIGxlbmd0aFJlID0gL14oMCR8KD86WystXT8oPzpcXGQqXFwuKT9cXGQrKD86W0VlXVsrLV0/XFxkKyk/KSg/PXB4JCkpLztcbnZhciBhbmdsZVJlID0gL14oWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W0VlXVsrLV0/XFxkKyk/KD86ZGVnfHJhZCkpJC87XG52YXIgcGVyY2VudFJlID0gL14oWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W0VlXVsrLV0/XFxkKyk/JSkkLztcblxudmFyIG5vb3BUb2tlbiA9IGZ1bmN0aW9uIG5vb3BUb2tlbihwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIHByZWRpY2F0ZShub2RlKSA/ICc8dG9rZW4+JyA6IG51bGw7XG4gIH07XG59O1xuXG52YXIgdmFsdWVGb3JUeXBlVG9rZW4gPSBmdW5jdGlvbiB2YWx1ZUZvclR5cGVUb2tlbih0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IHR5cGUgPyBub2RlLnZhbHVlIDogbnVsbDtcbiAgfTtcbn07XG5cbnZhciByZWdFeHBUb2tlbiA9IGZ1bmN0aW9uIHJlZ0V4cFRva2VuKHJlZ0V4cCkge1xuICB2YXIgdHJhbnNmb3JtID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBTdHJpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT09ICd3b3JkJykgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgbWF0Y2ggPSBub2RlLnZhbHVlLm1hdGNoKHJlZ0V4cCk7XG4gICAgaWYgKG1hdGNoID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIHZhciB2YWx1ZSA9IHRyYW5zZm9ybShtYXRjaFsxXSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5yZWdFeHBUb2tlbiA9IHJlZ0V4cFRva2VuO1xuXG5tb2R1bGUuZXhwb3J0cy50b2tlbnMgPSB7XG4gIFNQQUNFOiBub29wVG9rZW4oZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSAnc3BhY2UnO1xuICB9KSxcbiAgU0xBU0g6IG5vb3BUb2tlbihmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdkaXYnICYmIG5vZGUudmFsdWUgPT09ICcvJztcbiAgfSksXG4gIENPTU1BOiBub29wVG9rZW4oZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSAnZGl2JyAmJiBub2RlLnZhbHVlID09PSAnLCc7XG4gIH0pLFxuICBXT1JEOiB2YWx1ZUZvclR5cGVUb2tlbignd29yZCcpLFxuICBOT05FOiByZWdFeHBUb2tlbihub25lUmUpLFxuICBBVVRPOiByZWdFeHBUb2tlbihhdXRvUmUpLFxuICBOVU1CRVI6IHJlZ0V4cFRva2VuKG51bWJlclJlLCBOdW1iZXIpLFxuICBMRU5HVEg6IHJlZ0V4cFRva2VuKGxlbmd0aFJlLCBOdW1iZXIpLFxuICBBTkdMRTogcmVnRXhwVG9rZW4oYW5nbGVSZSksXG4gIFBFUkNFTlQ6IHJlZ0V4cFRva2VuKHBlcmNlbnRSZSksXG4gIElERU5UOiByZWdFeHBUb2tlbihpZGVudFJlKSxcbiAgU1RSSU5HOiBtYXRjaFN0cmluZyxcbiAgQ09MT1I6IG1hdGNoQ29sb3Jcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi90b2tlblR5cGVzJyksXG4gICAgdG9rZW5zID0gX3JlcXVpcmUudG9rZW5zO1xuXG52YXIgTk9ORSA9IHRva2Vucy5OT05FLFxuICAgIEFVVE8gPSB0b2tlbnMuQVVUTyxcbiAgICBOVU1CRVIgPSB0b2tlbnMuTlVNQkVSLFxuICAgIExFTkdUSCA9IHRva2Vucy5MRU5HVEgsXG4gICAgU1BBQ0UgPSB0b2tlbnMuU1BBQ0U7XG5cblxudmFyIGRlZmF1bHRGbGV4R3JvdyA9IDE7XG52YXIgZGVmYXVsdEZsZXhTaHJpbmsgPSAxO1xudmFyIGRlZmF1bHRGbGV4QmFzaXMgPSAwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0b2tlblN0cmVhbSkge1xuICB2YXIgZmxleEdyb3cgPSB2b2lkIDA7XG4gIHZhciBmbGV4U2hyaW5rID0gdm9pZCAwO1xuICB2YXIgZmxleEJhc2lzID0gdm9pZCAwO1xuXG4gIGlmICh0b2tlblN0cmVhbS5tYXRjaGVzKE5PTkUpKSB7XG4gICAgdG9rZW5TdHJlYW0uZXhwZWN0RW1wdHkoKTtcbiAgICByZXR1cm4geyAkbWVyZ2U6IHsgZmxleEdyb3c6IDAsIGZsZXhTaHJpbms6IDAgfSB9O1xuICB9IGVsc2UgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoQVVUTykpIHtcbiAgICB0b2tlblN0cmVhbS5leHBlY3RFbXB0eSgpO1xuICAgIHJldHVybiB7ICRtZXJnZTogeyBmbGV4R3JvdzogMSwgZmxleFNocmluazogMSB9IH07XG4gIH1cblxuICB2YXIgcGFydHNQYXJzZWQgPSAwO1xuICB3aGlsZSAocGFydHNQYXJzZWQgPCAyICYmIHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgaWYgKHBhcnRzUGFyc2VkICE9PSAwKSB0b2tlblN0cmVhbS5leHBlY3QoU1BBQ0UpO1xuXG4gICAgaWYgKGZsZXhHcm93ID09PSB1bmRlZmluZWQgJiYgdG9rZW5TdHJlYW0ubWF0Y2hlcyhOVU1CRVIpKSB7XG4gICAgICBmbGV4R3JvdyA9IHRva2VuU3RyZWFtLmxhc3RWYWx1ZTtcblxuICAgICAgaWYgKHRva2VuU3RyZWFtLmxvb2thaGVhZCgpLm1hdGNoZXMoTlVNQkVSKSkge1xuICAgICAgICB0b2tlblN0cmVhbS5leHBlY3QoU1BBQ0UpO1xuICAgICAgICBmbGV4U2hyaW5rID0gdG9rZW5TdHJlYW0uZXhwZWN0KE5VTUJFUik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmbGV4QmFzaXMgPT09IHVuZGVmaW5lZCAmJiB0b2tlblN0cmVhbS5tYXRjaGVzKExFTkdUSCkpIHtcbiAgICAgIGZsZXhCYXNpcyA9IHRva2VuU3RyZWFtLmxhc3RWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9rZW5TdHJlYW0udGhyb3coKTtcbiAgICB9XG5cbiAgICBwYXJ0c1BhcnNlZCArPSAxO1xuICB9XG5cbiAgdG9rZW5TdHJlYW0uZXhwZWN0RW1wdHkoKTtcblxuICBpZiAoZmxleEdyb3cgPT09IHVuZGVmaW5lZCkgZmxleEdyb3cgPSBkZWZhdWx0RmxleEdyb3c7XG4gIGlmIChmbGV4U2hyaW5rID09PSB1bmRlZmluZWQpIGZsZXhTaHJpbmsgPSBkZWZhdWx0RmxleFNocmluaztcbiAgaWYgKGZsZXhCYXNpcyA9PT0gdW5kZWZpbmVkKSBmbGV4QmFzaXMgPSBkZWZhdWx0RmxleEJhc2lzO1xuXG4gIHJldHVybiB7ICRtZXJnZTogeyBmbGV4R3JvdzogZmxleEdyb3csIGZsZXhTaHJpbms6IGZsZXhTaHJpbmssIGZsZXhCYXNpczogZmxleEJhc2lzIH0gfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGFyc2VGb250RmFtaWx5ID0gcmVxdWlyZSgnLi9mb250RmFtaWx5Jyk7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uL3Rva2VuVHlwZXMnKSxcbiAgICByZWdFeHBUb2tlbiA9IF9yZXF1aXJlLnJlZ0V4cFRva2VuLFxuICAgIHRva2VucyA9IF9yZXF1aXJlLnRva2VucztcblxudmFyIFNQQUNFID0gdG9rZW5zLlNQQUNFLFxuICAgIExFTkdUSCA9IHRva2Vucy5MRU5HVEgsXG4gICAgTlVNQkVSID0gdG9rZW5zLk5VTUJFUixcbiAgICBTTEFTSCA9IHRva2Vucy5TTEFTSDtcblxudmFyIE5PUk1BTCA9IHJlZ0V4cFRva2VuKC9eKG5vcm1hbCkkLyk7XG52YXIgU1RZTEUgPSByZWdFeHBUb2tlbigvXihpdGFsaWMpJC8pO1xudmFyIFdFSUdIVCA9IHJlZ0V4cFRva2VuKC9eKFsxLTldMDB8Ym9sZCkkLyk7XG52YXIgVkFSSUFOVCA9IHJlZ0V4cFRva2VuKC9eKHNtYWxsLWNhcHMpJC8pO1xuXG52YXIgZGVmYXVsdEZvbnRTdHlsZSA9ICdub3JtYWwnO1xudmFyIGRlZmF1bHRGb250V2VpZ2h0ID0gJ25vcm1hbCc7XG52YXIgZGVmYXVsdEZvbnRWYXJpYW50ID0gW107XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRva2VuU3RyZWFtKSB7XG4gIHZhciBmb250U3R5bGUgPSB2b2lkIDA7XG4gIHZhciBmb250V2VpZ2h0ID0gdm9pZCAwO1xuICB2YXIgZm9udFZhcmlhbnQgPSB2b2lkIDA7XG4gIC8vIGxldCBmb250U2l6ZTtcbiAgdmFyIGxpbmVIZWlnaHQgPSB2b2lkIDA7XG4gIC8vIGxldCBmb250RmFtaWx5O1xuXG4gIHZhciBudW1TdHlsZVdlaWdodFZhcmlhbnRNYXRjaGVkID0gMDtcbiAgd2hpbGUgKG51bVN0eWxlV2VpZ2h0VmFyaWFudE1hdGNoZWQgPCAzICYmIHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoTk9STUFMKSkge1xuICAgICAgLyogcGFzcyAqL1xuICAgIH0gZWxzZSBpZiAoZm9udFN0eWxlID09PSB1bmRlZmluZWQgJiYgdG9rZW5TdHJlYW0ubWF0Y2hlcyhTVFlMRSkpIHtcbiAgICAgIGZvbnRTdHlsZSA9IHRva2VuU3RyZWFtLmxhc3RWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGZvbnRXZWlnaHQgPT09IHVuZGVmaW5lZCAmJiB0b2tlblN0cmVhbS5tYXRjaGVzKFdFSUdIVCkpIHtcbiAgICAgIGZvbnRXZWlnaHQgPSB0b2tlblN0cmVhbS5sYXN0VmFsdWU7XG4gICAgfSBlbHNlIGlmIChmb250VmFyaWFudCA9PT0gdW5kZWZpbmVkICYmIHRva2VuU3RyZWFtLm1hdGNoZXMoVkFSSUFOVCkpIHtcbiAgICAgIGZvbnRWYXJpYW50ID0gW3Rva2VuU3RyZWFtLmxhc3RWYWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRva2VuU3RyZWFtLmV4cGVjdChTUEFDRSk7XG4gICAgbnVtU3R5bGVXZWlnaHRWYXJpYW50TWF0Y2hlZCArPSAxO1xuICB9XG5cbiAgdmFyIGZvbnRTaXplID0gdG9rZW5TdHJlYW0uZXhwZWN0KExFTkdUSCk7XG5cbiAgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoU0xBU0gpKSB7XG4gICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoTlVNQkVSKSkge1xuICAgICAgbGluZUhlaWdodCA9IGZvbnRTaXplICogdG9rZW5TdHJlYW0ubGFzdFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lSGVpZ2h0ID0gdG9rZW5TdHJlYW0uZXhwZWN0KExFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgdG9rZW5TdHJlYW0uZXhwZWN0KFNQQUNFKTtcblxuICB2YXIgZm9udEZhbWlseSA9IHBhcnNlRm9udEZhbWlseSh0b2tlblN0cmVhbSk7XG5cbiAgaWYgKGZvbnRTdHlsZSA9PT0gdW5kZWZpbmVkKSBmb250U3R5bGUgPSBkZWZhdWx0Rm9udFN0eWxlO1xuICBpZiAoZm9udFdlaWdodCA9PT0gdW5kZWZpbmVkKSBmb250V2VpZ2h0ID0gZGVmYXVsdEZvbnRXZWlnaHQ7XG4gIGlmIChmb250VmFyaWFudCA9PT0gdW5kZWZpbmVkKSBmb250VmFyaWFudCA9IGRlZmF1bHRGb250VmFyaWFudDtcblxuICB2YXIgb3V0ID0geyBmb250U3R5bGU6IGZvbnRTdHlsZSwgZm9udFdlaWdodDogZm9udFdlaWdodCwgZm9udFZhcmlhbnQ6IGZvbnRWYXJpYW50LCBmb250U2l6ZTogZm9udFNpemUsIGZvbnRGYW1pbHk6IGZvbnRGYW1pbHkgfTtcbiAgaWYgKGxpbmVIZWlnaHQgIT09IHVuZGVmaW5lZCkgb3V0LmxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0O1xuXG4gIHJldHVybiB7ICRtZXJnZTogb3V0IH07XG59OyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vdG9rZW5UeXBlcycpLFxuICAgIHRva2VucyA9IF9yZXF1aXJlLnRva2VucztcblxudmFyIFNQQUNFID0gdG9rZW5zLlNQQUNFLFxuICAgIElERU5UID0gdG9rZW5zLklERU5ULFxuICAgIFNUUklORyA9IHRva2Vucy5TVFJJTkc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodG9rZW5TdHJlYW0pIHtcbiAgdmFyIGZvbnRGYW1pbHkgPSB2b2lkIDA7XG5cbiAgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoU1RSSU5HKSkge1xuICAgIGZvbnRGYW1pbHkgPSB0b2tlblN0cmVhbS5sYXN0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgZm9udEZhbWlseSA9IHRva2VuU3RyZWFtLmV4cGVjdChJREVOVCk7XG4gICAgd2hpbGUgKHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgICB0b2tlblN0cmVhbS5leHBlY3QoU1BBQ0UpO1xuICAgICAgdmFyIG5leHRJZGVudCA9IHRva2VuU3RyZWFtLmV4cGVjdChJREVOVCk7XG4gICAgICBmb250RmFtaWx5ICs9ICcgJyArIG5leHRJZGVudDtcbiAgICB9XG4gIH1cblxuICB0b2tlblN0cmVhbS5leHBlY3RFbXB0eSgpO1xuXG4gIHJldHVybiBmb250RmFtaWx5O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uL3Rva2VuVHlwZXMnKSxcbiAgICByZWdFeHBUb2tlbiA9IF9yZXF1aXJlLnJlZ0V4cFRva2VuLFxuICAgIHRva2VucyA9IF9yZXF1aXJlLnRva2VucztcblxudmFyIGZsZXggPSByZXF1aXJlKCcuL2ZsZXgnKTtcbnZhciBmb250ID0gcmVxdWlyZSgnLi9mb250Jyk7XG52YXIgZm9udEZhbWlseSA9IHJlcXVpcmUoJy4vZm9udEZhbWlseScpO1xudmFyIHRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtJyk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL3V0aWwnKSxcbiAgICBkaXJlY3Rpb25GYWN0b3J5ID0gX3JlcXVpcmUyLmRpcmVjdGlvbkZhY3RvcnksXG4gICAgYW55T3JkZXJGYWN0b3J5ID0gX3JlcXVpcmUyLmFueU9yZGVyRmFjdG9yeSxcbiAgICBzaGFkb3dPZmZzZXRGYWN0b3J5ID0gX3JlcXVpcmUyLnNoYWRvd09mZnNldEZhY3Rvcnk7XG5cbnZhciBJREVOVCA9IHRva2Vucy5JREVOVCxcbiAgICBXT1JEID0gdG9rZW5zLldPUkQsXG4gICAgQ09MT1IgPSB0b2tlbnMuQ09MT1I7XG5cblxudmFyIGJhY2tncm91bmQgPSBmdW5jdGlvbiBiYWNrZ3JvdW5kKHRva2VuU3RyZWFtKSB7XG4gIHJldHVybiB7ICRtZXJnZTogeyBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuU3RyZWFtLmV4cGVjdChDT0xPUikgfSB9O1xufTtcbnZhciBib3JkZXIgPSBhbnlPcmRlckZhY3Rvcnkoe1xuICBib3JkZXJXaWR0aDoge1xuICAgIHRva2VuOiB0b2tlbnMuTEVOR1RILFxuICAgIGRlZmF1bHQ6IDFcbiAgfSxcbiAgYm9yZGVyQ29sb3I6IHtcbiAgICB0b2tlbjogQ09MT1IsXG4gICAgZGVmYXVsdDogJ2JsYWNrJ1xuICB9LFxuICBib3JkZXJTdHlsZToge1xuICAgIHRva2VuOiByZWdFeHBUb2tlbigvXihzb2xpZHxkYXNoZWR8ZG90dGVkKSQvKSxcbiAgICBkZWZhdWx0OiAnc29saWQnXG4gIH1cbn0pO1xudmFyIGJvcmRlckNvbG9yID0gZGlyZWN0aW9uRmFjdG9yeSh7XG4gIHR5cGVzOiBbV09SRF0sXG4gIHByZWZpeDogJ2JvcmRlcicsXG4gIHN1ZmZpeDogJ0NvbG9yJ1xufSk7XG52YXIgYm9yZGVyUmFkaXVzID0gZGlyZWN0aW9uRmFjdG9yeSh7XG4gIGRpcmVjdGlvbnM6IFsnVG9wUmlnaHQnLCAnQm90dG9tUmlnaHQnLCAnQm90dG9tTGVmdCcsICdUb3BMZWZ0J10sXG4gIHByZWZpeDogJ2JvcmRlcicsXG4gIHN1ZmZpeDogJ1JhZGl1cydcbn0pO1xudmFyIGJvcmRlcldpZHRoID0gZGlyZWN0aW9uRmFjdG9yeSh7IHByZWZpeDogJ2JvcmRlcicsIHN1ZmZpeDogJ1dpZHRoJyB9KTtcbnZhciBtYXJnaW4gPSBkaXJlY3Rpb25GYWN0b3J5KHsgcHJlZml4OiAnbWFyZ2luJyB9KTtcbnZhciBwYWRkaW5nID0gZGlyZWN0aW9uRmFjdG9yeSh7IHByZWZpeDogJ3BhZGRpbmcnIH0pO1xudmFyIGZsZXhGbG93ID0gYW55T3JkZXJGYWN0b3J5KHtcbiAgZmxleFdyYXA6IHtcbiAgICB0b2tlbjogcmVnRXhwVG9rZW4oLyhub3dyYXB8d3JhcHx3cmFwLXJldmVyc2UpLyksXG4gICAgZGVmYXVsdDogJ25vd3JhcCdcbiAgfSxcbiAgZmxleERpcmVjdGlvbjoge1xuICAgIHRva2VuOiByZWdFeHBUb2tlbigvKHJvd3xyb3ctcmV2ZXJzZXxjb2x1bW58Y29sdW1uLXJldmVyc2UpLyksXG4gICAgZGVmYXVsdDogJ3JvdydcbiAgfVxufSk7XG52YXIgZm9udFZhcmlhbnQgPSBmdW5jdGlvbiBmb250VmFyaWFudCh0b2tlblN0cmVhbSkge1xuICByZXR1cm4gW3Rva2VuU3RyZWFtLmV4cGVjdChJREVOVCldO1xufTtcbnZhciBmb250V2VpZ2h0ID0gZnVuY3Rpb24gZm9udFdlaWdodCh0b2tlblN0cmVhbSkge1xuICByZXR1cm4gdG9rZW5TdHJlYW0uZXhwZWN0KFdPUkQpO1xufTsgLy8gQWxzbyBtYXRjaCBudW1iZXJzIGFzIHN0cmluZ3NcbnZhciBzaGFkb3dPZmZzZXQgPSBzaGFkb3dPZmZzZXRGYWN0b3J5KCk7XG52YXIgdGV4dFNoYWRvd09mZnNldCA9IHNoYWRvd09mZnNldEZhY3RvcnkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGJhY2tncm91bmQ6IGJhY2tncm91bmQsXG4gIGJvcmRlcjogYm9yZGVyLFxuICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzLFxuICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGgsXG4gIGZsZXg6IGZsZXgsXG4gIGZsZXhGbG93OiBmbGV4RmxvdyxcbiAgZm9udDogZm9udCxcbiAgZm9udEZhbWlseTogZm9udEZhbWlseSxcbiAgZm9udFZhcmlhbnQ6IGZvbnRWYXJpYW50LFxuICBmb250V2VpZ2h0OiBmb250V2VpZ2h0LFxuICBtYXJnaW46IG1hcmdpbixcbiAgcGFkZGluZzogcGFkZGluZyxcbiAgc2hhZG93T2Zmc2V0OiBzaGFkb3dPZmZzZXQsXG4gIHRleHRTaGFkb3dPZmZzZXQ6IHRleHRTaGFkb3dPZmZzZXQsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59OyIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vdG9rZW5UeXBlcycpLFxuICAgIHRva2VucyA9IF9yZXF1aXJlLnRva2VucztcblxudmFyIFNQQUNFID0gdG9rZW5zLlNQQUNFLFxuICAgIENPTU1BID0gdG9rZW5zLkNPTU1BLFxuICAgIExFTkdUSCA9IHRva2Vucy5MRU5HVEgsXG4gICAgTlVNQkVSID0gdG9rZW5zLk5VTUJFUixcbiAgICBBTkdMRSA9IHRva2Vucy5BTkdMRTtcblxuXG52YXIgb25lT2ZUeXBlID0gZnVuY3Rpb24gb25lT2ZUeXBlKHRva2VuVHlwZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGZ1bmN0aW9uU3RyZWFtKSB7XG4gICAgdmFyIHZhbHVlID0gZnVuY3Rpb25TdHJlYW0uZXhwZWN0KHRva2VuVHlwZSk7XG4gICAgZnVuY3Rpb25TdHJlYW0uZXhwZWN0RW1wdHkoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuXG52YXIgc2luZ2xlTnVtYmVyID0gb25lT2ZUeXBlKE5VTUJFUik7XG52YXIgc2luZ2xlTGVuZ3RoID0gb25lT2ZUeXBlKExFTkdUSCk7XG52YXIgc2luZ2xlQW5nbGUgPSBvbmVPZlR5cGUoQU5HTEUpO1xudmFyIHh5VHJhbnNmb3JtRmFjdG9yeSA9IGZ1bmN0aW9uIHh5VHJhbnNmb3JtRmFjdG9yeSh0b2tlblR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlSWZPbWl0dGVkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChmdW5jdGlvblN0cmVhbSkge1xuICAgICAgdmFyIHggPSBmdW5jdGlvblN0cmVhbS5leHBlY3QodG9rZW5UeXBlKTtcblxuICAgICAgdmFyIHkgPSB2b2lkIDA7XG4gICAgICBpZiAoZnVuY3Rpb25TdHJlYW0uaGFzVG9rZW5zKCkpIHtcbiAgICAgICAgZnVuY3Rpb25TdHJlYW0uZXhwZWN0KENPTU1BKTtcbiAgICAgICAgeSA9IGZ1bmN0aW9uU3RyZWFtLmV4cGVjdCh0b2tlblR5cGUpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZUlmT21pdHRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHkgPSB2YWx1ZUlmT21pdHRlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFzc3VtcHRpb24sIGlmIHggPT09IHksIHRoZW4gd2UgY2FuIG9taXQgWFlcbiAgICAgICAgLy8gSS5lLiBzY2FsZSg1KSA9PiBbeyBzY2FsZTogNSB9XSByYXRoZXIgdGhhbiBbeyBzY2FsZVg6IDUgfSwgeyBzY2FsZVk6IDUgfV1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uU3RyZWFtLmV4cGVjdEVtcHR5KCk7XG5cbiAgICAgIHJldHVybiBbX2RlZmluZVByb3BlcnR5KHt9LCBrZXkgKyAnWScsIHkpLCBfZGVmaW5lUHJvcGVydHkoe30sIGtleSArICdYJywgeCldO1xuICAgIH07XG4gIH07XG59O1xudmFyIHh5TnVtYmVyID0geHlUcmFuc2Zvcm1GYWN0b3J5KE5VTUJFUik7XG52YXIgeHlMZW5ndGggPSB4eVRyYW5zZm9ybUZhY3RvcnkoTEVOR1RIKTtcbnZhciB4eUFuZ2xlID0geHlUcmFuc2Zvcm1GYWN0b3J5KEFOR0xFKTtcblxudmFyIHBhcnRUcmFuc2Zvcm1zID0ge1xuICBwZXJzcGVjdGl2ZTogc2luZ2xlTnVtYmVyLFxuICBzY2FsZTogeHlOdW1iZXIoJ3NjYWxlJyksXG4gIHNjYWxlWDogc2luZ2xlTnVtYmVyLFxuICBzY2FsZVk6IHNpbmdsZU51bWJlcixcbiAgdHJhbnNsYXRlOiB4eUxlbmd0aCgndHJhbnNsYXRlJywgMCksXG4gIHRyYW5zbGF0ZVg6IHNpbmdsZUxlbmd0aCxcbiAgdHJhbnNsYXRlWTogc2luZ2xlTGVuZ3RoLFxuICByb3RhdGU6IHNpbmdsZUFuZ2xlLFxuICByb3RhdGVYOiBzaW5nbGVBbmdsZSxcbiAgcm90YXRlWTogc2luZ2xlQW5nbGUsXG4gIHJvdGF0ZVo6IHNpbmdsZUFuZ2xlLFxuICBza2V3WDogc2luZ2xlQW5nbGUsXG4gIHNrZXdZOiBzaW5nbGVBbmdsZSxcbiAgc2tldzogeHlBbmdsZSgnc2tldycsICcwZGVnJylcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRva2VuU3RyZWFtKSB7XG4gIHZhciB0cmFuc2Zvcm1zID0gW107XG5cbiAgdmFyIGRpZFBhcnNlRmlyc3QgPSBmYWxzZTtcbiAgd2hpbGUgKHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgaWYgKGRpZFBhcnNlRmlyc3QpIHRva2VuU3RyZWFtLmV4cGVjdChTUEFDRSk7XG5cbiAgICB2YXIgZnVuY3Rpb25TdHJlYW0gPSB0b2tlblN0cmVhbS5leHBlY3RGdW5jdGlvbigpO1xuICAgIHZhciB0cmFuc2Zvcm1OYW1lID0gZnVuY3Rpb25TdHJlYW0ucGFyZW50LnZhbHVlO1xuICAgIHZhciB0cmFuc2Zvcm1lZFZhbHVlcyA9IHBhcnRUcmFuc2Zvcm1zW3RyYW5zZm9ybU5hbWVdKGZ1bmN0aW9uU3RyZWFtKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHJhbnNmb3JtZWRWYWx1ZXMpKSB7XG4gICAgICB0cmFuc2Zvcm1lZFZhbHVlcyA9IFtfZGVmaW5lUHJvcGVydHkoe30sIHRyYW5zZm9ybU5hbWUsIHRyYW5zZm9ybWVkVmFsdWVzKV07XG4gICAgfVxuICAgIHRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1lZFZhbHVlcy5jb25jYXQodHJhbnNmb3Jtcyk7XG5cbiAgICBkaWRQYXJzZUZpcnN0ID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2Zvcm1zO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi90b2tlblR5cGVzJyksXG4gICAgdG9rZW5zID0gX3JlcXVpcmUudG9rZW5zO1xuXG52YXIgTEVOR1RIID0gdG9rZW5zLkxFTkdUSCxcbiAgICBQRVJDRU5UID0gdG9rZW5zLlBFUkNFTlQsXG4gICAgU1BBQ0UgPSB0b2tlbnMuU1BBQ0U7XG5cblxubW9kdWxlLmV4cG9ydHMuZGlyZWN0aW9uRmFjdG9yeSA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBfcmVmJHR5cGVzID0gX3JlZi50eXBlcyxcbiAgICAgIHR5cGVzID0gX3JlZiR0eXBlcyA9PT0gdW5kZWZpbmVkID8gW0xFTkdUSCwgUEVSQ0VOVF0gOiBfcmVmJHR5cGVzLFxuICAgICAgX3JlZiRkaXJlY3Rpb25zID0gX3JlZi5kaXJlY3Rpb25zLFxuICAgICAgZGlyZWN0aW9ucyA9IF9yZWYkZGlyZWN0aW9ucyA9PT0gdW5kZWZpbmVkID8gWydUb3AnLCAnUmlnaHQnLCAnQm90dG9tJywgJ0xlZnQnXSA6IF9yZWYkZGlyZWN0aW9ucyxcbiAgICAgIF9yZWYkcHJlZml4ID0gX3JlZi5wcmVmaXgsXG4gICAgICBwcmVmaXggPSBfcmVmJHByZWZpeCA9PT0gdW5kZWZpbmVkID8gJycgOiBfcmVmJHByZWZpeCxcbiAgICAgIF9yZWYkc3VmZml4ID0gX3JlZi5zdWZmaXgsXG4gICAgICBzdWZmaXggPSBfcmVmJHN1ZmZpeCA9PT0gdW5kZWZpbmVkID8gJycgOiBfcmVmJHN1ZmZpeDtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0b2tlblN0cmVhbSkge1xuICAgIHZhciBfb3V0cHV0O1xuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgLy8gYm9yZGVyV2lkdGggZG9lc24ndCBjdXJyZW50bHkgYWxsb3cgYSBwZXJjZW50IHZhbHVlLCBidXQgbWF5IGRvIGluIHRoZSBmdXR1cmVcbiAgICB2YWx1ZXMucHVzaCh0b2tlblN0cmVhbS5leHBlY3QuYXBwbHkodG9rZW5TdHJlYW0sIF90b0NvbnN1bWFibGVBcnJheSh0eXBlcykpKTtcblxuICAgIHdoaWxlICh2YWx1ZXMubGVuZ3RoIDwgNCAmJiB0b2tlblN0cmVhbS5oYXNUb2tlbnMoKSkge1xuICAgICAgdG9rZW5TdHJlYW0uZXhwZWN0KFNQQUNFKTtcbiAgICAgIHZhbHVlcy5wdXNoKHRva2VuU3RyZWFtLmV4cGVjdC5hcHBseSh0b2tlblN0cmVhbSwgX3RvQ29uc3VtYWJsZUFycmF5KHR5cGVzKSkpO1xuICAgIH1cblxuICAgIHRva2VuU3RyZWFtLmV4cGVjdEVtcHR5KCk7XG5cbiAgICB2YXIgdG9wID0gdmFsdWVzWzBdLFxuICAgICAgICBfdmFsdWVzJCA9IHZhbHVlc1sxXSxcbiAgICAgICAgcmlnaHQgPSBfdmFsdWVzJCA9PT0gdW5kZWZpbmVkID8gdG9wIDogX3ZhbHVlcyQsXG4gICAgICAgIF92YWx1ZXMkMiA9IHZhbHVlc1syXSxcbiAgICAgICAgYm90dG9tID0gX3ZhbHVlcyQyID09PSB1bmRlZmluZWQgPyB0b3AgOiBfdmFsdWVzJDIsXG4gICAgICAgIF92YWx1ZXMkMyA9IHZhbHVlc1szXSxcbiAgICAgICAgbGVmdCA9IF92YWx1ZXMkMyA9PT0gdW5kZWZpbmVkID8gcmlnaHQgOiBfdmFsdWVzJDM7XG5cblxuICAgIHZhciBrZXlGb3IgPSBmdW5jdGlvbiBrZXlGb3Iobikge1xuICAgICAgcmV0dXJuICcnICsgcHJlZml4ICsgZGlyZWN0aW9uc1tuXSArIHN1ZmZpeDtcbiAgICB9O1xuXG4gICAgdmFyIG91dHB1dCA9IChfb3V0cHV0ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfb3V0cHV0LCBrZXlGb3IoMCksIHRvcCksIF9kZWZpbmVQcm9wZXJ0eShfb3V0cHV0LCBrZXlGb3IoMSksIHJpZ2h0KSwgX2RlZmluZVByb3BlcnR5KF9vdXRwdXQsIGtleUZvcigyKSwgYm90dG9tKSwgX2RlZmluZVByb3BlcnR5KF9vdXRwdXQsIGtleUZvcigzKSwgbGVmdCksIF9vdXRwdXQpO1xuXG4gICAgcmV0dXJuIHsgJG1lcmdlOiBvdXRwdXQgfTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmFueU9yZGVyRmFjdG9yeSA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG4gIHZhciBkZWxpbSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogU1BBQ0U7XG4gIHJldHVybiBmdW5jdGlvbiAodG9rZW5TdHJlYW0pIHtcbiAgICB2YXIgcHJvcGVydHlOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIHZhciB2YWx1ZXMgPSBwcm9wZXJ0eU5hbWVzLnJlZHVjZShmdW5jdGlvbiAoYWNjdW0sIHByb3BlcnR5TmFtZSkge1xuICAgICAgYWNjdW1bcHJvcGVydHlOYW1lXSA9PT0gdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwge30pO1xuXG4gICAgdmFyIG51bVBhcnNlZCA9IDA7XG4gICAgd2hpbGUgKG51bVBhcnNlZCA8IHByb3BlcnR5TmFtZXMubGVuZ3RoICYmIHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgICBpZiAobnVtUGFyc2VkKSB0b2tlblN0cmVhbS5leHBlY3QoZGVsaW0pO1xuXG4gICAgICB2YXIgbWF0Y2hlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXMuZmluZChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXNbcHJvcGVydHlOYW1lXSA9PT0gdW5kZWZpbmVkICYmIHRva2VuU3RyZWFtLm1hdGNoZXMocHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLnRva2VuKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW1hdGNoZWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgdG9rZW5TdHJlYW0udGhyb3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc1ttYXRjaGVkUHJvcGVydHlOYW1lXSA9IHRva2VuU3RyZWFtLmxhc3RWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgbnVtUGFyc2VkICs9IDE7XG4gICAgfVxuXG4gICAgdG9rZW5TdHJlYW0uZXhwZWN0RW1wdHkoKTtcblxuICAgIHByb3BlcnR5TmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICBpZiAodmFsdWVzW3Byb3BlcnR5TmFtZV0gPT09IHVuZGVmaW5lZCkgdmFsdWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0uZGVmYXVsdDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7ICRtZXJnZTogdmFsdWVzIH07XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zaGFkb3dPZmZzZXRGYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRva2VuU3RyZWFtKSB7XG4gICAgdmFyIHdpZHRoID0gdG9rZW5TdHJlYW0uZXhwZWN0KExFTkdUSCk7XG4gICAgdmFyIGhlaWdodCA9IHRva2VuU3RyZWFtLm1hdGNoZXMoU1BBQ0UpID8gdG9rZW5TdHJlYW0uZXhwZWN0KExFTkdUSCkgOiB3aWR0aDtcbiAgICB0b2tlblN0cmVhbS5leHBlY3RFbXB0eSgpO1xuICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgfTtcbn07IiwibW9kdWxlLmV4cG9ydHM9e1xuICBcImJsYWNrXCI6IFwiIzAwMDAwMFwiLFxuICBcInNpbHZlclwiOiBcIiNjMGMwYzBcIixcbiAgXCJncmF5XCI6IFwiIzgwODA4MFwiLFxuICBcIndoaXRlXCI6IFwiI2ZmZmZmZlwiLFxuICBcIm1hcm9vblwiOiBcIiM4MDAwMDBcIixcbiAgXCJyZWRcIjogXCIjZmYwMDAwXCIsXG4gIFwicHVycGxlXCI6IFwiIzgwMDA4MFwiLFxuICBcImZ1Y2hzaWFcIjogXCIjZmYwMGZmXCIsXG4gIFwiZ3JlZW5cIjogXCIjMDA4MDAwXCIsXG4gIFwibGltZVwiOiBcIiMwMGZmMDBcIixcbiAgXCJvbGl2ZVwiOiBcIiM4MDgwMDBcIixcbiAgXCJ5ZWxsb3dcIjogXCIjZmZmZjAwXCIsXG4gIFwibmF2eVwiOiBcIiMwMDAwODBcIixcbiAgXCJibHVlXCI6IFwiIzAwMDBmZlwiLFxuICBcInRlYWxcIjogXCIjMDA4MDgwXCIsXG4gIFwiYXF1YVwiOiBcIiMwMGZmZmZcIixcbiAgXCJvcmFuZ2VcIjogXCIjZmZhNTAwXCIsXG4gIFwiYWxpY2VibHVlXCI6IFwiI2YwZjhmZlwiLFxuICBcImFudGlxdWV3aGl0ZVwiOiBcIiNmYWViZDdcIixcbiAgXCJhcXVhbWFyaW5lXCI6IFwiIzdmZmZkNFwiLFxuICBcImF6dXJlXCI6IFwiI2YwZmZmZlwiLFxuICBcImJlaWdlXCI6IFwiI2Y1ZjVkY1wiLFxuICBcImJpc3F1ZVwiOiBcIiNmZmU0YzRcIixcbiAgXCJibGFuY2hlZGFsbW9uZFwiOiBcIiNmZmViY2RcIixcbiAgXCJibHVldmlvbGV0XCI6IFwiIzhhMmJlMlwiLFxuICBcImJyb3duXCI6IFwiI2E1MmEyYVwiLFxuICBcImJ1cmx5d29vZFwiOiBcIiNkZWI4ODdcIixcbiAgXCJjYWRldGJsdWVcIjogXCIjNWY5ZWEwXCIsXG4gIFwiY2hhcnRyZXVzZVwiOiBcIiM3ZmZmMDBcIixcbiAgXCJjaG9jb2xhdGVcIjogXCIjZDI2OTFlXCIsXG4gIFwiY29yYWxcIjogXCIjZmY3ZjUwXCIsXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogXCIjNjQ5NWVkXCIsXG4gIFwiY29ybnNpbGtcIjogXCIjZmZmOGRjXCIsXG4gIFwiY3JpbXNvblwiOiBcIiNkYzE0M2NcIixcbiAgXCJkYXJrYmx1ZVwiOiBcIiMwMDAwOGJcIixcbiAgXCJkYXJrY3lhblwiOiBcIiMwMDhiOGJcIixcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFwiI2I4ODYwYlwiLFxuICBcImRhcmtncmF5XCI6IFwiI2E5YTlhOVwiLFxuICBcImRhcmtncmVlblwiOiBcIiMwMDY0MDBcIixcbiAgXCJkYXJrZ3JleVwiOiBcIiNhOWE5YTlcIixcbiAgXCJkYXJra2hha2lcIjogXCIjYmRiNzZiXCIsXG4gIFwiZGFya21hZ2VudGFcIjogXCIjOGIwMDhiXCIsXG4gIFwiZGFya29saXZlZ3JlZW5cIjogXCIjNTU2YjJmXCIsXG4gIFwiZGFya29yYW5nZVwiOiBcIiNmZjhjMDBcIixcbiAgXCJkYXJrb3JjaGlkXCI6IFwiIzk5MzJjY1wiLFxuICBcImRhcmtyZWRcIjogXCIjOGIwMDAwXCIsXG4gIFwiZGFya3NhbG1vblwiOiBcIiNlOTk2N2FcIixcbiAgXCJkYXJrc2VhZ3JlZW5cIjogXCIjOGZiYzhmXCIsXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBcIiM0ODNkOGJcIixcbiAgXCJkYXJrc2xhdGVncmF5XCI6IFwiIzJmNGY0ZlwiLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogXCIjMmY0ZjRmXCIsXG4gIFwiZGFya3R1cnF1b2lzZVwiOiBcIiMwMGNlZDFcIixcbiAgXCJkYXJrdmlvbGV0XCI6IFwiIzk0MDBkM1wiLFxuICBcImRlZXBwaW5rXCI6IFwiI2ZmMTQ5M1wiLFxuICBcImRlZXBza3libHVlXCI6IFwiIzAwYmZmZlwiLFxuICBcImRpbWdyYXlcIjogXCIjNjk2OTY5XCIsXG4gIFwiZGltZ3JleVwiOiBcIiM2OTY5NjlcIixcbiAgXCJkb2RnZXJibHVlXCI6IFwiIzFlOTBmZlwiLFxuICBcImZpcmVicmlja1wiOiBcIiNiMjIyMjJcIixcbiAgXCJmbG9yYWx3aGl0ZVwiOiBcIiNmZmZhZjBcIixcbiAgXCJmb3Jlc3RncmVlblwiOiBcIiMyMjhiMjJcIixcbiAgXCJnYWluc2Jvcm9cIjogXCIjZGNkY2RjXCIsXG4gIFwiZ2hvc3R3aGl0ZVwiOiBcIiNmOGY4ZmZcIixcbiAgXCJnb2xkXCI6IFwiI2ZmZDcwMFwiLFxuICBcImdvbGRlbnJvZFwiOiBcIiNkYWE1MjBcIixcbiAgXCJncmVlbnllbGxvd1wiOiBcIiNhZGZmMmZcIixcbiAgXCJncmV5XCI6IFwiIzgwODA4MFwiLFxuICBcImhvbmV5ZGV3XCI6IFwiI2YwZmZmMFwiLFxuICBcImhvdHBpbmtcIjogXCIjZmY2OWI0XCIsXG4gIFwiaW5kaWFucmVkXCI6IFwiI2NkNWM1Y1wiLFxuICBcImluZGlnb1wiOiBcIiM0YjAwODJcIixcbiAgXCJpdm9yeVwiOiBcIiNmZmZmZjBcIixcbiAgXCJraGFraVwiOiBcIiNmMGU2OGNcIixcbiAgXCJsYXZlbmRlclwiOiBcIiNlNmU2ZmFcIixcbiAgXCJsYXZlbmRlcmJsdXNoXCI6IFwiI2ZmZjBmNVwiLFxuICBcImxhd25ncmVlblwiOiBcIiM3Y2ZjMDBcIixcbiAgXCJsZW1vbmNoaWZmb25cIjogXCIjZmZmYWNkXCIsXG4gIFwibGlnaHRibHVlXCI6IFwiI2FkZDhlNlwiLFxuICBcImxpZ2h0Y29yYWxcIjogXCIjZjA4MDgwXCIsXG4gIFwibGlnaHRjeWFuXCI6IFwiI2UwZmZmZlwiLFxuICBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFwiI2ZhZmFkMlwiLFxuICBcImxpZ2h0Z3JheVwiOiBcIiNkM2QzZDNcIixcbiAgXCJsaWdodGdyZWVuXCI6IFwiIzkwZWU5MFwiLFxuICBcImxpZ2h0Z3JleVwiOiBcIiNkM2QzZDNcIixcbiAgXCJsaWdodHBpbmtcIjogXCIjZmZiNmMxXCIsXG4gIFwibGlnaHRzYWxtb25cIjogXCIjZmZhMDdhXCIsXG4gIFwibGlnaHRzZWFncmVlblwiOiBcIiMyMGIyYWFcIixcbiAgXCJsaWdodHNreWJsdWVcIjogXCIjODdjZWZhXCIsXG4gIFwibGlnaHRzbGF0ZWdyYXlcIjogXCIjNzc4ODk5XCIsXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogXCIjNzc4ODk5XCIsXG4gIFwibGlnaHRzdGVlbGJsdWVcIjogXCIjYjBjNGRlXCIsXG4gIFwibGlnaHR5ZWxsb3dcIjogXCIjZmZmZmUwXCIsXG4gIFwibGltZWdyZWVuXCI6IFwiIzMyY2QzMlwiLFxuICBcImxpbmVuXCI6IFwiI2ZhZjBlNlwiLFxuICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogXCIjNjZjZGFhXCIsXG4gIFwibWVkaXVtYmx1ZVwiOiBcIiMwMDAwY2RcIixcbiAgXCJtZWRpdW1vcmNoaWRcIjogXCIjYmE1NWQzXCIsXG4gIFwibWVkaXVtcHVycGxlXCI6IFwiIzkzNzBkYlwiLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFwiIzNjYjM3MVwiLFxuICBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBcIiM3YjY4ZWVcIixcbiAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBcIiMwMGZhOWFcIixcbiAgXCJtZWRpdW10dXJxdW9pc2VcIjogXCIjNDhkMWNjXCIsXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFwiI2M3MTU4NVwiLFxuICBcIm1pZG5pZ2h0Ymx1ZVwiOiBcIiMxOTE5NzBcIixcbiAgXCJtaW50Y3JlYW1cIjogXCIjZjVmZmZhXCIsXG4gIFwibWlzdHlyb3NlXCI6IFwiI2ZmZTRlMVwiLFxuICBcIm1vY2Nhc2luXCI6IFwiI2ZmZTRiNVwiLFxuICBcIm5hdmFqb3doaXRlXCI6IFwiI2ZmZGVhZFwiLFxuICBcIm9sZGxhY2VcIjogXCIjZmRmNWU2XCIsXG4gIFwib2xpdmVkcmFiXCI6IFwiIzZiOGUyM1wiLFxuICBcIm9yYW5nZXJlZFwiOiBcIiNmZjQ1MDBcIixcbiAgXCJvcmNoaWRcIjogXCIjZGE3MGQ2XCIsXG4gIFwicGFsZWdvbGRlbnJvZFwiOiBcIiNlZWU4YWFcIixcbiAgXCJwYWxlZ3JlZW5cIjogXCIjOThmYjk4XCIsXG4gIFwicGFsZXR1cnF1b2lzZVwiOiBcIiNhZmVlZWVcIixcbiAgXCJwYWxldmlvbGV0cmVkXCI6IFwiI2RiNzA5M1wiLFxuICBcInBhcGF5YXdoaXBcIjogXCIjZmZlZmQ1XCIsXG4gIFwicGVhY2hwdWZmXCI6IFwiI2ZmZGFiOVwiLFxuICBcInBlcnVcIjogXCIjY2Q4NTNmXCIsXG4gIFwicGlua1wiOiBcIiNmZmMwY2JcIixcbiAgXCJwbHVtXCI6IFwiI2RkYTBkZFwiLFxuICBcInBvd2RlcmJsdWVcIjogXCIjYjBlMGU2XCIsXG4gIFwicm9zeWJyb3duXCI6IFwiI2JjOGY4ZlwiLFxuICBcInJveWFsYmx1ZVwiOiBcIiM0MTY5ZTFcIixcbiAgXCJzYWRkbGVicm93blwiOiBcIiM4YjQ1MTNcIixcbiAgXCJzYWxtb25cIjogXCIjZmE4MDcyXCIsXG4gIFwic2FuZHlicm93blwiOiBcIiNmNGE0NjBcIixcbiAgXCJzZWFncmVlblwiOiBcIiMyZThiNTdcIixcbiAgXCJzZWFzaGVsbFwiOiBcIiNmZmY1ZWVcIixcbiAgXCJzaWVubmFcIjogXCIjYTA1MjJkXCIsXG4gIFwic2t5Ymx1ZVwiOiBcIiM4N2NlZWJcIixcbiAgXCJzbGF0ZWJsdWVcIjogXCIjNmE1YWNkXCIsXG4gIFwic2xhdGVncmF5XCI6IFwiIzcwODA5MFwiLFxuICBcInNsYXRlZ3JleVwiOiBcIiM3MDgwOTBcIixcbiAgXCJzbm93XCI6IFwiI2ZmZmFmYVwiLFxuICBcInNwcmluZ2dyZWVuXCI6IFwiIzAwZmY3ZlwiLFxuICBcInN0ZWVsYmx1ZVwiOiBcIiM0NjgyYjRcIixcbiAgXCJ0YW5cIjogXCIjZDJiNDhjXCIsXG4gIFwidGhpc3RsZVwiOiBcIiNkOGJmZDhcIixcbiAgXCJ0b21hdG9cIjogXCIjZmY2MzQ3XCIsXG4gIFwidHVycXVvaXNlXCI6IFwiIzQwZTBkMFwiLFxuICBcInZpb2xldFwiOiBcIiNlZTgyZWVcIixcbiAgXCJ3aGVhdFwiOiBcIiNmNWRlYjNcIixcbiAgXCJ3aGl0ZXNtb2tlXCI6IFwiI2Y1ZjVmNVwiLFxuICBcInllbGxvd2dyZWVuXCI6IFwiIzlhY2QzMlwiLFxuICBcInJlYmVjY2FwdXJwbGVcIjogXCIjNjYzMzk5XCJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29sb3JzLmpzb24nKVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBfaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7XG5cbi8qKlxuICogQ2FtZWxjYXNlcyBhIGh5cGhlbmF0ZWQgc3RyaW5nLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gY2FtZWxpemUoJ2JhY2tncm91bmQtY29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZENvbG9yXCJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGNhbWVsaXplKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoX2h5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbWVsaXplOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGNhbWVsaXplID0gcmVxdWlyZSgnLi9jYW1lbGl6ZScpO1xuXG52YXIgbXNQYXR0ZXJuID0gL14tbXMtLztcblxuLyoqXG4gKiBDYW1lbGNhc2VzIGEgaHlwaGVuYXRlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGNhbWVsaXplU3R5bGVOYW1lKCdiYWNrZ3JvdW5kLWNvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmRDb2xvclwiXG4gKiAgID4gY2FtZWxpemVTdHlsZU5hbWUoJy1tb3otdHJhbnNpdGlvbicpXG4gKiAgIDwgXCJNb3pUcmFuc2l0aW9uXCJcbiAqICAgPiBjYW1lbGl6ZVN0eWxlTmFtZSgnLW1zLXRyYW5zaXRpb24nKVxuICogICA8IFwibXNUcmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gKiAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGBtc2AuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBjYW1lbGl6ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuIGNhbWVsaXplKHN0cmluZy5yZXBsYWNlKG1zUGF0dGVybiwgJ21zLScpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYW1lbGl6ZVN0eWxlTmFtZTsiLCJ2YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG52YXIgd2FsayA9IHJlcXVpcmUoJy4vd2FsaycpO1xudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG5cbmZ1bmN0aW9uIFZhbHVlUGFyc2VyKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBWYWx1ZVBhcnNlcikge1xuICAgICAgICB0aGlzLm5vZGVzID0gcGFyc2UodmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBWYWx1ZVBhcnNlcih2YWx1ZSk7XG59XG5cblZhbHVlUGFyc2VyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLm5vZGVzKSA/IHN0cmluZ2lmeSh0aGlzLm5vZGVzKSA6ICcnO1xufTtcblxuVmFsdWVQYXJzZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiAoY2IsIGJ1YmJsZSkge1xuICAgIHdhbGsodGhpcy5ub2RlcywgY2IsIGJ1YmJsZSk7XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5WYWx1ZVBhcnNlci51bml0ID0gcmVxdWlyZSgnLi91bml0Jyk7XG5cblZhbHVlUGFyc2VyLndhbGsgPSB3YWxrO1xuXG5WYWx1ZVBhcnNlci5zdHJpbmdpZnkgPSBzdHJpbmdpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmFsdWVQYXJzZXI7XG4iLCJ2YXIgb3BlblBhcmVudGhlc2VzID0gJygnLmNoYXJDb2RlQXQoMCk7XG52YXIgY2xvc2VQYXJlbnRoZXNlcyA9ICcpJy5jaGFyQ29kZUF0KDApO1xudmFyIHNpbmdsZVF1b3RlID0gJ1xcJycuY2hhckNvZGVBdCgwKTtcbnZhciBkb3VibGVRdW90ZSA9ICdcIicuY2hhckNvZGVBdCgwKTtcbnZhciBiYWNrc2xhc2ggPSAnXFxcXCcuY2hhckNvZGVBdCgwKTtcbnZhciBzbGFzaCA9ICcvJy5jaGFyQ29kZUF0KDApO1xudmFyIGNvbW1hID0gJywnLmNoYXJDb2RlQXQoMCk7XG52YXIgY29sb24gPSAnOicuY2hhckNvZGVBdCgwKTtcbnZhciBzdGFyID0gJyonLmNoYXJDb2RlQXQoMCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHRva2VucyA9IFtdO1xuICAgIHZhciB2YWx1ZSA9IGlucHV0O1xuXG4gICAgdmFyIG5leHQsIHF1b3RlLCBwcmV2LCB0b2tlbiwgZXNjYXBlLCBlc2NhcGVQb3MsIHdoaXRlc3BhY2VQb3M7XG4gICAgdmFyIHBvcyA9IDA7XG4gICAgdmFyIGNvZGUgPSB2YWx1ZS5jaGFyQ29kZUF0KHBvcyk7XG4gICAgdmFyIG1heCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgc3RhY2sgPSBbeyBub2RlczogdG9rZW5zIH1dO1xuICAgIHZhciBiYWxhbmNlZCA9IDA7XG4gICAgdmFyIHBhcmVudDtcblxuICAgIHZhciBuYW1lID0gJyc7XG4gICAgdmFyIGJlZm9yZSA9ICcnO1xuICAgIHZhciBhZnRlciA9ICcnO1xuXG4gICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgICAvLyBXaGl0ZXNwYWNlc1xuICAgICAgICBpZiAoY29kZSA8PSAzMikge1xuICAgICAgICAgICAgbmV4dCA9IHBvcztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBuZXh0ICs9IDE7XG4gICAgICAgICAgICAgICAgY29kZSA9IHZhbHVlLmNoYXJDb2RlQXQobmV4dCk7XG4gICAgICAgICAgICB9IHdoaWxlIChjb2RlIDw9IDMyKTtcbiAgICAgICAgICAgIHRva2VuID0gdmFsdWUuc2xpY2UocG9zLCBuZXh0KTtcblxuICAgICAgICAgICAgcHJldiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gY2xvc2VQYXJlbnRoZXNlcyAmJiBiYWxhbmNlZCkge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAnZGl2Jykge1xuICAgICAgICAgICAgICAgIHByZXYuYWZ0ZXIgPSB0b2tlbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gY29tbWEgfHwgY29kZSA9PT0gY29sb24gfHwgY29kZSA9PT0gc2xhc2ggJiYgdmFsdWUuY2hhckNvZGVBdChuZXh0ICsgMSkgIT09IHN0YXIpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUgPSB0b2tlbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3BhY2UnLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogcG9zLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdG9rZW5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9zID0gbmV4dDtcblxuICAgICAgICAvLyBRdW90ZXNcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBzaW5nbGVRdW90ZSB8fCBjb2RlID09PSBkb3VibGVRdW90ZSkge1xuICAgICAgICAgICAgbmV4dCA9IHBvcztcbiAgICAgICAgICAgIHF1b3RlID0gY29kZSA9PT0gc2luZ2xlUXVvdGUgPyAnXFwnJyA6ICdcIic7XG4gICAgICAgICAgICB0b2tlbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogcG9zLFxuICAgICAgICAgICAgICAgIHF1b3RlOiBxdW90ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBlc2NhcGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBuZXh0ID0gdmFsdWUuaW5kZXhPZihxdW90ZSwgbmV4dCArIDEpO1xuICAgICAgICAgICAgICAgIGlmICh+bmV4dCkge1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGVQb3MgPSBuZXh0O1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWUuY2hhckNvZGVBdChlc2NhcGVQb3MgLSAxKSA9PT0gYmFja3NsYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVQb3MgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9ICFlc2NhcGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBxdW90ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHZhbHVlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLnVuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChlc2NhcGUpO1xuICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB2YWx1ZS5zbGljZShwb3MgKyAxLCBuZXh0KTtcblxuICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgcG9zID0gbmV4dCArIDE7XG4gICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChwb3MpO1xuXG4gICAgICAgIC8vIENvbW1lbnRzXG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gc2xhc2ggJiYgdmFsdWUuY2hhckNvZGVBdChwb3MgKyAxKSA9PT0gc3Rhcikge1xuICAgICAgICAgICAgdG9rZW4gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvbW1lbnQnLFxuICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4OiBwb3NcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG5leHQgPSB2YWx1ZS5pbmRleE9mKCcqLycsIHBvcyk7XG4gICAgICAgICAgICBpZiAobmV4dCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0b2tlbi51bmNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgbmV4dCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB2YWx1ZS5zbGljZShwb3MgKyAyLCBuZXh0KTtcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgICAgcG9zID0gbmV4dCArIDI7XG4gICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChwb3MpO1xuXG4gICAgICAgIC8vIERpdmlkZXJzXG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gc2xhc2ggfHwgY29kZSA9PT0gY29tbWEgfHwgY29kZSA9PT0gY29sb24pIHtcbiAgICAgICAgICAgIHRva2VuID0gdmFsdWVbcG9zXTtcblxuICAgICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdkaXYnLFxuICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4OiBwb3MgLSBiZWZvcmUubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0b2tlbixcbiAgICAgICAgICAgICAgICBiZWZvcmU6IGJlZm9yZSxcbiAgICAgICAgICAgICAgICBhZnRlcjogJydcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmVmb3JlID0gJyc7XG5cbiAgICAgICAgICAgIHBvcyArPSAxO1xuICAgICAgICAgICAgY29kZSA9IHZhbHVlLmNoYXJDb2RlQXQocG9zKTtcblxuICAgICAgICAvLyBPcGVuIHBhcmVudGhlc2VzXG4gICAgICAgIH0gZWxzZSBpZiAob3BlblBhcmVudGhlc2VzID09PSBjb2RlKSB7XG4gICAgICAgICAgICAvLyBXaGl0ZXNwYWNlcyBhZnRlciBvcGVuIHBhcmVudGhlc2VzXG4gICAgICAgICAgICBuZXh0ID0gcG9zO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIG5leHQgKz0gMTtcbiAgICAgICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChuZXh0KTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUgPD0gMzIpO1xuICAgICAgICAgICAgdG9rZW4gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogcG9zIC0gbmFtZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgYmVmb3JlOiB2YWx1ZS5zbGljZShwb3MgKyAxLCBuZXh0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBvcyA9IG5leHQ7XG5cbiAgICAgICAgICAgIGlmIChuYW1lID09PSAndXJsJyAmJiBjb2RlICE9PSBzaW5nbGVRdW90ZSAmJiBjb2RlICE9PSBkb3VibGVRdW90ZSkge1xuICAgICAgICAgICAgICAgIG5leHQgLT0gMTtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdmFsdWUuaW5kZXhPZignKScsIG5leHQgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKH5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVQb3MgPSBuZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlLmNoYXJDb2RlQXQoZXNjYXBlUG9zIC0gMSkgPT09IGJhY2tzbGFzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZVBvcyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9ICFlc2NhcGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSAnKSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdmFsdWUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnVuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gd2hpbGUgKGVzY2FwZSk7XG4gICAgICAgICAgICAgICAgLy8gV2hpdGVzcGFjZXMgYmVmb3JlIGNsb3NlZFxuICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VQb3MgPSBuZXh0O1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZVBvcyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdCh3aGl0ZXNwYWNlUG9zKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlIDw9IDMyKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICE9PSB3aGl0ZXNwYWNlUG9zICsgMSkge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbi5ub2RlcyA9IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29yZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnNsaWNlKHBvcywgd2hpdGVzcGFjZVBvcyArIDEpXG4gICAgICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLm5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0b2tlbi51bmNsb3NlZCAmJiB3aGl0ZXNwYWNlUG9zICsgMSAhPT0gbmV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbi5hZnRlciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbi5ub2Rlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzcGFjZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogd2hpdGVzcGFjZVBvcyArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUuc2xpY2Uod2hpdGVzcGFjZVBvcyArIDEsIG5leHQpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLmFmdGVyID0gdmFsdWUuc2xpY2Uod2hpdGVzcGFjZVBvcyArIDEsIG5leHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBuZXh0ICsgMTtcbiAgICAgICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChwb3MpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYmFsYW5jZWQgKz0gMTtcbiAgICAgICAgICAgICAgICB0b2tlbi5hZnRlciA9ICcnO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbi5ub2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFtZSA9ICcnO1xuXG4gICAgICAgIC8vIENsb3NlIHBhcmVudGhlc2VzXG4gICAgICAgIH0gZWxzZSBpZiAoY2xvc2VQYXJlbnRoZXNlcyA9PT0gY29kZSAmJiBiYWxhbmNlZCkge1xuICAgICAgICAgICAgcG9zICs9IDE7XG4gICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChwb3MpO1xuXG4gICAgICAgICAgICBwYXJlbnQuYWZ0ZXIgPSBhZnRlcjtcbiAgICAgICAgICAgIGFmdGVyID0gJyc7XG4gICAgICAgICAgICBiYWxhbmNlZCAtPSAxO1xuICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBwYXJlbnQgPSBzdGFja1tiYWxhbmNlZF07XG4gICAgICAgICAgICB0b2tlbnMgPSBwYXJlbnQubm9kZXM7XG5cbiAgICAgICAgLy8gV29yZHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHQgPSBwb3M7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IGJhY2tzbGFzaCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQgKz0gMTtcbiAgICAgICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChuZXh0KTtcbiAgICAgICAgICAgIH0gd2hpbGUgKG5leHQgPCBtYXggJiYgIShcbiAgICAgICAgICAgICAgICBjb2RlIDw9IDMyIHx8XG4gICAgICAgICAgICAgICAgY29kZSA9PT0gc2luZ2xlUXVvdGUgfHxcbiAgICAgICAgICAgICAgICBjb2RlID09PSBkb3VibGVRdW90ZSB8fFxuICAgICAgICAgICAgICAgIGNvZGUgPT09IGNvbW1hIHx8XG4gICAgICAgICAgICAgICAgY29kZSA9PT0gY29sb24gfHxcbiAgICAgICAgICAgICAgICBjb2RlID09PSBzbGFzaCB8fFxuICAgICAgICAgICAgICAgIGNvZGUgPT09IG9wZW5QYXJlbnRoZXNlcyB8fFxuICAgICAgICAgICAgICAgIGNvZGUgPT09IGNsb3NlUGFyZW50aGVzZXMgJiYgYmFsYW5jZWRcbiAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgdG9rZW4gPSB2YWx1ZS5zbGljZShwb3MsIG5leHQpO1xuXG4gICAgICAgICAgICBpZiAob3BlblBhcmVudGhlc2VzID09PSBjb2RlKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JkJyxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSW5kZXg6IHBvcyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRva2VuXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvcyA9IG5leHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHBvcyA9IHN0YWNrLmxlbmd0aCAtIDE7IHBvczsgcG9zIC09IDEpIHtcbiAgICAgICAgc3RhY2tbcG9zXS51bmNsb3NlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrWzBdLm5vZGVzO1xufTtcbiIsImZ1bmN0aW9uIHN0cmluZ2lmeU5vZGUobm9kZSwgY3VzdG9tKSB7XHJcbiAgICB2YXIgdHlwZSA9IG5vZGUudHlwZTtcclxuICAgIHZhciB2YWx1ZSA9IG5vZGUudmFsdWU7XHJcbiAgICB2YXIgYnVmO1xyXG4gICAgdmFyIGN1c3RvbVJlc3VsdDtcclxuXHJcbiAgICBpZiAoY3VzdG9tICYmIChjdXN0b21SZXN1bHQgPSBjdXN0b20obm9kZSkpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gY3VzdG9tUmVzdWx0O1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnd29yZCcgfHwgdHlwZSA9PT0gJ3NwYWNlJykge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBidWYgPSBub2RlLnF1b3RlIHx8ICcnO1xyXG4gICAgICAgIHJldHVybiBidWYgKyB2YWx1ZSArIChub2RlLnVuY2xvc2VkID8gJycgOiBidWYpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY29tbWVudCcpIHtcclxuICAgICAgICByZXR1cm4gJy8qJyArIHZhbHVlICsgKG5vZGUudW5jbG9zZWQgPyAnJyA6ICcqLycpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZGl2Jykge1xyXG4gICAgICAgIHJldHVybiAobm9kZS5iZWZvcmUgfHwgJycpICsgdmFsdWUgKyAobm9kZS5hZnRlciB8fCAnJyk7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobm9kZS5ub2RlcykpIHtcclxuICAgICAgICBidWYgPSBzdHJpbmdpZnkobm9kZS5ub2Rlcyk7XHJcbiAgICAgICAgaWYgKHR5cGUgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJ1ZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlICsgJygnICsgKG5vZGUuYmVmb3JlIHx8ICcnKSArIGJ1ZiArIChub2RlLmFmdGVyIHx8ICcnKSArIChub2RlLnVuY2xvc2VkID8gJycgOiAnKScpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdHJpbmdpZnkobm9kZXMsIGN1c3RvbSkge1xyXG4gICAgdmFyIHJlc3VsdCwgaTtcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlcykpIHtcclxuICAgICAgICByZXN1bHQgPSAnJztcclxuICAgICAgICBmb3IgKGkgPSBub2Rlcy5sZW5ndGggLSAxOyB+aTsgaSAtPSAxKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHN0cmluZ2lmeU5vZGUobm9kZXNbaV0sIGN1c3RvbSkgKyByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyaW5naWZ5Tm9kZShub2RlcywgY3VzdG9tKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdpZnk7XHJcbiIsInZhciBtaW51cyA9ICctJy5jaGFyQ29kZUF0KDApO1xudmFyIHBsdXMgID0gJysnLmNoYXJDb2RlQXQoMCk7XG52YXIgZG90ICAgPSAnLicuY2hhckNvZGVBdCgwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgcG9zID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIHZhciBkb3R0ZWQgPSBmYWxzZTtcbiAgICB2YXIgY29udGFpbnNOdW1iZXIgPSBmYWxzZTtcbiAgICB2YXIgY29kZTtcbiAgICB2YXIgbnVtYmVyID0gJyc7XG5cbiAgICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7XG4gICAgICAgIGNvZGUgPSB2YWx1ZS5jaGFyQ29kZUF0KHBvcyk7XG5cbiAgICAgICAgaWYgKGNvZGUgPj0gNDggJiYgY29kZSA8PSA1Nykge1xuICAgICAgICAgICAgbnVtYmVyICs9IHZhbHVlW3Bvc107XG4gICAgICAgICAgICBjb250YWluc051bWJlciA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gZG90KSB7XG4gICAgICAgICAgICBpZiAoZG90dGVkKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb3R0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgbnVtYmVyICs9IHZhbHVlW3Bvc107XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gcGx1cyB8fCBjb2RlID09PSBtaW51cykge1xuICAgICAgICAgICAgaWYgKHBvcyAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbnVtYmVyICs9IHZhbHVlW3Bvc107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHBvcyArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBjb250YWluc051bWJlciA/IHtcbiAgICAgICAgbnVtYmVyOiBudW1iZXIsXG4gICAgICAgIHVuaXQ6IHZhbHVlLnNsaWNlKHBvcylcbiAgICB9IDogZmFsc2U7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3YWxrKG5vZGVzLCBjYiwgYnViYmxlKSB7XHJcbiAgICB2YXIgaSwgbWF4LCBub2RlLCByZXN1bHQ7XHJcblxyXG4gICAgZm9yIChpID0gMCwgbWF4ID0gbm9kZXMubGVuZ3RoOyBpIDwgbWF4OyBpICs9IDEpIHtcclxuICAgICAgICBub2RlID0gbm9kZXNbaV07XHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gY2Iobm9kZSwgaSwgbm9kZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UgJiYgbm9kZS50eXBlID09PSAnZnVuY3Rpb24nICYmIEFycmF5LmlzQXJyYXkobm9kZS5ub2RlcykpIHtcclxuICAgICAgICAgICAgd2Fsayhub2RlLm5vZGVzLCBjYiwgYnViYmxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChidWJibGUpIHtcclxuICAgICAgICAgICAgY2Iobm9kZSwgaSwgbm9kZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xudmFyIHBhcnNlID0gcmVxdWlyZSgncG9zdGNzcy12YWx1ZS1wYXJzZXInKTtcbnZhciBjYW1lbGl6ZVN0eWxlTmFtZSA9IHJlcXVpcmUoJ2ZianMvbGliL2NhbWVsaXplU3R5bGVOYW1lJyk7XG52YXIgdHJhbnNmb3JtcyA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtcycpO1xudmFyIFRva2VuU3RyZWFtID0gcmVxdWlyZSgnLi9Ub2tlblN0cmVhbScpO1xuXG4vLyBOb3RlIGlmIHRoaXMgaXMgd3JvbmcsIHlvdSdsbCBuZWVkIHRvIGNoYW5nZSB0b2tlblR5cGVzLmpzIHRvb1xudmFyIG51bWJlck9yTGVuZ3RoUmUgPSAvXihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbRWVdWystXT9cXGQrKT8pKD86cHgpPyQvaTtcbnZhciBib29sUmUgPSAvXnRydWV8ZmFsc2UkL2k7XG5cbi8vIFVuZG9jdW1lbnRlZCBleHBvcnRcbnZhciB0cmFuc2Zvcm1SYXdWYWx1ZSA9IGV4cG9ydHMudHJhbnNmb3JtUmF3VmFsdWUgPSBmdW5jdGlvbiB0cmFuc2Zvcm1SYXdWYWx1ZShpbnB1dCkge1xuICB2YXIgdmFsdWUgPSBpbnB1dC50cmltKCk7XG5cbiAgdmFyIG51bWJlck1hdGNoID0gdmFsdWUubWF0Y2gobnVtYmVyT3JMZW5ndGhSZSk7XG4gIGlmIChudW1iZXJNYXRjaCAhPT0gbnVsbCkgcmV0dXJuIE51bWJlcihudW1iZXJNYXRjaFsxXSk7XG5cbiAgdmFyIGJvb2xNYXRjaCA9IGlucHV0Lm1hdGNoKGJvb2xSZSk7XG4gIGlmIChib29sTWF0Y2ggIT09IG51bGwpIHJldHVybiBib29sTWF0Y2hbMF0udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBiYXNlVHJhbnNmb3JtU2hvcnRoYW5kVmFsdWUgPSBmdW5jdGlvbiBiYXNlVHJhbnNmb3JtU2hvcnRoYW5kVmFsdWUocHJvcE5hbWUsIGlucHV0VmFsdWUpIHtcbiAgdmFyIGFzdCA9IHBhcnNlKGlucHV0VmFsdWUudHJpbSgpKTtcbiAgdmFyIHRva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGFzdC5ub2Rlcyk7XG4gIHJldHVybiB0cmFuc2Zvcm1zW3Byb3BOYW1lXSh0b2tlblN0cmVhbSk7XG59O1xuXG52YXIgdHJhbnNmb3JtU2hvcnRoYW5kVmFsdWUgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID8gYmFzZVRyYW5zZm9ybVNob3J0aGFuZFZhbHVlIDogZnVuY3Rpb24gKHByb3BOYW1lLCBpbnB1dFZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhc2VUcmFuc2Zvcm1TaG9ydGhhbmRWYWx1ZShwcm9wTmFtZSwgaW5wdXRWYWx1ZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBkZWNsYXJhdGlvbiBcIicgKyBwcm9wTmFtZSArICc6ICcgKyBpbnB1dFZhbHVlICsgJ1wiJyk7XG4gIH1cbn07XG5cbnZhciBnZXRTdHlsZXNGb3JQcm9wZXJ0eSA9IGV4cG9ydHMuZ2V0U3R5bGVzRm9yUHJvcGVydHkgPSBmdW5jdGlvbiBnZXRTdHlsZXNGb3JQcm9wZXJ0eShwcm9wTmFtZSwgaW5wdXRWYWx1ZSwgYWxsb3dTaG9ydGhhbmQpIHtcbiAgdmFyIGlzUmF3VmFsdWUgPSBhbGxvd1Nob3J0aGFuZCA9PT0gZmFsc2UgfHwgIShwcm9wTmFtZSBpbiB0cmFuc2Zvcm1zKTtcbiAgdmFyIHByb3BWYWx1ZSA9IGlzUmF3VmFsdWUgPyB0cmFuc2Zvcm1SYXdWYWx1ZShpbnB1dFZhbHVlKSA6IHRyYW5zZm9ybVNob3J0aGFuZFZhbHVlKHByb3BOYW1lLCBpbnB1dFZhbHVlLnRyaW0oKSk7XG5cbiAgcmV0dXJuIHByb3BWYWx1ZSAmJiBwcm9wVmFsdWUuJG1lcmdlID8gcHJvcFZhbHVlLiRtZXJnZSA6IF9kZWZpbmVQcm9wZXJ0eSh7fSwgcHJvcE5hbWUsIHByb3BWYWx1ZSk7XG59O1xuXG52YXIgZ2V0UHJvcGVydHlOYW1lID0gZXhwb3J0cy5nZXRQcm9wZXJ0eU5hbWUgPSBjYW1lbGl6ZVN0eWxlTmFtZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHJ1bGVzKSB7XG4gIHZhciBzaG9ydGhhbmRCbGFja2xpc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICByZXR1cm4gcnVsZXMucmVkdWNlKGZ1bmN0aW9uIChhY2N1bSwgcnVsZSkge1xuICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUocnVsZVswXSk7XG4gICAgdmFyIHZhbHVlID0gcnVsZVsxXTtcbiAgICB2YXIgYWxsb3dTaG9ydGhhbmQgPSBzaG9ydGhhbmRCbGFja2xpc3QuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2N1bSwgZ2V0U3R5bGVzRm9yUHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSwgYWxsb3dTaG9ydGhhbmQpKTtcbiAgfSwge30pO1xufTsiXX0= | |
const css2rn = require('css-to-react-native'); | |
const input = document.getElementById('code'); | |
const result = document.getElementById('result'); | |
const strrf = str => str.trim().replace(/^"/, "'").replace(/",?$/, "'"); | |
const btn = document.querySelector('#go'); | |
btn.addEventListener('click', () => { | |
const rules = input.value.replace(/\/\*(.|\n)*?\*\//, '').split(';').map(item => item.split(':').map(x => String(x).trim())).filter(x => x && x[0] !== ''); | |
const output = JSON.stringify(css2rn.default(rules), null, 2); | |
const ok = output.replace(/ \"(.*)\":(.*)\n/g, (n, a, b) => { return ` ${a}: ${strrf(b)},\n`; }).replace(/,,/g, ','); | |
result.value = ok.substr(1, ok.length - 2).trim().replace(/\n\s+/g, '\n'); | |
}); | |
;}, 0) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"css-to-react-native": "2.0.4" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <body> --> | |
<label>CSS</label><br /> | |
<textarea id="code" style="width: 500px" rows=12> | |
font-size: 12px; | |
color: red; | |
</textarea><br /> | |
<button id="go">Parse</button><br /><br /> | |
<textarea id="result" style="width: 500px" rows=12></textarea> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <head> --> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment