UNPKG

ember-legacy-class-transform

Version:
393 lines (371 loc) 49.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdatingOpcode = exports.AbstractOpcode = exports.APPEND_OPCODES = exports.AppendOpcodes = exports.Register = undefined; exports.debugSlice = debugSlice; exports.inspect = inspect; var _util = require("@glimmer/util"); function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) { var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } }return obj; } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * Registers * * For the most part, these follows MIPS naming conventions, however the * register numbers are different. */ var Register = exports.Register = undefined; (function (Register) { // $0 or $pc (program counter): pointer into `program` for the next insturction; -1 means exit Register[Register["pc"] = 0] = "pc"; // $1 or $ra (return address): pointer into `program` for the return Register[Register["ra"] = 1] = "ra"; // $2 or $fp (frame pointer): pointer into the `evalStack` for the base of the stack Register[Register["fp"] = 2] = "fp"; // $3 or $sp (stack pointer): pointer into the `evalStack` for the top of the stack Register[Register["sp"] = 3] = "sp"; // $4-$5 or $s0-$s1 (saved): callee saved general-purpose registers Register[Register["s0"] = 4] = "s0"; Register[Register["s1"] = 5] = "s1"; // $6-$7 or $t0-$t1 (temporaries): caller saved general-purpose registers Register[Register["t0"] = 6] = "t0"; Register[Register["t1"] = 7] = "t1"; })(Register || (exports.Register = Register = {})); function debugSlice(env, start, end) { if (!false && false) { /* tslint:disable:no-console */ var program = env.program; var constants = program.constants; // console is not available in IE9 if (typeof console === 'undefined') { return; } // IE10 does not have `console.group` if (typeof console.group !== 'function') { return; } console.group("%c" + start + ":" + end, 'color: #999'); for (var i = start; i < end; i = i + 4) { var _program$opcode = program.opcode(i), type = _program$opcode.type, op1 = _program$opcode.op1, op2 = _program$opcode.op2, op3 = _program$opcode.op3; var _debug = debug(constants, type, op1, op2, op3), name = _debug[0], params = _debug[1]; console.log(i + ". " + logOpcode(name, params)); } console.groupEnd(); /* tslint:enable:no-console */ } } function logOpcode(type, params) { if (!false && false) { var out = type; if (params) { var args = Object.keys(params).map(function (p) { return " " + p + "=" + json(params[p]); }).join(''); out += args; } return "(" + out + ")"; } } function json(param) { if (typeof param === 'function') { return '<function>'; } var string = void 0; try { string = JSON.stringify(param); } catch (e) { return '<cannot generate JSON>'; } if (string === undefined) { return 'undefined'; } var debug = JSON.parse(string); if (typeof debug === 'object' && debug !== null && debug.GlimmerDebug !== undefined) { return debug.GlimmerDebug; } return string; } function debug(c, op, op1, op2, op3) { if (!false && false) { switch (op) { case 0 /* Bug */: throw (0, _util.unreachable)(); case 1 /* Helper */: return ['Helper', { helper: c.getFunction(op1) }]; case 2 /* Function */: return ['Function', { function: c.getFunction(op1) }]; case 4 /* SetVariable */: return ['SetVariable', { symbol: op1 }]; case 5 /* GetVariable */: return ['GetVariable', { symbol: op1 }]; case 6 /* GetProperty */: return ['GetProperty', { key: c.getString(op1) }]; case 7 /* PushBlock */: return ['PushBlock', { block: c.getBlock(op1) }]; case 8 /* GetBlock */: return ['GetBlock', { symbol: op1 }]; case 9 /* HasBlock */: return ['HasBlock', { block: op1 }]; case 10 /* HasBlockParams */: return ['HasBlockParams', { block: op1 }]; case 11 /* Concat */: return ['Concat', { size: op1 }]; case 12 /* Immediate */: return ['Immediate', { value: op1 }]; case 13 /* Constant */: return ['Constant', { value: c.getOther(op1) }]; case 14 /* PrimitiveReference */: return ['PrimitiveReference', { primitive: op1 }]; case 15 /* Dup */: return ['Dup', { register: Register[op1], offset: op2 }]; case 16 /* Pop */: return ['Pop', { count: op1 }]; case 17 /* Load */: return ['Load', { register: Register[op1] }]; case 18 /* Fetch */: return ['Fetch', { register: Register[op1] }]; /// PRELUDE & EXIT case 19 /* RootScope */: return ['RootScope', { symbols: op1, bindCallerScope: !!op2 }]; case 20 /* ChildScope */: return ['ChildScope', {}]; case 21 /* PopScope */: return ['PopScope', {}]; case 22 /* Return */: return ['Return', {}]; case 23 /* ReturnTo */: return ['ReturnTo', { offset: op1 }]; /// HTML case 24 /* Text */: return ['Text', { text: c.getString(op1) }]; case 25 /* Comment */: return ['Comment', { comment: c.getString(op1) }]; case 26 /* DynamicContent */: return ['DynamicContent', { value: c.getOther(op1) }]; case 27 /* OpenElement */: return ['OpenElement', { tag: c.getString(op1) }]; case 28 /* OpenElementWithOperations */: return ['OpenElementWithOperations', { tag: c.getString(op1) }]; case 29 /* OpenDynamicElement */: return ['OpenDynamicElement', {}]; case 30 /* StaticAttr */: return ['StaticAttr', { name: c.getString(op1), value: c.getString(op2), namespace: op3 ? c.getString(op3) : null }]; case 31 /* DynamicAttr */: return ['DynamicAttr', { name: c.getString(op1), trusting: !!op2 }]; case 32 /* DynamicAttrNS */: return ['DynamicAttrNS', { name: c.getString(op1), ns: c.getString(op2), trusting: !!op2 }]; case 33 /* FlushElement */: return ['FlushElement', {}]; case 34 /* CloseElement */: return ['CloseElement', {}]; /// MODIFIER case 35 /* Modifier */: return ['Modifier', {}]; /// WORMHOLE case 36 /* PushRemoteElement */: return ['PushRemoteElement', {}]; case 37 /* PopRemoteElement */: return ['PopRemoteElement', {}]; /// DYNAMIC SCOPE case 38 /* BindDynamicScope */: return ['BindDynamicScope', {}]; case 39 /* PushDynamicScope */: return ['PushDynamicScope', {}]; case 40 /* PopDynamicScope */: return ['PopDynamicScope', {}]; /// VM case 41 /* CompileDynamicBlock */: return ['CompileDynamicBlock', {}]; case 42 /* InvokeStatic */: return ['InvokeStatic', { block: c.getBlock(op1) }]; case 43 /* InvokeDynamic */: return ['InvokeDynamic', { invoker: c.getOther(op1) }]; case 44 /* Jump */: return ['Jump', { to: op1 }]; case 45 /* JumpIf */: return ['JumpIf', { to: op1 }]; case 46 /* JumpUnless */: return ['JumpUnless', { to: op1 }]; case 47 /* PushFrame */: return ['PushFrame', {}]; case 48 /* PopFrame */: return ['PopFrame', {}]; case 49 /* Enter */: return ['Enter', { args: op1 }]; case 50 /* Exit */: return ['Exit', {}]; case 51 /* Test */: return ['ToBoolean', {}]; /// LISTS case 52 /* EnterList */: return ['EnterList', { start: op1 }]; case 53 /* ExitList */: return ['ExitList', {}]; case 54 /* PutIterator */: return ['PutIterator', {}]; case 55 /* Iterate */: return ['Iterate', { end: op1 }]; /// COMPONENTS case 56 /* PushComponentManager */: return ['PushComponentManager', { definition: c.getOther(op1) }]; case 57 /* PushDynamicComponentManager */: return ['PushDynamicComponentManager', {}]; case 58 /* PushArgs */: return ['PushArgs', { synthetic: !!op2 }]; case 59 /* PrepareArgs */: return ['PrepareArgs', { state: Register[op1] }]; case 60 /* CreateComponent */: return ['CreateComponent', { flags: op1, state: Register[op2] }]; case 61 /* RegisterComponentDestructor */: return ['RegisterComponentDestructor', {}]; case 62 /* PushComponentOperations */: return ['PushComponentOperations', {}]; case 63 /* GetComponentSelf */: return ['GetComponentSelf', { state: Register[op1] }]; case 64 /* GetComponentLayout */: return ['GetComponentLayout', { state: Register[op1] }]; case 65 /* BeginComponentTransaction */: return ['BeginComponentTransaction', {}]; case 66 /* CommitComponentTransaction */: return ['CommitComponentTransaction', {}]; case 67 /* DidCreateElement */: return ['DidCreateElement', { state: Register[op1] }]; case 68 /* DidRenderLayout */: return ['DidRenderLayout', {}]; /// PARTIALS case 69 /* GetPartialTemplate */: return ['CompilePartial', {}]; case 70 /* ResolveMaybeLocal */: return ['ResolveMaybeLocal', { name: c.getString(op1) }]; /// DEBUGGER case 71 /* Debugger */: return ['Debugger', { symbols: c.getOther(op1), evalInfo: c.getArray(op2) }]; /// STATEMENTS case 72 /* Size */: throw (0, _util.unreachable)(); } throw (0, _util.unreachable)(); } return ['', {}]; } var AppendOpcodes = exports.AppendOpcodes = function () { function AppendOpcodes() { _classCallCheck(this, AppendOpcodes); this.evaluateOpcode = (0, _util.fillNulls)(72 /* Size */).slice(); } AppendOpcodes.prototype.add = function add(name, evaluate) { this.evaluateOpcode[name] = evaluate; }; AppendOpcodes.prototype.evaluate = function evaluate(vm, opcode, type) { var func = this.evaluateOpcode[type]; if (!false && false) { /* tslint:disable */ var _debug2 = debug(vm.constants, opcode.type, opcode.op1, opcode.op2, opcode.op3), name = _debug2[0], params = _debug2[1]; console.log((0, _util.typePos)(vm['pc']) + ". " + logOpcode(name, params)); // console.log(...debug(vm.constants, type, opcode.op1, opcode.op2, opcode.op3)); /* tslint:enable */ } func(vm, opcode); if (!false && false) { /* tslint:disable */ console.log('%c -> pc: %d, ra: %d, fp: %d, sp: %d, s0: %O, s1: %O, t0: %O, t1: %O', 'color: orange', vm['pc'], vm['ra'], vm['fp'], vm['sp'], vm['s0'], vm['s1'], vm['t0'], vm['t1']); console.log('%c -> eval stack', 'color: red', vm.stack.toArray()); console.log('%c -> scope', 'color: green', vm.scope()['slots'].map(function (s) { return s && s['value'] ? s['value']() : s; })); console.log('%c -> elements', 'color: blue', vm.elements()['elementStack'].toArray()); /* tslint:enable */ } }; return AppendOpcodes; }(); var APPEND_OPCODES = exports.APPEND_OPCODES = new AppendOpcodes(); var AbstractOpcode = exports.AbstractOpcode = function () { function AbstractOpcode() { _classCallCheck(this, AbstractOpcode); (0, _util.initializeGuid)(this); } AbstractOpcode.prototype.toJSON = function toJSON() { return { guid: this._guid, type: this.type }; }; return AbstractOpcode; }(); var UpdatingOpcode = exports.UpdatingOpcode = function (_AbstractOpcode) { _inherits(UpdatingOpcode, _AbstractOpcode); function UpdatingOpcode() { _classCallCheck(this, UpdatingOpcode); var _this = _possibleConstructorReturn(this, _AbstractOpcode.apply(this, arguments)); _this.next = null; _this.prev = null; return _this; } return UpdatingOpcode; }(AbstractOpcode); function inspect(opcodes) { var buffer = []; opcodes.forEach(function (opcode, i) { _inspect(opcode.toJSON(), buffer, 0, i); }); return buffer.join(''); } function _inspect(opcode, buffer, level, index) { var indentation = []; for (var i = 0; i < level; i++) { indentation.push(' '); } buffer.push.apply(buffer, indentation); buffer.push(index + ". " + opcode.type); if (opcode.args || opcode.details) { buffer.push('('); if (opcode.args) { buffer.push(opcode.args.join(', ')); } if (opcode.details) { var keys = Object.keys(opcode.details); if (keys.length) { if (opcode.args && opcode.args.length) { buffer.push(', '); } buffer.push(keys.map(function (key) { return key + "=" + (opcode.details && opcode.details[key]); }).join(', ')); } } buffer.push(')'); } buffer.push('\n'); if (opcode.children && opcode.children.length) { for (var _i = 0; _i < opcode.children.length; _i++) { _inspect(opcode.children[_i], buffer, level + 1, _i); } } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9vcGNvZGVzLmpzIl0sIm5hbWVzIjpbImluaXRpYWxpemVHdWlkIiwiZmlsbE51bGxzIiwidW5yZWFjaGFibGUiLCJ0eXBlUG9zIiwiUmVnaXN0ZXIiLCJkZWJ1Z1NsaWNlIiwiZW52Iiwic3RhcnQiLCJlbmQiLCJwcm9ncmFtIiwiY29uc3RhbnRzIiwiY29uc29sZSIsImdyb3VwIiwiaSIsIm9wY29kZSIsInR5cGUiLCJvcDEiLCJvcDIiLCJvcDMiLCJkZWJ1ZyIsIm5hbWUiLCJwYXJhbXMiLCJsb2ciLCJsb2dPcGNvZGUiLCJncm91cEVuZCIsIm91dCIsImFyZ3MiLCJPYmplY3QiLCJrZXlzIiwibWFwIiwicCIsImpzb24iLCJqb2luIiwicGFyYW0iLCJzdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsInVuZGVmaW5lZCIsInBhcnNlIiwiR2xpbW1lckRlYnVnIiwiYyIsIm9wIiwiaGVscGVyIiwiZ2V0RnVuY3Rpb24iLCJmdW5jdGlvbiIsInN5bWJvbCIsImtleSIsImdldFN0cmluZyIsImJsb2NrIiwiZ2V0QmxvY2siLCJzaXplIiwidmFsdWUiLCJnZXRPdGhlciIsInByaW1pdGl2ZSIsInJlZ2lzdGVyIiwib2Zmc2V0IiwiY291bnQiLCJzeW1ib2xzIiwiYmluZENhbGxlclNjb3BlIiwidGV4dCIsImNvbW1lbnQiLCJ0YWciLCJuYW1lc3BhY2UiLCJ0cnVzdGluZyIsIm5zIiwiaW52b2tlciIsInRvIiwiZGVmaW5pdGlvbiIsInN5bnRoZXRpYyIsInN0YXRlIiwiZmxhZ3MiLCJldmFsSW5mbyIsImdldEFycmF5IiwiQXBwZW5kT3Bjb2RlcyIsImV2YWx1YXRlT3Bjb2RlIiwic2xpY2UiLCJhZGQiLCJldmFsdWF0ZSIsInZtIiwiZnVuYyIsInN0YWNrIiwidG9BcnJheSIsInNjb3BlIiwicyIsImVsZW1lbnRzIiwiQVBQRU5EX09QQ09ERVMiLCJBYnN0cmFjdE9wY29kZSIsInRvSlNPTiIsImd1aWQiLCJfZ3VpZCIsIlVwZGF0aW5nT3Bjb2RlIiwiYXJndW1lbnRzIiwibmV4dCIsInByZXYiLCJpbnNwZWN0Iiwib3Bjb2RlcyIsImJ1ZmZlciIsImZvckVhY2giLCJfaW5zcGVjdCIsImxldmVsIiwiaW5kZXgiLCJpbmRlbnRhdGlvbiIsInB1c2giLCJkZXRhaWxzIiwibGVuZ3RoIiwiY2hpbGRyZW4iXSwibWFwcGluZ3MiOiI7Ozs7OztRQXlCTyxBQUFTO1FBa1FULEFBQVM7O0FBM1JoQixBQUFTLEFBQWdCLEFBQVcsQUFBYSxBQUFlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWhFLEFBTUE7Ozs7OztBQUFPLElBQUEsQUFBSTtBQUNYLENBQUMsVUFBQSxBQUFVLFVBQVUsQUFDakI7QUFDQTthQUFTLFNBQUEsQUFBUyxRQUFsQixBQUEwQixLQUExQixBQUErQixBQUMvQjtBQUNBO2FBQVMsU0FBQSxBQUFTLFFBQWxCLEFBQTBCLEtBQTFCLEFBQStCLEFBQy9CO0FBQ0E7YUFBUyxTQUFBLEFBQVMsUUFBbEIsQUFBMEIsS0FBMUIsQUFBK0IsQUFDL0I7QUFDQTthQUFTLFNBQUEsQUFBUyxRQUFsQixBQUEwQixLQUExQixBQUErQixBQUMvQjtBQUNBO2FBQVMsU0FBQSxBQUFTLFFBQWxCLEFBQTBCLEtBQTFCLEFBQStCLEFBQy9CO2FBQVMsU0FBQSxBQUFTLFFBQWxCLEFBQTBCLEtBQTFCLEFBQStCLEFBQy9CO0FBQ0E7YUFBUyxTQUFBLEFBQVMsUUFBbEIsQUFBMEIsS0FBMUIsQUFBK0IsQUFDL0I7YUFBUyxTQUFBLEFBQVMsUUFBbEIsQUFBMEIsS0FBMUIsQUFBK0IsQUFDbEM7QUFmRCxHQWVHLGdDQUFhLFdBZmhCLEFBZUcsQUFBd0IsQUFDM0I7QUFBTyxvQkFBQSxBQUFvQixLQUFwQixBQUF5QixPQUF6QixBQUFnQyxLQUFLLEFBQ3hDO1FBQUksQ0FBQSxBQUFDLFNBQUwsQUFBYyxPQUFPLEFBQ2pCO0FBRGlCO1lBQUEsQUFFWCxVQUZXLEFBRUMsSUFGRCxBQUVYO1lBRlcsQUFHWCxZQUhXLEFBR0csUUFISCxBQUdYLEFBQ047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LEFBQU8sV0FBVyxPQUFBLEFBQU8sUUFBMUMsQUFBbUMsQUFBZTtBQUEzRCxpQkFBQSxFQUFBLEFBQW1FLEtBQS9FLEFBQVksQUFBd0UsQUFDdkY7QUFDSjtBQUNEO2VBQUEsQUFBTyxLQUFQLEFBQVksQUFDZjtBQUNEO1dBQUEsQUFBTyxLQUFQLEFBQVksQUFDWjtRQUFJLE9BQUEsQUFBTyxZQUFZLE9BQUEsQUFBTyxTQUE5QixBQUF1QyxRQUFRLEFBQzNDO2FBQUssSUFBSSxLQUFULEFBQWEsR0FBRyxLQUFJLE9BQUEsQUFBTyxTQUEzQixBQUFvQyxRQUFwQyxBQUE0QyxNQUFLLEFBQzdDO3FCQUFTLE9BQUEsQUFBTyxTQUFoQixBQUFTLEFBQWdCLEtBQXpCLEFBQTZCLFFBQVEsUUFBckMsQUFBNkMsR0FBN0MsQUFBZ0QsQUFDbkQ7QUFDSjtBQUNKIiwiZmlsZSI6ImxpYi9vcGNvZGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5pdGlhbGl6ZUd1aWQsIGZpbGxOdWxscywgdW5yZWFjaGFibGUsIHR5cGVQb3MgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuLyoqXG4gKiBSZWdpc3RlcnNcbiAqXG4gKiBGb3IgdGhlIG1vc3QgcGFydCwgdGhlc2UgZm9sbG93cyBNSVBTIG5hbWluZyBjb252ZW50aW9ucywgaG93ZXZlciB0aGVcbiAqIHJlZ2lzdGVyIG51bWJlcnMgYXJlIGRpZmZlcmVudC5cbiAqL1xuZXhwb3J0IHZhciBSZWdpc3RlcjtcbihmdW5jdGlvbiAoUmVnaXN0ZXIpIHtcbiAgICAvLyAkMCBvciAkcGMgKHByb2dyYW0gY291bnRlcik6IHBvaW50ZXIgaW50byBgcHJvZ3JhbWAgZm9yIHRoZSBuZXh0IGluc3R1cmN0aW9uOyAtMSBtZWFucyBleGl0XG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJwY1wiXSA9IDBdID0gXCJwY1wiO1xuICAgIC8vICQxIG9yICRyYSAocmV0dXJuIGFkZHJlc3MpOiBwb2ludGVyIGludG8gYHByb2dyYW1gIGZvciB0aGUgcmV0dXJuXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJyYVwiXSA9IDFdID0gXCJyYVwiO1xuICAgIC8vICQyIG9yICRmcCAoZnJhbWUgcG9pbnRlcik6IHBvaW50ZXIgaW50byB0aGUgYGV2YWxTdGFja2AgZm9yIHRoZSBiYXNlIG9mIHRoZSBzdGFja1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1wiZnBcIl0gPSAyXSA9IFwiZnBcIjtcbiAgICAvLyAkMyBvciAkc3AgKHN0YWNrIHBvaW50ZXIpOiBwb2ludGVyIGludG8gdGhlIGBldmFsU3RhY2tgIGZvciB0aGUgdG9wIG9mIHRoZSBzdGFja1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1wic3BcIl0gPSAzXSA9IFwic3BcIjtcbiAgICAvLyAkNC0kNSBvciAkczAtJHMxIChzYXZlZCk6IGNhbGxlZSBzYXZlZCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJzMFwiXSA9IDRdID0gXCJzMFwiO1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1wiczFcIl0gPSA1XSA9IFwiczFcIjtcbiAgICAvLyAkNi0kNyBvciAkdDAtJHQxICh0ZW1wb3Jhcmllcyk6IGNhbGxlciBzYXZlZCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJ0MFwiXSA9IDZdID0gXCJ0MFwiO1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1widDFcIl0gPSA3XSA9IFwidDFcIjtcbn0pKFJlZ2lzdGVyIHx8IChSZWdpc3RlciA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gZGVidWdTbGljZShlbnYsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIWZhbHNlICYmIGZhbHNlKSB7XG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGUgKi9cbiAgICAgICAgbGV0IHsgcHJvZ3JhbSB9ID0gZW52O1xuICAgICAgICBsZXQgeyBjb25zdGFudHMgfSA9IHByb2dyYW07XG4gICAgICAgIC8vIGNvbnNvbGUgaXMgbm90IGF2YWlsYWJsZSBpbiBJRTlcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElFMTAgZG9lcyBub3QgaGF2ZSBgY29uc29sZS5ncm91cGBcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLmdyb3VwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5ncm91cChgJWMke3N0YXJ0fToke2VuZH1gLCAnY29sb3I6ICM5OTknKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpID0gaSArIDQpIHtcbiAgICAgICAgICAgIGxldCB7IHR5cGUsIG9wMSwgb3AyLCBvcDMgfSA9IHByb2dyYW0ub3Bjb2RlKGkpO1xuICAgICAgICAgICAgbGV0IFtuYW1lLCBwYXJhbXNdID0gZGVidWcoY29uc3RhbnRzLCB0eXBlLCBvcDEsIG9wMiwgb3AzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2l9LiAke2xvZ09wY29kZShuYW1lLCBwYXJhbXMpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgLyogdHNsaW50OmVuYWJsZTpuby1jb25zb2xlICovXG4gICAgfVxufVxuZnVuY3Rpb24gbG9nT3Bjb2RlKHR5cGUsIHBhcmFtcykge1xuICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgbGV0IG91dCA9IHR5cGU7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIGxldCBhcmdzID0gT2JqZWN0LmtleXMocGFyYW1zKS5tYXAocCA9PiBgICR7cH09JHtqc29uKHBhcmFtc1twXSl9YCkuam9pbignJyk7XG4gICAgICAgICAgICBvdXQgKz0gYXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgke291dH0pYDtcbiAgICB9XG59XG5mdW5jdGlvbiBqc29uKHBhcmFtKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gJzxmdW5jdGlvbj4nO1xuICAgIH1cbiAgICBsZXQgc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICAgIHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHBhcmFtKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAnPGNhbm5vdCBnZW5lcmF0ZSBKU09OPic7XG4gICAgfVxuICAgIGlmIChzdHJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIGxldCBkZWJ1ZyA9IEpTT04ucGFyc2Uoc3RyaW5nKTtcbiAgICBpZiAodHlwZW9mIGRlYnVnID09PSAnb2JqZWN0JyAmJiBkZWJ1ZyAhPT0gbnVsbCAmJiBkZWJ1Zy5HbGltbWVyRGVidWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGVidWcuR2xpbW1lckRlYnVnO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nO1xufVxuZnVuY3Rpb24gZGVidWcoYywgb3AsIG9wMSwgb3AyLCBvcDMpIHtcbiAgICBpZiAoIWZhbHNlICYmIGZhbHNlKSB7XG4gICAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgICAgIGNhc2UgMCAvKiBCdWcgKi86XG4gICAgICAgICAgICAgICAgdGhyb3cgdW5yZWFjaGFibGUoKTtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBIZWxwZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSGVscGVyJywgeyBoZWxwZXI6IGMuZ2V0RnVuY3Rpb24ob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBGdW5jdGlvbiAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydGdW5jdGlvbicsIHsgZnVuY3Rpb246IGMuZ2V0RnVuY3Rpb24ob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgNCAvKiBTZXRWYXJpYWJsZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydTZXRWYXJpYWJsZScsIHsgc3ltYm9sOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDUgLyogR2V0VmFyaWFibGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnR2V0VmFyaWFibGUnLCB7IHN5bWJvbDogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA2IC8qIEdldFByb3BlcnR5ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0dldFByb3BlcnR5JywgeyBrZXk6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDcgLyogUHVzaEJsb2NrICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1B1c2hCbG9jaycsIHsgYmxvY2s6IGMuZ2V0QmxvY2sob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgOCAvKiBHZXRCbG9jayAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydHZXRCbG9jaycsIHsgc3ltYm9sOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDkgLyogSGFzQmxvY2sgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSGFzQmxvY2snLCB7IGJsb2NrOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDEwIC8qIEhhc0Jsb2NrUGFyYW1zICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0hhc0Jsb2NrUGFyYW1zJywgeyBibG9jazogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSAxMSAvKiBDb25jYXQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29uY2F0JywgeyBzaXplOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDEyIC8qIEltbWVkaWF0ZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydJbW1lZGlhdGUnLCB7IHZhbHVlOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDEzIC8qIENvbnN0YW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NvbnN0YW50JywgeyB2YWx1ZTogYy5nZXRPdGhlcihvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSAxNCAvKiBQcmltaXRpdmVSZWZlcmVuY2UgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHJpbWl0aXZlUmVmZXJlbmNlJywgeyBwcmltaXRpdmU6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgMTUgLyogRHVwICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0R1cCcsIHsgcmVnaXN0ZXI6IFJlZ2lzdGVyW29wMV0sIG9mZnNldDogb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSAxNiAvKiBQb3AgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wJywgeyBjb3VudDogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSAxNyAvKiBMb2FkICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0xvYWQnLCB7IHJlZ2lzdGVyOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSAxOCAvKiBGZXRjaCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydGZXRjaCcsIHsgcmVnaXN0ZXI6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICAvLy8gUFJFTFVERSAmIEVYSVRcbiAgICAgICAgICAgIGNhc2UgMTkgLyogUm9vdFNjb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1Jvb3RTY29wZScsIHsgc3ltYm9sczogb3AxLCBiaW5kQ2FsbGVyU2NvcGU6ICEhb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSAyMCAvKiBDaGlsZFNjb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NoaWxkU2NvcGUnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDIxIC8qIFBvcFNjb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1BvcFNjb3BlJywge31dO1xuICAgICAgICAgICAgY2FzZSAyMiAvKiBSZXR1cm4gKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUmV0dXJuJywge31dO1xuICAgICAgICAgICAgY2FzZSAyMyAvKiBSZXR1cm5UbyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydSZXR1cm5UbycsIHsgb2Zmc2V0OiBvcDEgfV07XG4gICAgICAgICAgICAvLy8gSFRNTFxuICAgICAgICAgICAgY2FzZSAyNCAvKiBUZXh0ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1RleHQnLCB7IHRleHQ6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI1IC8qIENvbW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29tbWVudCcsIHsgY29tbWVudDogYy5nZXRTdHJpbmcob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgMjYgLyogRHluYW1pY0NvbnRlbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRHluYW1pY0NvbnRlbnQnLCB7IHZhbHVlOiBjLmdldE90aGVyKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI3IC8qIE9wZW5FbGVtZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ09wZW5FbGVtZW50JywgeyB0YWc6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI4IC8qIE9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnT3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucycsIHsgdGFnOiBjLmdldFN0cmluZyhvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSAyOSAvKiBPcGVuRHluYW1pY0VsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnT3BlbkR5bmFtaWNFbGVtZW50Jywge31dO1xuICAgICAgICAgICAgY2FzZSAzMCAvKiBTdGF0aWNBdHRyICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1N0YXRpY0F0dHInLCB7IG5hbWU6IGMuZ2V0U3RyaW5nKG9wMSksIHZhbHVlOiBjLmdldFN0cmluZyhvcDIpLCBuYW1lc3BhY2U6IG9wMyA/IGMuZ2V0U3RyaW5nKG9wMykgOiBudWxsIH1dO1xuICAgICAgICAgICAgY2FzZSAzMSAvKiBEeW5hbWljQXR0ciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydEeW5hbWljQXR0cicsIHsgbmFtZTogYy5nZXRTdHJpbmcob3AxKSwgdHJ1c3Rpbmc6ICEhb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSAzMiAvKiBEeW5hbWljQXR0ck5TICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0R5bmFtaWNBdHRyTlMnLCB7IG5hbWU6IGMuZ2V0U3RyaW5nKG9wMSksIG5zOiBjLmdldFN0cmluZyhvcDIpLCB0cnVzdGluZzogISFvcDIgfV07XG4gICAgICAgICAgICBjYXNlIDMzIC8qIEZsdXNoRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydGbHVzaEVsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDM0IC8qIENsb3NlRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDbG9zZUVsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICAvLy8gTU9ESUZJRVJcbiAgICAgICAgICAgIGNhc2UgMzUgLyogTW9kaWZpZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnTW9kaWZpZXInLCB7fV07XG4gICAgICAgICAgICAvLy8gV09STUhPTEVcbiAgICAgICAgICAgIGNhc2UgMzYgLyogUHVzaFJlbW90ZUVsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaFJlbW90ZUVsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDM3IC8qIFBvcFJlbW90ZUVsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wUmVtb3RlRWxlbWVudCcsIHt9XTtcbiAgICAgICAgICAgIC8vLyBEWU5BTUlDIFNDT1BFXG4gICAgICAgICAgICBjYXNlIDM4IC8qIEJpbmREeW5hbWljU2NvcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQmluZER5bmFtaWNTY29wZScsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgMzkgLyogUHVzaER5bmFtaWNTY29wZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoRHluYW1pY1Njb3BlJywge31dO1xuICAgICAgICAgICAgY2FzZSA0MCAvKiBQb3BEeW5hbWljU2NvcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wRHluYW1pY1Njb3BlJywge31dO1xuICAgICAgICAgICAgLy8vIFZNXG4gICAgICAgICAgICBjYXNlIDQxIC8qIENvbXBpbGVEeW5hbWljQmxvY2sgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29tcGlsZUR5bmFtaWNCbG9jaycsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNDIgLyogSW52b2tlU3RhdGljICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0ludm9rZVN0YXRpYycsIHsgYmxvY2s6IGMuZ2V0QmxvY2sob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDMgLyogSW52b2tlRHluYW1pYyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydJbnZva2VEeW5hbWljJywgeyBpbnZva2VyOiBjLmdldE90aGVyKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDQ0IC8qIEp1bXAgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSnVtcCcsIHsgdG86IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDUgLyogSnVtcElmICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0p1bXBJZicsIHsgdG86IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDYgLyogSnVtcFVubGVzcyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydKdW1wVW5sZXNzJywgeyB0bzogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA0NyAvKiBQdXNoRnJhbWUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaEZyYW1lJywge31dO1xuICAgICAgICAgICAgY2FzZSA0OCAvKiBQb3BGcmFtZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQb3BGcmFtZScsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNDkgLyogRW50ZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRW50ZXInLCB7IGFyZ3M6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNTAgLyogRXhpdCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydFeGl0Jywge31dO1xuICAgICAgICAgICAgY2FzZSA1MSAvKiBUZXN0ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1RvQm9vbGVhbicsIHt9XTtcbiAgICAgICAgICAgIC8vLyBMSVNUU1xuICAgICAgICAgICAgY2FzZSA1MiAvKiBFbnRlckxpc3QgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRW50ZXJMaXN0JywgeyBzdGFydDogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA1MyAvKiBFeGl0TGlzdCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydFeGl0TGlzdCcsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNTQgLyogUHV0SXRlcmF0b3IgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHV0SXRlcmF0b3InLCB7fV07XG4gICAgICAgICAgICBjYXNlIDU1IC8qIEl0ZXJhdGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSXRlcmF0ZScsIHsgZW5kOiBvcDEgfV07XG4gICAgICAgICAgICAvLy8gQ09NUE9ORU5UU1xuICAgICAgICAgICAgY2FzZSA1NiAvKiBQdXNoQ29tcG9uZW50TWFuYWdlciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoQ29tcG9uZW50TWFuYWdlcicsIHsgZGVmaW5pdGlvbjogYy5nZXRPdGhlcihvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSA1NyAvKiBQdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyJywge31dO1xuICAgICAgICAgICAgY2FzZSA1OCAvKiBQdXNoQXJncyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoQXJncycsIHsgc3ludGhldGljOiAhIW9wMiB9XTtcbiAgICAgICAgICAgIGNhc2UgNTkgLyogUHJlcGFyZUFyZ3MgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHJlcGFyZUFyZ3MnLCB7IHN0YXRlOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSA2MCAvKiBDcmVhdGVDb21wb25lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ3JlYXRlQ29tcG9uZW50JywgeyBmbGFnczogb3AxLCBzdGF0ZTogUmVnaXN0ZXJbb3AyXSB9XTtcbiAgICAgICAgICAgIGNhc2UgNjEgLyogUmVnaXN0ZXJDb21wb25lbnREZXN0cnVjdG9yICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1JlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvcicsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNjIgLyogUHVzaENvbXBvbmVudE9wZXJhdGlvbnMgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaENvbXBvbmVudE9wZXJhdGlvbnMnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDYzIC8qIEdldENvbXBvbmVudFNlbGYgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnR2V0Q29tcG9uZW50U2VsZicsIHsgc3RhdGU6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICBjYXNlIDY0IC8qIEdldENvbXBvbmVudExheW91dCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydHZXRDb21wb25lbnRMYXlvdXQnLCB7IHN0YXRlOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSA2NSAvKiBCZWdpbkNvbXBvbmVudFRyYW5zYWN0aW9uICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0JlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24nLCB7fV07XG4gICAgICAgICAgICBjYXNlIDY2IC8qIENvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uJywge31dO1xuICAgICAgICAgICAgY2FzZSA2NyAvKiBEaWRDcmVhdGVFbGVtZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0RpZENyZWF0ZUVsZW1lbnQnLCB7IHN0YXRlOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSA2OCAvKiBEaWRSZW5kZXJMYXlvdXQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRGlkUmVuZGVyTGF5b3V0Jywge31dO1xuICAgICAgICAgICAgLy8vIFBBUlRJQUxTXG4gICAgICAgICAgICBjYXNlIDY5IC8qIEdldFBhcnRpYWxUZW1wbGF0ZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDb21waWxlUGFydGlhbCcsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNzAgLyogUmVzb2x2ZU1heWJlTG9jYWwgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUmVzb2x2ZU1heWJlTG9jYWwnLCB7IG5hbWU6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICAvLy8gREVCVUdHRVJcbiAgICAgICAgICAgIGNhc2UgNzEgLyogRGVidWdnZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRGVidWdnZXInLCB7IHN5bWJvbHM6IGMuZ2V0T3RoZXIob3AxKSwgZXZhbEluZm86IGMuZ2V0QXJyYXkob3AyKSB9XTtcbiAgICAgICAgICAgIC8vLyBTVEFURU1FTlRTXG4gICAgICAgICAgICBjYXNlIDcyIC8qIFNpemUgKi86XG4gICAgICAgICAgICAgICAgdGhyb3cgdW5yZWFjaGFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyB1bnJlYWNoYWJsZSgpO1xuICAgIH1cbiAgICByZXR1cm4gWycnLCB7fV07XG59XG5leHBvcnQgY2xhc3MgQXBwZW5kT3Bjb2RlcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVPcGNvZGUgPSBmaWxsTnVsbHMoNzIgLyogU2l6ZSAqLykuc2xpY2UoKTtcbiAgICB9XG4gICAgYWRkKG5hbWUsIGV2YWx1YXRlKSB7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVPcGNvZGVbbmFtZV0gPSBldmFsdWF0ZTtcbiAgICB9XG4gICAgZXZhbHVhdGUodm0sIG9wY29kZSwgdHlwZSkge1xuICAgICAgICBsZXQgZnVuYyA9IHRoaXMuZXZhbHVhdGVPcGNvZGVbdHlwZV07XG4gICAgICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlICovXG4gICAgICAgICAgICBsZXQgW25hbWUsIHBhcmFtc10gPSBkZWJ1Zyh2bS5jb25zdGFudHMsIG9wY29kZS50eXBlLCBvcGNvZGUub3AxLCBvcGNvZGUub3AyLCBvcGNvZGUub3AzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3R5cGVQb3Modm1bJ3BjJ10pfS4gJHtsb2dPcGNvZGUobmFtZSwgcGFyYW1zKX1gKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKC4uLmRlYnVnKHZtLmNvbnN0YW50cywgdHlwZSwgb3Bjb2RlLm9wMSwgb3Bjb2RlLm9wMiwgb3Bjb2RlLm9wMykpO1xuICAgICAgICAgICAgLyogdHNsaW50OmVuYWJsZSAqL1xuICAgICAgICB9XG4gICAgICAgIGZ1bmModm0sIG9wY29kZSk7XG4gICAgICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlICovXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJWMgLT4gcGM6ICVkLCByYTogJWQsIGZwOiAlZCwgc3A6ICVkLCBzMDogJU8sIHMxOiAlTywgdDA6ICVPLCB0MTogJU8nLCAnY29sb3I6IG9yYW5nZScsIHZtWydwYyddLCB2bVsncmEnXSwgdm1bJ2ZwJ10sIHZtWydzcCddLCB2bVsnczAnXSwgdm1bJ3MxJ10sIHZtWyd0MCddLCB2bVsndDEnXSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJWMgLT4gZXZhbCBzdGFjaycsICdjb2xvcjogcmVkJywgdm0uc3RhY2sudG9BcnJheSgpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyAtPiBzY29wZScsICdjb2xvcjogZ3JlZW4nLCB2bS5zY29wZSgpWydzbG90cyddLm1hcChzID0+IHMgJiYgc1sndmFsdWUnXSA/IHNbJ3ZhbHVlJ10oKSA6IHMpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyAtPiBlbGVtZW50cycsICdjb2xvcjogYmx1ZScsIHZtLmVsZW1lbnRzKClbJ2VsZW1lbnRTdGFjayddLnRvQXJyYXkoKSk7XG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZW5hYmxlICovXG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY29uc3QgQVBQRU5EX09QQ09ERVMgPSBuZXcgQXBwZW5kT3Bjb2RlcygpO1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0T3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW5pdGlhbGl6ZUd1aWQodGhpcyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgZ3VpZDogdGhpcy5fZ3VpZCwgdHlwZTogdGhpcy50eXBlIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVwZGF0aW5nT3Bjb2RlIGV4dGVuZHMgQWJzdHJhY3RPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0KG9wY29kZXMpIHtcbiAgICBsZXQgYnVmZmVyID0gW107XG4gICAgb3Bjb2Rlcy5mb3JFYWNoKChvcGNvZGUsIGkpID0+IHtcbiAgICAgICAgX2luc3BlY3Qob3Bjb2RlLnRvSlNPTigpLCBidWZmZXIsIDAsIGkpO1xuICAgIH0pO1xuICAgIHJldHVybiBidWZmZXIuam9pbignJyk7XG59XG5mdW5jdGlvbiBfaW5zcGVjdChvcGNvZGUsIGJ1ZmZlciwgbGV2ZWwsIGluZGV4KSB7XG4gICAgbGV0IGluZGVudGF0aW9uID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7XG4gICAgICAgIGluZGVudGF0aW9uLnB1c2goJyAgJyk7XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKC4uLmluZGVudGF0aW9uKTtcbiAgICBidWZmZXIucHVzaChgJHtpbmRleH0uICR7b3Bjb2RlLnR5cGV9YCk7XG4gICAgaWYgKG9wY29kZS5hcmdzIHx8IG9wY29kZS5kZXRhaWxzKSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKCcoJyk7XG4gICAgICAgIGlmIChvcGNvZGUuYXJncykge1xuICAgICAgICAgICAgYnVmZmVyLnB1c2gob3Bjb2RlLmFyZ3Muam9pbignLCAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wY29kZS5kZXRhaWxzKSB7XG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG9wY29kZS5kZXRhaWxzKTtcbiAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChvcGNvZGUuYXJncyAmJiBvcGNvZGUuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goJywgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGtleXMubWFwKGtleSA9PiBgJHtrZXl9PSR7b3Bjb2RlLmRldGFpbHMgJiYgb3Bjb2RlLmRldGFpbHNba2V5XX1gKS5qb2luKCcsICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBidWZmZXIucHVzaCgnKScpO1xuICAgIH1cbiAgICBidWZmZXIucHVzaCgnXFxuJyk7XG4gICAgaWYgKG9wY29kZS5jaGlsZHJlbiAmJiBvcGNvZGUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3Bjb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBfaW5zcGVjdChvcGNvZGUuY2hpbGRyZW5baV0sIGJ1ZmZlciwgbGV2ZWwgKyAxLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbn0iXX0=