@enterthenamehere/esdoc
Version:
Good Documentation Generator For JavaScript, updated for new decade
178 lines (171 loc) • 21.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
/**
* Param Type Parser class.
*/
class ParamParser {
/**
* parse param value.
* @param {string} value - param value.
* @param {boolean} [type=true] if true, contain param type.
* @param {boolean} [name=true] if true, contain param name.
* @param {boolean} [desc=true] if true, contain param description.
* @return {{typeText: string, paramName: string, paramDesc: string}} parsed value.
*
* @example
* let value = '{number} param - this is number param';
* let {typeText, paramName, paramDesc} = ParamParser.parseParamValue(value);
*
* let value = '{number} this is number return value';
* let {typeText, paramDesc} = ParamParser.parseParamValue(value, true, false, true);
*
* let value = '{number}';
* let {typeText} = ParamParser.parseParamValue(value, true, false, false);
*/
static parseParamValue(value) {
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var desc = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
value = value.trim();
var match = [];
var typeText = null;
var paramName = null;
var paramDesc = null;
// e.g {number}
if (type) {
var reg = /^\{((?:[\0-\?A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?)\}([\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+|$)/; // ``@`` is special char in ``{@link foo}``
match = value.match(reg);
if (match) {
typeText = match[1];
value = value.replace(reg, '');
} else {
typeText = '*';
}
}
// e.g. [p1=123]
if (name) {
if (value.charAt(0) === '[') {
paramName = '';
var counter = 0;
for (var c of value) {
paramName += c;
if (c === '[') counter++;
if (c === ']') counter--;
if (counter === 0) break;
}
if (paramName) {
value = value.substr(paramName.length).trim();
}
} else {
match = value.match(/^((?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)/);
if (match) {
paramName = match[1];
value = value.replace(/^(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]*/, '');
}
}
}
// e.g. this is p1 desc.
if (desc) {
paramDesc = value.startsWith('-') ? value.substring(1).trimStart() : value;
}
if (!(typeText || paramName || paramDesc)) {
console.error("\x1B[31mParamParser::parseParamValue() - Param is invalid. param = \"".concat(value, "\"\x1B[0m"));
throw new Error("ParamParser::parseParamValue() - Param is invalid. param = \"".concat(value, "\""));
}
return {
typeText,
paramName,
paramDesc
};
}
/**
* parse param text and build formatted result.
* @param {string} typeText - param type text.
* @param {string} [paramName] - param name.
* @param {string} [paramDesc] - param description.
* @returns {ParsedParam} formatted result.
*
* @example
* let value = '{number} param - this is number param';
* let {typeText, paramName, paramDesc} = ParamParser.parseParamValue(value);
* let result = ParamParser.parseParam(typeText, paramName, paramDesc);
*/
static parseParam() {
var typeText = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var paramName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
var paramDesc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
var result = {};
if (typeText) {
// check nullable
if (typeText[0] === '?') {
result.nullable = true;
} else if (typeText[0] === '!') {
result.nullable = false;
} else {
result.nullable = null;
}
typeText = typeText.replace(/^[!\?]/, '');
// check record and union
if (typeText[0] === '{') {
result.types = [typeText];
} else if (typeText[0] === '(') {
typeText = typeText.replace(/^\(/, '').replace(/\)$/, '');
result.types = typeText.split('|');
} else if (typeText.includes('|')) {
if (typeText.match(/<(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\|(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?>/)) {
// union in generics. e.g. `Array<string|number>`
// hack: in this case, process this type in DocBuilder#_buildTypeDocLinkHTML
result.types = [typeText];
} else if (typeText.match(/^\.\.\.\((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*?\)/)) {
// union with spread. e.g. `...(string|number)`
// hack: in this case, process this type in DocBuilder#_buildTypeDocLinkHTML
result.types = [typeText];
} else {
result.types = typeText.split('|');
}
} else {
result.types = [typeText];
}
if (typeText.indexOf('...') === 0) {
result.spread = true;
} else {
result.spread = false;
}
} else {
result.types = [''];
}
if (result.types.some(t => {
return !t;
})) {
throw new Error("Empty Type found name=".concat(paramName, " desc=").concat(paramDesc));
}
if (paramName) {
// check optional
if (paramName[0] === '[') {
result.optional = true;
paramName = paramName.replace(/^\[/, '').replace(/\]$/, '');
} else {
result.optional = false;
}
// check default value
var pair = paramName.split('=');
if (pair.length === 2) {
result.defaultValue = pair[1];
try {
var raw = JSON.parse(pair[1]);
result.defaultRaw = raw;
} catch (e) {
result.defaultRaw = pair[1];
}
}
result.name = pair[0].trim();
}
result.description = paramDesc;
return result;
}
}
exports.default = ParamParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJhbVBhcnNlciIsInBhcnNlUGFyYW1WYWx1ZSIsInZhbHVlIiwidHlwZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm5hbWUiLCJkZXNjIiwidHJpbSIsIm1hdGNoIiwidHlwZVRleHQiLCJwYXJhbU5hbWUiLCJwYXJhbURlc2MiLCJyZWciLCJyZXBsYWNlIiwiY2hhckF0IiwiY291bnRlciIsImMiLCJzdWJzdHIiLCJzdGFydHNXaXRoIiwic3Vic3RyaW5nIiwidHJpbVN0YXJ0IiwiY29uc29sZSIsImVycm9yIiwiY29uY2F0IiwiRXJyb3IiLCJwYXJzZVBhcmFtIiwicmVzdWx0IiwibnVsbGFibGUiLCJ0eXBlcyIsInNwbGl0IiwiaW5jbHVkZXMiLCJpbmRleE9mIiwic3ByZWFkIiwic29tZSIsInQiLCJvcHRpb25hbCIsInBhaXIiLCJkZWZhdWx0VmFsdWUiLCJyYXciLCJKU09OIiwicGFyc2UiLCJkZWZhdWx0UmF3IiwiZSIsImRlc2NyaXB0aW9uIiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvUGFyc2VyL1BhcmFtUGFyc2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBQYXJhbSBUeXBlIFBhcnNlciBjbGFzcy5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcmFtUGFyc2VyIHtcclxuICAvKipcclxuICAgKiBwYXJzZSBwYXJhbSB2YWx1ZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBwYXJhbSB2YWx1ZS5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0eXBlPXRydWVdIGlmIHRydWUsIGNvbnRhaW4gcGFyYW0gdHlwZS5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtuYW1lPXRydWVdIGlmIHRydWUsIGNvbnRhaW4gcGFyYW0gbmFtZS5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkZXNjPXRydWVdIGlmIHRydWUsIGNvbnRhaW4gcGFyYW0gZGVzY3JpcHRpb24uXHJcbiAgICogQHJldHVybiB7e3R5cGVUZXh0OiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbURlc2M6IHN0cmluZ319IHBhcnNlZCB2YWx1ZS5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogbGV0IHZhbHVlID0gJ3tudW1iZXJ9IHBhcmFtIC0gdGhpcyBpcyBudW1iZXIgcGFyYW0nO1xyXG4gICAqIGxldCB7dHlwZVRleHQsIHBhcmFtTmFtZSwgcGFyYW1EZXNjfSA9IFBhcmFtUGFyc2VyLnBhcnNlUGFyYW1WYWx1ZSh2YWx1ZSk7XHJcbiAgICpcclxuICAgKiBsZXQgdmFsdWUgPSAne251bWJlcn0gdGhpcyBpcyBudW1iZXIgcmV0dXJuIHZhbHVlJztcclxuICAgKiBsZXQge3R5cGVUZXh0LCBwYXJhbURlc2N9ID0gUGFyYW1QYXJzZXIucGFyc2VQYXJhbVZhbHVlKHZhbHVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICpcclxuICAgKiBsZXQgdmFsdWUgPSAne251bWJlcn0nO1xyXG4gICAqIGxldCB7dHlwZVRleHR9ID0gUGFyYW1QYXJzZXIucGFyc2VQYXJhbVZhbHVlKHZhbHVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAqL1xyXG4gIHN0YXRpYyBwYXJzZVBhcmFtVmFsdWUodmFsdWUsIHR5cGUgPSB0cnVlLCBuYW1lID0gdHJ1ZSwgZGVzYyA9IHRydWUpIHtcclxuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xyXG5cclxuICAgIGxldCBtYXRjaCA9IFtdO1xyXG4gICAgbGV0IHR5cGVUZXh0ID0gbnVsbDtcclxuICAgIGxldCBwYXJhbU5hbWUgPSBudWxsO1xyXG4gICAgbGV0IHBhcmFtRGVzYyA9IG51bGw7XHJcblxyXG4gICAgLy8gZS5nIHtudW1iZXJ9XHJcbiAgICBpZiAodHlwZSkge1xyXG4gICAgICBjb25zdCByZWcgPSAvXlxceyhbXkBdKj8pXFx9KFxccyt8JCkvdTsgLy8gYGBAYGAgaXMgc3BlY2lhbCBjaGFyIGluIGBge0BsaW5rIGZvb31gYFxyXG4gICAgICBtYXRjaCA9IHZhbHVlLm1hdGNoKHJlZyk7XHJcbiAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgIHR5cGVUZXh0ID0gbWF0Y2hbMV07XHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlZywgJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHR5cGVUZXh0ID0gJyonO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZS5nLiBbcDE9MTIzXVxyXG4gICAgaWYgKG5hbWUpIHtcclxuICAgICAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PT0gJ1snKSB7XHJcbiAgICAgICAgcGFyYW1OYW1lID0gJyc7XHJcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xyXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB2YWx1ZSkge1xyXG4gICAgICAgICAgcGFyYW1OYW1lICs9IGM7XHJcbiAgICAgICAgICBpZiAoYyA9PT0gJ1snKSBjb3VudGVyKys7XHJcbiAgICAgICAgICBpZiAoYyA9PT0gJ10nKSBjb3VudGVyLS07XHJcbiAgICAgICAgICBpZiAoY291bnRlciA9PT0gMCkgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyYW1OYW1lKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cihwYXJhbU5hbWUubGVuZ3RoKS50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1hdGNoID0gdmFsdWUubWF0Y2goL14oXFxTKykvdSk7XHJcbiAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICBwYXJhbU5hbWUgPSBtYXRjaFsxXTtcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXlxcUytcXHMqL3UsICcnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBlLmcuIHRoaXMgaXMgcDEgZGVzYy5cclxuICAgIGlmIChkZXNjKSB7XHJcbiAgICAgIHBhcmFtRGVzYyA9ICggdmFsdWUuc3RhcnRzV2l0aCgnLScpID8gdmFsdWUuc3Vic3RyaW5nKDEpLnRyaW1TdGFydCgpIDogdmFsdWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggISh0eXBlVGV4dCB8fCBwYXJhbU5hbWUgfHwgcGFyYW1EZXNjICkgKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgXHUwMDFiWzMxbVBhcmFtUGFyc2VyOjpwYXJzZVBhcmFtVmFsdWUoKSAtIFBhcmFtIGlzIGludmFsaWQuIHBhcmFtID0gXCIke3ZhbHVlfVwiXHUwMDFiWzBtYCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXJhbVBhcnNlcjo6cGFyc2VQYXJhbVZhbHVlKCkgLSBQYXJhbSBpcyBpbnZhbGlkLiBwYXJhbSA9IFwiJHt2YWx1ZX1cImApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7dHlwZVRleHQsIHBhcmFtTmFtZSwgcGFyYW1EZXNjfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHBhcnNlIHBhcmFtIHRleHQgYW5kIGJ1aWxkIGZvcm1hdHRlZCByZXN1bHQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVUZXh0IC0gcGFyYW0gdHlwZSB0ZXh0LlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1OYW1lXSAtIHBhcmFtIG5hbWUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbURlc2NdIC0gcGFyYW0gZGVzY3JpcHRpb24uXHJcbiAgICogQHJldHVybnMge1BhcnNlZFBhcmFtfSBmb3JtYXR0ZWQgcmVzdWx0LlxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBsZXQgdmFsdWUgPSAne251bWJlcn0gcGFyYW0gLSB0aGlzIGlzIG51bWJlciBwYXJhbSc7XHJcbiAgICogbGV0IHt0eXBlVGV4dCwgcGFyYW1OYW1lLCBwYXJhbURlc2N9ID0gUGFyYW1QYXJzZXIucGFyc2VQYXJhbVZhbHVlKHZhbHVlKTtcclxuICAgKiBsZXQgcmVzdWx0ID0gUGFyYW1QYXJzZXIucGFyc2VQYXJhbSh0eXBlVGV4dCwgcGFyYW1OYW1lLCBwYXJhbURlc2MpO1xyXG4gICAqL1xyXG4gIHN0YXRpYyBwYXJzZVBhcmFtKHR5cGVUZXh0ID0gbnVsbCwgcGFyYW1OYW1lID0gbnVsbCwgcGFyYW1EZXNjID0gbnVsbCkge1xyXG4gICAgY29uc3QgcmVzdWx0ID0ge307XHJcblxyXG4gICAgaWYgKHR5cGVUZXh0KSB7XHJcbiAgICAgIC8vIGNoZWNrIG51bGxhYmxlXHJcbiAgICAgIGlmICh0eXBlVGV4dFswXSA9PT0gJz8nKSB7XHJcbiAgICAgICAgcmVzdWx0Lm51bGxhYmxlID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlVGV4dFswXSA9PT0gJyEnKSB7XHJcbiAgICAgICAgcmVzdWx0Lm51bGxhYmxlID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0Lm51bGxhYmxlID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICB0eXBlVGV4dCA9IHR5cGVUZXh0LnJlcGxhY2UoL15bPyFdL3UsICcnKTtcclxuXHJcbiAgICAgIC8vIGNoZWNrIHJlY29yZCBhbmQgdW5pb25cclxuICAgICAgaWYgKHR5cGVUZXh0WzBdID09PSAneycpIHtcclxuICAgICAgICByZXN1bHQudHlwZXMgPSBbdHlwZVRleHRdO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVUZXh0WzBdID09PSAnKCcpIHtcclxuICAgICAgICB0eXBlVGV4dCA9IHR5cGVUZXh0LnJlcGxhY2UoL15bKF0vdSwgJycpLnJlcGxhY2UoL1spXSQvdSwgJycpO1xyXG4gICAgICAgIHJlc3VsdC50eXBlcyA9IHR5cGVUZXh0LnNwbGl0KCd8Jyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZVRleHQuaW5jbHVkZXMoJ3wnKSkge1xyXG4gICAgICAgIGlmICh0eXBlVGV4dC5tYXRjaCgvPC4qP1xcfC4qPz4vdSkpIHtcclxuICAgICAgICAgIC8vIHVuaW9uIGluIGdlbmVyaWNzLiBlLmcuIGBBcnJheTxzdHJpbmd8bnVtYmVyPmBcclxuICAgICAgICAgIC8vIGhhY2s6IGluIHRoaXMgY2FzZSwgcHJvY2VzcyB0aGlzIHR5cGUgaW4gRG9jQnVpbGRlciNfYnVpbGRUeXBlRG9jTGlua0hUTUxcclxuICAgICAgICAgIHJlc3VsdC50eXBlcyA9IFt0eXBlVGV4dF07XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZVRleHQubWF0Y2goL15cXC5cXC5cXC5cXCguKj9cXCkvdSkpIHtcclxuICAgICAgICAgIC8vIHVuaW9uIHdpdGggc3ByZWFkLiBlLmcuIGAuLi4oc3RyaW5nfG51bWJlcilgXHJcbiAgICAgICAgICAvLyBoYWNrOiBpbiB0aGlzIGNhc2UsIHByb2Nlc3MgdGhpcyB0eXBlIGluIERvY0J1aWxkZXIjX2J1aWxkVHlwZURvY0xpbmtIVE1MXHJcbiAgICAgICAgICByZXN1bHQudHlwZXMgPSBbdHlwZVRleHRdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQudHlwZXMgPSB0eXBlVGV4dC5zcGxpdCgnfCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQudHlwZXMgPSBbdHlwZVRleHRdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZVRleHQuaW5kZXhPZignLi4uJykgPT09IDApIHtcclxuICAgICAgICByZXN1bHQuc3ByZWFkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQuc3ByZWFkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3VsdC50eXBlcyA9IFsnJ107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC50eXBlcy5zb21lKCh0KSA9PiB7IHJldHVybiAhdDsgfSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbXB0eSBUeXBlIGZvdW5kIG5hbWU9JHtwYXJhbU5hbWV9IGRlc2M9JHtwYXJhbURlc2N9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBhcmFtTmFtZSkge1xyXG4gICAgICAvLyBjaGVjayBvcHRpb25hbFxyXG4gICAgICBpZiAocGFyYW1OYW1lWzBdID09PSAnWycpIHtcclxuICAgICAgICByZXN1bHQub3B0aW9uYWwgPSB0cnVlO1xyXG4gICAgICAgIHBhcmFtTmFtZSA9IHBhcmFtTmFtZS5yZXBsYWNlKC9eW1tdL3UsICcnKS5yZXBsYWNlKC9bXFxdXSQvdSwgJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdC5vcHRpb25hbCA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGVjayBkZWZhdWx0IHZhbHVlXHJcbiAgICAgIGNvbnN0IHBhaXIgPSBwYXJhbU5hbWUuc3BsaXQoJz0nKTtcclxuICAgICAgaWYgKHBhaXIubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgcmVzdWx0LmRlZmF1bHRWYWx1ZSA9IHBhaXJbMV07XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UocGFpclsxXSk7XHJcbiAgICAgICAgICByZXN1bHQuZGVmYXVsdFJhdyA9IHJhdztcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICByZXN1bHQuZGVmYXVsdFJhdyA9IHBhaXJbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXN1bHQubmFtZSA9IHBhaXJbMF0udHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IHBhcmFtRGVzYztcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNlLE1BQU1BLFdBQVcsQ0FBQztFQUMvQjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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