UNPKG

@senx/warpview

Version:
269 lines 27.2 kB
/* * Copyright 2021 SenX S.A.S. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // adapted from Canop's JSON,parseMore https://github.com/Canop/JSON.parseMore/ export class JsonLib { constructor() { this.escapee = { '"': '"', '\\': '\\', '/': '/', b: '\b', f: '\f', n: '\n', r: '\r', t: '\t' }; } error(m) { throw { name: 'SyntaxError', message: m, at: this.at, text: this.text }; } next() { return this.ch = this.text.charAt(this.at++); } check(c) { if (c !== this.ch) { this.error('Expected \'' + c + '\' instead of \'' + this.ch + '\''); } this.ch = this.text.charAt(this.at++); } number() { let string = ''; if (this.ch === '-') { string = '-'; this.check('-'); } if (this.ch === 'I') { this.check('I'); this.check('n'); this.check('f'); this.check('i'); this.check('n'); this.check('i'); this.check('t'); this.check('y'); return -Infinity; } while (this.ch >= '0' && this.ch <= '9') { string += this.ch; this.next(); } if (this.ch === '.') { string += '.'; while (this.next() && this.ch >= '0' && this.ch <= '9') { string += this.ch; } } if (this.ch === 'e' || this.ch === 'E') { string += this.ch; this.next(); if (this.ch === '-' || this.ch === '+') { string += this.ch; this.next(); } while (this.ch >= '0' && this.ch <= '9') { string += this.ch; this.next(); } } return +string; } string() { let hex; let string = ''; let uffff; if (this.ch === '"') { while (this.next()) { if (this.ch === '"') { this.next(); return string; } if (this.ch === '\\') { this.next(); if (this.ch === 'u') { uffff = 0; for (let i = 0; i < 4; i++) { hex = parseInt(this.next(), 16); if (!isFinite(hex)) { break; } uffff = uffff * 16 + hex; } string += String.fromCharCode(uffff); } else if (this.escapee[this.ch]) { string += this.escapee[this.ch]; } else { break; } } else { string += this.ch; } } } this.error('Bad string'); } white() { while (this.ch && this.ch <= ' ') { this.next(); } } word() { switch (this.ch) { case 't': this.check('t'); this.check('r'); this.check('u'); this.check('e'); return true; case 'f': this.check('f'); this.check('a'); this.check('l'); this.check('s'); this.check('e'); return false; case 'n': this.check('n'); this.check('u'); this.check('l'); this.check('l'); return null; case 'N': this.check('N'); this.check('a'); this.check('N'); return NaN; case 'I': this.check('I'); this.check('n'); this.check('f'); this.check('i'); this.check('n'); this.check('i'); this.check('t'); this.check('y'); return Infinity; } this.error('Unexpected \'' + this.ch + '\''); } array() { const array = []; if (this.ch === '[') { this.check('['); this.white(); if (this.ch === ']') { this.check(']'); return array; // empty array } while (this.ch) { array.push(this.value()); this.white(); if (this.ch === ']') { this.check(']'); return array; } this.check(','); this.white(); } } this.error('Bad array'); } object() { let key; const object = {}; if (this.ch === '{') { this.check('{'); this.white(); if (this.ch === '}') { this.check('}'); return object; // empty object } while (this.ch) { key = this.string(); this.white(); this.check(':'); if (Object.hasOwnProperty.call(object, key)) { this.error('Duplicate key "' + key + '"'); } object[key] = this.value(); this.white(); if (this.ch === '}') { this.check('}'); return object; } this.check(','); this.white(); } } this.error('Bad object'); } value() { this.white(); switch (this.ch) { case '{': return this.object(); case '[': return this.array(); case '"': return this.string(); case '-': return this.number(); default: return this.ch >= '0' && this.ch <= '9' ? this.number() : this.word(); } } parse(source, reviver) { let result; this.text = source; this.at = 0; this.ch = ' '; result = this.value(); this.white(); if (this.ch) { this.error('Syntax error'); } return typeof reviver === 'function' ? (function walk(holder, key) { let k; let v; const value = holder[key]; if (value && typeof value === 'object') { for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); }({ '': result }, '')) : result; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkxpYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dhcnB2aWV3LW5nL3NyYy9saWIvdXRpbHMvanNvbkxpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCwrRUFBK0U7QUFDL0UsTUFBTSxPQUFPLE9BQU87SUFBcEI7UUFHRSxZQUFPLEdBQUc7WUFDUixHQUFHLEVBQUUsR0FBRztZQUNSLElBQUksRUFBRSxJQUFJO1lBQ1YsR0FBRyxFQUFFLEdBQUc7WUFDUixDQUFDLEVBQUUsSUFBSTtZQUNQLENBQUMsRUFBRSxJQUFJO1lBQ1AsQ0FBQyxFQUFFLElBQUk7WUFDUCxDQUFDLEVBQUUsSUFBSTtZQUNQLENBQUMsRUFBRSxJQUFJO1NBQ1IsQ0FBQztJQXNQSixDQUFDO0lBblBTLEtBQUssQ0FBQyxDQUFDO1FBQ2IsTUFBTTtZQUNKLElBQUksRUFBRSxhQUFhO1lBQ25CLE9BQU8sRUFBRSxDQUFDO1lBQ1YsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUM7SUFDSixDQUFDO0lBRU8sSUFBSTtRQUNWLE9BQU8sSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sS0FBSyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFB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QUMsQ0FBQztnQkFDaEIsT0FBTyxJQUFJLENBQUM7WUFDZCxLQUFLLEdBQUc7Z0JBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsT0FBTyxLQUFLLENBQUM7WUFDZixLQUFLLEdBQUc7Z0JBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsT0FBTyxJQUFJLENBQUM7WUFDZCxLQUFLLEdBQUc7Z0JBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsT0FBTyxHQUFHLENBQUM7WUFDYixLQUFLLEdBQUc7Z0JBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENB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LEVBQUU7b0JBQ3RDLEtBQUssQ0FBQyxJQUFJLEtBQUssRUFBRTt3QkFDZixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUU7NEJBQ2xELENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNuQixJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0NBQ25CLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7NkJBQ2Q7aUNBQU07Z0NBQ0wsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ2pCO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUNELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQixDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBDb3B5cmlnaHQgMjAyMSAgU2VuWCBTLkEuUy5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqL1xuXG4vLyBhZGFwdGVkIGZyb20gQ2Fub3AncyBKU09OLHBhcnNlTW9yZSBodHRwczovL2dpdGh1Yi5jb20vQ2Fub3AvSlNPTi5wYXJzZU1vcmUvXG5leHBvcnQgY2xhc3MgSnNvbkxpYiB7XG4gIGF0O1x0IC8vIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXJcbiAgY2g7XHQgLy8gVGhlIGN1cnJlbnQgY2hhcmFjdGVyXG4gIGVzY2FwZWUgPSB7XG4gICAgJ1wiJzogJ1wiJyxcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICAnLyc6ICcvJyxcbiAgICBiOiAnXFxiJyxcbiAgICBmOiAnXFxmJyxcbiAgICBuOiAnXFxuJyxcbiAgICByOiAnXFxyJyxcbiAgICB0OiAnXFx0J1xuICB9O1xuICB0ZXh0O1xuXG4gIHByaXZhdGUgZXJyb3IobSkge1xuICAgIHRocm93IHtcbiAgICAgIG5hbWU6ICdTeW50YXhFcnJvcicsXG4gICAgICBtZXNzYWdlOiBtLFxuICAgICAgYXQ6IHRoaXMuYXQsXG4gICAgICB0ZXh0OiB0aGlzLnRleHRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmNoID0gdGhpcy50ZXh0LmNoYXJBdCh0aGlzLmF0KyspO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVjayhjKSB7XG4gICAgaWYgKGMgIT09IHRoaXMuY2gpIHtcbiAgICAgIHRoaXMuZXJyb3IoJ0V4cGVjdGVkIFxcJycgKyBjICsgJ1xcJyBpbnN0ZWFkIG9mIFxcJycgKyB0aGlzLmNoICsgJ1xcJycpO1xuICAgIH1cbiAgICB0aGlzLmNoID0gdGhpcy50ZXh0LmNoYXJBdCh0aGlzLmF0KyspO1xuICB9XG5cbiAgcHJpdmF0ZSBudW1iZXIoKSB7XG4gICAgbGV0IHN0cmluZyA9ICcnO1xuICAgIGlmICh0aGlzLmNoID09PSAnLScpIHtcbiAgICAgIHN0cmluZyA9ICctJztcbiAgICAgIHRoaXMuY2hlY2soJy0nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2ggPT09ICdJJykge1xuICAgICAgdGhpcy5jaGVjaygnSScpO1xuICAgICAgdGhpcy5jaGVjaygnbicpO1xuICAgICAgdGhpcy5jaGVjaygnZicpO1xuICAgICAgdGhpcy5jaGVjaygnaScpO1xuICAgICAgdGhpcy5jaGVjaygnbicpO1xuICAgICAgdGhpcy5jaGVjaygnaScpO1xuICAgICAgdGhpcy5jaGVjaygndCcpO1xuICAgICAgdGhpcy5jaGVjaygneScpO1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgd2hpbGUgKHRoaXMuY2ggPj0gJzAnICYmIHRoaXMuY2ggPD0gJzknKSB7XG4gICAgICBzdHJpbmcgKz0gdGhpcy5jaDtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaCA9PT0gJy4nKSB7XG4gICAgICBzdHJpbmcgKz0gJy4nO1xuICAgICAgd2hpbGUgKHRoaXMubmV4dCgpICYmIHRoaXMuY2ggPj0gJzAnICYmIHRoaXMuY2ggPD0gJzknKSB7XG4gICAgICAgIHN0cmluZyArPSB0aGlzLmNoO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jaCA9PT0gJ2UnIHx8IHRoaXMuY2ggPT09ICdFJykge1xuICAgICAgc3RyaW5nICs9IHRoaXMuY2g7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGlmICh0aGlzLmNoID09PSAnLScgfHwgdGhpcy5jaCA9PT0gJysnKSB7XG4gICAgICAgIHN0cmluZyArPSB0aGlzLmNoO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICh0aGlzLmNoID49ICcwJyAmJiB0aGlzLmNoIDw9ICc5Jykge1xuICAgICAgICBzdHJpbmcgKz0gdGhpcy5jaDtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiArc3RyaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHJpbmcoKSB7XG4gICAgbGV0IGhleDtcbiAgICBsZXQgc3RyaW5nID0gJyc7XG4gICAgbGV0IHVmZmZmO1xuICAgIGlmICh0aGlzLmNoID09PSAnXCInKSB7XG4gICAgICB3aGlsZSAodGhpcy5uZXh0KCkpIHtcbiAgICAgICAgaWYgKHRoaXMuY2ggPT09ICdcIicpIHtcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICBpZiAodGhpcy5jaCA9PT0gJ3UnKSB7XG4gICAgICAgICAgICB1ZmZmZiA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgICBoZXggPSBwYXJzZUludCh0aGlzLm5leHQoKSwgMTYpO1xuICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGhleCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1ZmZmZiA9IHVmZmZmICogMTYgKyBoZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1ZmZmZik7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVzY2FwZWVbdGhpcy5jaF0pIHtcbiAgICAgICAgICAgIHN0cmluZyArPSB0aGlzLmVzY2FwZWVbdGhpcy5jaF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJpbmcgKz0gdGhpcy5jaDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVycm9yKCdCYWQgc3RyaW5nJyk7XG4gIH1cblxuICBwcml2YXRlIHdoaXRlKCkgeyAvLyBTa2lwIHdoaXRlc3BhY2UuXG4gICAgd2hpbGUgKHRoaXMuY2ggJiYgdGhpcy5jaCA8PSAnICcpIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd29yZCgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuY2gpIHtcbiAgICAgIGNhc2UgJ3QnOlxuICAgICAgICB0aGlzLmNoZWNrKCd0Jyk7XG4gICAgICAgIHRoaXMuY2hlY2soJ3InKTtcbiAgICAgICAgdGhpcy5jaGVjaygndScpO1xuICAgICAgICB0aGlzLmNoZWNrKCdlJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnZic6XG4gICAgICAgIHRoaXMuY2hlY2soJ2YnKTtcbiAgICAgICAgdGhpcy5jaGVjaygnYScpO1xuICAgICAgICB0aGlzLmNoZWNrKCdsJyk7XG4gICAgICAgIHRoaXMuY2hlY2soJ3MnKTtcbiAgICAgICAgdGhpcy5jaGVjaygnZScpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjYXNlICduJzpcbiAgICAgICAgdGhpcy5jaGVjaygnbicpO1xuICAgICAgICB0aGlzLmNoZWNrKCd1Jyk7XG4gICAgICAgIHRoaXMuY2hlY2soJ2wnKTtcbiAgICAgICAgdGhpcy5jaGVjaygnbCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNhc2UgJ04nOlxuICAgICAgICB0aGlzLmNoZWNrKCdOJyk7XG4gICAgICAgIHRoaXMuY2hlY2soJ2EnKTtcbiAgICAgICAgdGhpcy5jaGVjaygnTicpO1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgY2FzZSAnSSc6XG4gICAgICAgIHRoaXMuY2hlY2soJ0knKTtcbiAgICAgICAgdGhpcy5jaGVjaygnbicpO1xuICAgICAgICB0aGlzLmNoZWNrKCdmJyk7XG4gICAgICAgIHRoaXMuY2hlY2soJ2knKTtcbiAgICAgICAgdGhpcy5jaGVjaygnbicpO1xuICAgICAgICB0aGlzLmNoZWNrKCdpJyk7XG4gICAgICAgIHRoaXMuY2hlY2soJ3QnKTtcbiAgICAgICAgdGhpcy5jaGVjaygneScpO1xuICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgfVxuICAgIHRoaXMuZXJyb3IoJ1VuZXhwZWN0ZWQgXFwnJyArIHRoaXMuY2ggKyAnXFwnJyk7XG4gIH1cblxuICBwcml2YXRlIGFycmF5KCkge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgaWYgKHRoaXMuY2ggPT09ICdbJykge1xuICAgICAgdGhpcy5jaGVjaygnWycpO1xuICAgICAgdGhpcy53aGl0ZSgpO1xuICAgICAgaWYgKHRoaXMuY2ggPT09ICddJykge1xuICAgICAgICB0aGlzLmNoZWNrKCddJyk7XG4gICAgICAgIHJldHVybiBhcnJheTsgICAvLyBlbXB0eSBhcnJheVxuICAgICAgfVxuICAgICAgd2hpbGUgKHRoaXMuY2gpIHtcbiAgICAgICAgYXJyYXkucHVzaCh0aGlzLnZhbHVlKCkpO1xuICAgICAgICB0aGlzLndoaXRlKCk7XG4gICAgICAgIGlmICh0aGlzLmNoID09PSAnXScpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrKCddJyk7XG4gICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2soJywnKTtcbiAgICAgICAgdGhpcy53aGl0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVycm9yKCdCYWQgYXJyYXknKTtcbiAgfVxuXG4gIHByaXZhdGUgb2JqZWN0KCkge1xuICAgIGxldCBrZXk7XG4gICAgY29uc3Qgb2JqZWN0ID0ge307XG4gICAgaWYgKHRoaXMuY2ggPT09ICd7Jykge1xuICAgICAgdGhpcy5jaGVjaygneycpO1xuICAgICAgdGhpcy53aGl0ZSgpO1xuICAgICAgaWYgKHRoaXMuY2ggPT09ICd9Jykge1xuICAgICAgICB0aGlzLmNoZWNrKCd9Jyk7XG4gICAgICAgIHJldHVybiBvYmplY3Q7ICAgLy8gZW1wdHkgb2JqZWN0XG4gICAgICB9XG4gICAgICB3aGlsZSAodGhpcy5jaCkge1xuICAgICAgICBrZXkgPSB0aGlzLnN0cmluZygpO1xuICAgICAgICB0aGlzLndoaXRlKCk7XG4gICAgICAgIHRoaXMuY2hlY2soJzonKTtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgICAgIHRoaXMuZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgXCInICsga2V5ICsgJ1wiJyk7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0W2tleV0gPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIHRoaXMud2hpdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuY2ggPT09ICd9Jykge1xuICAgICAgICAgIHRoaXMuY2hlY2soJ30nKTtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2soJywnKTtcbiAgICAgICAgdGhpcy53aGl0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVycm9yKCdCYWQgb2JqZWN0Jyk7XG4gIH1cblxuICBwcml2YXRlIHZhbHVlKCkge1xuICAgIHRoaXMud2hpdGUoKTtcbiAgICBzd2l0Y2ggKHRoaXMuY2gpIHtcbiAgICAgIGNhc2UgJ3snOlxuICAgICAgICByZXR1cm4gdGhpcy5vYmplY3QoKTtcbiAgICAgIGNhc2UgJ1snOlxuICAgICAgICByZXR1cm4gdGhpcy5hcnJheSgpO1xuICAgICAgY2FzZSAnXCInOlxuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcoKTtcbiAgICAgIGNhc2UgJy0nOlxuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXIoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmNoID49ICcwJyAmJiB0aGlzLmNoIDw9ICc5JyA/IHRoaXMubnVtYmVyKCkgOiB0aGlzLndvcmQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFyc2Uoc291cmNlLCByZXZpdmVyPykge1xuICAgIGxldCByZXN1bHQ7XG4gICAgdGhpcy50ZXh0ID0gc291cmNlO1xuICAgIHRoaXMuYXQgPSAwO1xuICAgIHRoaXMuY2ggPSAnICc7XG4gICAgcmVzdWx0ID0gdGhpcy52YWx1ZSgpO1xuICAgIHRoaXMud2hpdGUoKTtcbiAgICBpZiAodGhpcy5jaCkge1xuICAgICAgdGhpcy5lcnJvcignU3ludGF4IGVycm9yJyk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgcmV2aXZlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyAoZnVuY3Rpb24gd2Fsayhob2xkZXIsIGtleSkge1xuICAgICAgICBsZXQgaztcbiAgICAgICAgbGV0IHY7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaG9sZGVyW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZm9yIChrIGluIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkge1xuICAgICAgICAgICAgICB2ID0gd2Fsayh2YWx1ZSwgayk7XG4gICAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVtrXSA9IHY7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW2tdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXZpdmVyLmNhbGwoaG9sZGVyLCBrZXksIHZhbHVlKTtcbiAgICAgIH0oeycnOiByZXN1bHR9LCAnJykpXG4gICAgICA6IHJlc3VsdDtcbiAgfVxufVxuIl19