{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js!C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\quill\\modules\\syntax.js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\quill\\modules\\syntax.js","mtime":1787309795815},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\babel.config.js","mtime":1787567871334},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js","mtime":1787309793142}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:InVzZSBzdHJpY3QiOwoKdmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZSgiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZC5qcyIpLmRlZmF1bHQ7CnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZSgiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIikuZGVmYXVsdDsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLkNvZGVUb2tlbiA9IGV4cG9ydHMuQ29kZUJsb2NrID0gdm9pZCAwOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuZXJyb3IuY2F1c2UuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbi5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubWFwLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmlsdGVyLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmluZC5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZvci1lYWNoLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IubWFwLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IucmVkdWNlLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIik7CnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCJDOi9Vc2Vycy9BZG1pbi9EZXNrdG9wL2VkdWNhdGlvbi9mcm9udGVuZC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIpKTsKdmFyIF9zbGljZWRUb0FycmF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheS5qcyIpKTsKdmFyIF9jbGFzc0NhbGxDaGVjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoIkM6L1VzZXJzL0FkbWluL0Rlc2t0b3AvZWR1Y2F0aW9uL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIikpOwp2YXIgX2NyZWF0ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiKSk7CnZhciBfY2FsbFN1cGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2FsbFN1cGVyLmpzIikpOwp2YXIgX2luaGVyaXRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMuanMiKSk7CnZhciBfc3VwZXJQcm9wR2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc3VwZXJQcm9wR2V0LmpzIikpOwp2YXIgX3F1aWxsRGVsdGEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoInF1aWxsLWRlbHRhIikpOwp2YXIgX3BhcmNobWVudCA9IHJlcXVpcmUoInBhcmNobWVudCIpOwp2YXIgX2lubGluZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgiLi4vYmxvdHMvaW5saW5lLmpzIikpOwp2YXIgX3F1aWxsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCIuLi9jb3JlL3F1aWxsLmpzIikpOwp2YXIgX21vZHVsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgiLi4vY29yZS9tb2R1bGUuanMiKSk7CnZhciBfYmxvY2sgPSByZXF1aXJlKCIuLi9ibG90cy9ibG9jay5qcyIpOwp2YXIgX2JyZWFrID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCIuLi9ibG90cy9icmVhay5qcyIpKTsKdmFyIF9jdXJzb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoIi4uL2Jsb3RzL2N1cnNvci5qcyIpKTsKdmFyIF90ZXh0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZSgiLi4vYmxvdHMvdGV4dC5qcyIpKTsKdmFyIF9jb2RlID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZSgiLi4vZm9ybWF0cy9jb2RlLmpzIikpOwp2YXIgX2NsaXBib2FyZCA9IHJlcXVpcmUoIi4vY2xpcGJvYXJkLmpzIik7CnZhciBUb2tlbkF0dHJpYnV0b3IgPSBuZXcgX3BhcmNobWVudC5DbGFzc0F0dHJpYnV0b3IoJ2NvZGUtdG9rZW4nLCAnaGxqcycsIHsKICBzY29wZTogX3BhcmNobWVudC5TY29wZS5JTkxJTkUKfSk7CnZhciBDb2RlVG9rZW4gPSBleHBvcnRzLkNvZGVUb2tlbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0lubGluZSkgewogIGZ1bmN0aW9uIENvZGVUb2tlbihzY3JvbGwsIGRvbU5vZGUsIHZhbHVlKSB7CiAgICB2YXIgX3RoaXM7CiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrMi5kZWZhdWx0KSh0aGlzLCBDb2RlVG9rZW4pOwogICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgX3RoaXMgPSAoMCwgX2NhbGxTdXBlcjIuZGVmYXVsdCkodGhpcywgQ29kZVRva2VuLCBbc2Nyb2xsLCBkb21Ob2RlLCB2YWx1ZV0pOwogICAgVG9rZW5BdHRyaWJ1dG9yLmFkZChfdGhpcy5kb21Ob2RlLCB2YWx1ZSk7CiAgICByZXR1cm4gX3RoaXM7CiAgfQogICgwLCBfaW5oZXJpdHMyLmRlZmF1bHQpKENvZGVUb2tlbiwgX0lubGluZSk7CiAgcmV0dXJuICgwLCBfY3JlYXRlQ2xhc3MyLmRlZmF1bHQpKENvZGVUb2tlbiwgW3sKICAgIGtleTogImZvcm1hdCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0KF9mb3JtYXQsIHZhbHVlKSB7CiAgICAgIGlmIChfZm9ybWF0ICE9PSBDb2RlVG9rZW4uYmxvdE5hbWUpIHsKICAgICAgICAoMCwgX3N1cGVyUHJvcEdldDIuZGVmYXVsdCkoQ29kZVRva2VuLCAiZm9ybWF0IiwgdGhpcywgMykoW19mb3JtYXQsIHZhbHVlXSk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHsKICAgICAgICBUb2tlbkF0dHJpYnV0b3IuYWRkKHRoaXMuZG9tTm9kZSwgdmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIFRva2VuQXR0cmlidXRvci5yZW1vdmUodGhpcy5kb21Ob2RlKTsKICAgICAgICB0aGlzLmRvbU5vZGUuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnN0YXRpY3MuY2xhc3NOYW1lKTsKICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogIm9wdGltaXplIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBvcHRpbWl6ZSgpIHsKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICAoMCwgX3N1cGVyUHJvcEdldDIuZGVmYXVsdCkoQ29kZVRva2VuLCAib3B0aW1pemUiLCB0aGlzLCAzKShhcmd1bWVudHMpOwogICAgICBpZiAoIVRva2VuQXR0cmlidXRvci52YWx1ZSh0aGlzLmRvbU5vZGUpKSB7CiAgICAgICAgdGhpcy51bndyYXAoKTsKICAgICAgfQogICAgfQogIH1dLCBbewogICAga2V5OiAiZm9ybWF0cyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gZm9ybWF0cyhub2RlLCBzY3JvbGwpIHsKICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlICE9PSBzY3JvbGwuZG9tTm9kZSkgewogICAgICAgIGlmIChub2RlLmNsYXNzTGlzdCAmJiBub2RlLmNsYXNzTGlzdC5jb250YWlucyhfY29kZS5kZWZhdWx0LmNsYXNzTmFtZSkpIHsKICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgICAgIHJldHVybiAoMCwgX3N1cGVyUHJvcEdldDIuZGVmYXVsdCkoQ29kZVRva2VuLCAiZm9ybWF0cyIsIHRoaXMsIDIpKFtub2RlLCBzY3JvbGxdKTsKICAgICAgICB9CiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgIH0KICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICB9XSk7Cn0oX2lubGluZS5kZWZhdWx0KTsKQ29kZVRva2VuLmJsb3ROYW1lID0gJ2NvZGUtdG9rZW4nOwpDb2RlVG9rZW4uY2xhc3NOYW1lID0gJ3FsLXRva2VuJzsKdmFyIFN5bnRheENvZGVCbG9jayA9IGV4cG9ydHMuQ29kZUJsb2NrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29kZUJsb2NrKSB7CiAgZnVuY3Rpb24gU3ludGF4Q29kZUJsb2NrKCkgewogICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgU3ludGF4Q29kZUJsb2NrKTsKICAgIHJldHVybiAoMCwgX2NhbGxTdXBlcjIuZGVmYXVsdCkodGhpcywgU3ludGF4Q29kZUJsb2NrLCBhcmd1bWVudHMpOwogIH0KICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShTeW50YXhDb2RlQmxvY2ssIF9Db2RlQmxvY2spOwogIHJldHVybiAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShTeW50YXhDb2RlQmxvY2ssIFt7CiAgICBrZXk6ICJmb3JtYXQiLAogICAgdmFsdWU6CiAgICAvLyBTeW50YXggbW9kdWxlIHdpbGwgcmVnaXN0ZXIKCiAgICBmdW5jdGlvbiBmb3JtYXQobmFtZSwgdmFsdWUpIHsKICAgICAgaWYgKG5hbWUgPT09IHRoaXMuc3RhdGljcy5ibG90TmFtZSAmJiB2YWx1ZSkgewogICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgICB0aGlzLmRvbU5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLWxhbmd1YWdlJywgdmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgICgwLCBfc3VwZXJQcm9wR2V0Mi5kZWZhdWx0KShTeW50YXhDb2RlQmxvY2ssICJmb3JtYXQiLCB0aGlzLCAzKShbbmFtZSwgdmFsdWVdKTsKICAgICAgfQogICAgfQogIH0sIHsKICAgIGtleTogInJlcGxhY2VXaXRoIiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlV2l0aChuYW1lLCB2YWx1ZSkgewogICAgICB0aGlzLmZvcm1hdEF0KDAsIHRoaXMubGVuZ3RoKCksIENvZGVUb2tlbi5ibG90TmFtZSwgZmFsc2UpOwogICAgICByZXR1cm4gKDAsIF9zdXBlclByb3BHZXQyLmRlZmF1bHQpKFN5bnRheENvZGVCbG9jaywgInJlcGxhY2VXaXRoIiwgdGhpcywgMykoW25hbWUsIHZhbHVlXSk7CiAgICB9CiAgfV0sIFt7CiAgICBrZXk6ICJjcmVhdGUiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSkgewogICAgICB2YXIgZG9tTm9kZSA9ICgwLCBfc3VwZXJQcm9wR2V0Mi5kZWZhdWx0KShTeW50YXhDb2RlQmxvY2ssICJjcmVhdGUiLCB0aGlzLCAyKShbdmFsdWVdKTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBkb21Ob2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1sYW5ndWFnZScsIHZhbHVlKTsKICAgICAgfQogICAgICByZXR1cm4gZG9tTm9kZTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJmb3JtYXRzIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXRzKGRvbU5vZGUpIHsKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICByZXR1cm4gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGFuZ3VhZ2UnKSB8fCAncGxhaW4nOwogICAgfQogIH0sIHsKICAgIGtleTogInJlZ2lzdGVyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlcigpIHt9CiAgfV0pOwp9KF9jb2RlLmRlZmF1bHQpOwp2YXIgU3ludGF4Q29kZUJsb2NrQ29udGFpbmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29kZUJsb2NrQ29udGFpbmVyKSB7CiAgZnVuY3Rpb24gU3ludGF4Q29kZUJsb2NrQ29udGFpbmVyKCkgewogICAgKDAsIF9jbGFzc0NhbGxDaGVjazIuZGVmYXVsdCkodGhpcywgU3ludGF4Q29kZUJsb2NrQ29udGFpbmVyKTsKICAgIHJldHVybiAoMCwgX2NhbGxTdXBlcjIuZGVmYXVsdCkodGhpcywgU3ludGF4Q29kZUJsb2NrQ29udGFpbmVyLCBhcmd1bWVudHMpOwogIH0KICAoMCwgX2luaGVyaXRzMi5kZWZhdWx0KShTeW50YXhDb2RlQmxvY2tDb250YWluZXIsIF9Db2RlQmxvY2tDb250YWluZXIpOwogIHJldHVybiAoMCwgX2NyZWF0ZUNsYXNzMi5kZWZhdWx0KShTeW50YXhDb2RlQmxvY2tDb250YWluZXIsIFt7CiAgICBrZXk6ICJhdHRhY2giLAogICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaCgpIHsKICAgICAgKDAsIF9zdXBlclByb3BHZXQyLmRlZmF1bHQpKFN5bnRheENvZGVCbG9ja0NvbnRhaW5lciwgImF0dGFjaCIsIHRoaXMsIDMpKFtdKTsKICAgICAgdGhpcy5mb3JjZU5leHQgPSBmYWxzZTsKICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICB0aGlzLnNjcm9sbC5lbWl0TW91bnQodGhpcyk7CiAgICB9CiAgfSwgewogICAga2V5OiAiZm9ybWF0IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXQobmFtZSwgdmFsdWUpIHsKICAgICAgaWYgKG5hbWUgPT09IFN5bnRheENvZGVCbG9jay5ibG90TmFtZSkgewogICAgICAgIHRoaXMuZm9yY2VOZXh0ID0gdHJ1ZTsKICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgICAgICBjaGlsZC5mb3JtYXQobmFtZSwgdmFsdWUpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAiZm9ybWF0QXQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGZvcm1hdEF0KGluZGV4LCBsZW5ndGgsIG5hbWUsIHZhbHVlKSB7CiAgICAgIGlmIChuYW1lID09PSBTeW50YXhDb2RlQmxvY2suYmxvdE5hbWUpIHsKICAgICAgICB0aGlzLmZvcmNlTmV4dCA9IHRydWU7CiAgICAgIH0KICAgICAgKDAsIF9zdXBlclByb3BHZXQyLmRlZmF1bHQpKFN5bnRheENvZGVCbG9ja0NvbnRhaW5lciwgImZvcm1hdEF0IiwgdGhpcywgMykoW2luZGV4LCBsZW5ndGgsIG5hbWUsIHZhbHVlXSk7CiAgICB9CiAgfSwgewogICAga2V5OiAiaGlnaGxpZ2h0IiwKICAgIHZhbHVlOiBmdW5jdGlvbiBoaWdobGlnaHQoX2hpZ2hsaWdodCkgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKICAgICAgdmFyIGZvcmNlZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7CiAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmhlYWQgPT0gbnVsbCkgcmV0dXJuOwogICAgICB2YXIgbm9kZXMgPSBBcnJheS5mcm9tKHRoaXMuZG9tTm9kZS5jaGlsZE5vZGVzKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSAhPT0gX3RoaXMyLnVpTm9kZTsKICAgICAgfSk7CiAgICAgIHZhciB0ZXh0ID0gIiIuY29uY2F0KG5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkgewogICAgICAgIHJldHVybiBub2RlLnRleHRDb250ZW50OwogICAgICB9KS5qb2luKCdcbicpLCAiXG4iKTsKICAgICAgdmFyIGxhbmd1YWdlID0gU3ludGF4Q29kZUJsb2NrLmZvcm1hdHModGhpcy5jaGlsZHJlbi5oZWFkLmRvbU5vZGUpOwogICAgICBpZiAoZm9yY2VkIHx8IHRoaXMuZm9yY2VOZXh0IHx8IHRoaXMuY2FjaGVkVGV4dCAhPT0gdGV4dCkgewogICAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwIHx8IHRoaXMuY2FjaGVkVGV4dCA9PSBudWxsKSB7CiAgICAgICAgICB2YXIgb2xkRGVsdGEgPSB0aGlzLmNoaWxkcmVuLnJlZHVjZShmdW5jdGlvbiAoZGVsdGEsIGNoaWxkKSB7CiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgICAgICAgcmV0dXJuIGRlbHRhLmNvbmNhdCgoMCwgX2Jsb2NrLmJsb2NrRGVsdGEpKGNoaWxkLCBmYWxzZSkpOwogICAgICAgICAgfSwgbmV3IF9xdWlsbERlbHRhLmRlZmF1bHQoKSk7CiAgICAgICAgICB2YXIgZGVsdGEgPSBfaGlnaGxpZ2h0KHRleHQsIGxhbmd1YWdlKTsKICAgICAgICAgIG9sZERlbHRhLmRpZmYoZGVsdGEpLnJlZHVjZShmdW5jdGlvbiAoaW5kZXgsIF9yZWYpIHsKICAgICAgICAgICAgdmFyIHJldGFpbiA9IF9yZWYucmV0YWluLAogICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBfcmVmLmF0dHJpYnV0ZXM7CiAgICAgICAgICAgIC8vIFNob3VsZCBiZSBhbGwgcmV0YWlucwogICAgICAgICAgICBpZiAoIXJldGFpbikgcmV0dXJuIGluZGV4OwogICAgICAgICAgICBpZiAoYXR0cmlidXRlcykgewogICAgICAgICAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGZvcm1hdCkgewogICAgICAgICAgICAgICAgaWYgKFtTeW50YXhDb2RlQmxvY2suYmxvdE5hbWUsIENvZGVUb2tlbi5ibG90TmFtZV0uaW5jbHVkZXMoZm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgICAgICAgICAgICAgIF90aGlzMi5mb3JtYXRBdChpbmRleCwgcmV0YWluLCBmb3JtYXQsIGF0dHJpYnV0ZXNbZm9ybWF0XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICAgICAgICByZXR1cm4gaW5kZXggKyByZXRhaW47CiAgICAgICAgICB9LCAwKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5jYWNoZWRUZXh0ID0gdGV4dDsKICAgICAgICB0aGlzLmZvcmNlTmV4dCA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAiaHRtbCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gaHRtbChpbmRleCwgbGVuZ3RoKSB7CiAgICAgIHZhciBfdGhpcyRjaGlsZHJlbiRmaW5kID0gdGhpcy5jaGlsZHJlbi5maW5kKGluZGV4KSwKICAgICAgICBfdGhpcyRjaGlsZHJlbiRmaW5kMiA9ICgwLCBfc2xpY2VkVG9BcnJheTIuZGVmYXVsdCkoX3RoaXMkY2hpbGRyZW4kZmluZCwgMSksCiAgICAgICAgY29kZUJsb2NrID0gX3RoaXMkY2hpbGRyZW4kZmluZDJbMF07CiAgICAgIHZhciBsYW5ndWFnZSA9IGNvZGVCbG9jayA/IFN5bnRheENvZGVCbG9jay5mb3JtYXRzKGNvZGVCbG9jay5kb21Ob2RlKSA6ICdwbGFpbic7CiAgICAgIHJldHVybiAiPHByZSBkYXRhLWxhbmd1YWdlPVwiIi5jb25jYXQobGFuZ3VhZ2UsICJcIj5cbiIpLmNvbmNhdCgoMCwgX3RleHQuZXNjYXBlVGV4dCkodGhpcy5jb2RlKGluZGV4LCBsZW5ndGgpKSwgIlxuPC9wcmU+Iik7CiAgICB9CiAgfSwgewogICAga2V5OiAib3B0aW1pemUiLAogICAgdmFsdWU6IGZ1bmN0aW9uIG9wdGltaXplKGNvbnRleHQpIHsKICAgICAgKDAsIF9zdXBlclByb3BHZXQyLmRlZmF1bHQpKFN5bnRheENvZGVCbG9ja0NvbnRhaW5lciwgIm9wdGltaXplIiwgdGhpcywgMykoW2NvbnRleHRdKTsKICAgICAgaWYgKHRoaXMucGFyZW50ICE9IG51bGwgJiYgdGhpcy5jaGlsZHJlbi5oZWFkICE9IG51bGwgJiYgdGhpcy51aU5vZGUgIT0gbnVsbCkgewogICAgICAgIHZhciBsYW5ndWFnZSA9IFN5bnRheENvZGVCbG9jay5mb3JtYXRzKHRoaXMuY2hpbGRyZW4uaGVhZC5kb21Ob2RlKTsKICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgICAgaWYgKGxhbmd1YWdlICE9PSB0aGlzLnVpTm9kZS52YWx1ZSkgewogICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICAgICAgdGhpcy51aU5vZGUudmFsdWUgPSBsYW5ndWFnZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9XSk7Cn0oX2NvZGUuQ29kZUJsb2NrQ29udGFpbmVyKTsKU3ludGF4Q29kZUJsb2NrQ29udGFpbmVyLmFsbG93ZWRDaGlsZHJlbiA9IFtTeW50YXhDb2RlQmxvY2tdOwpTeW50YXhDb2RlQmxvY2sucmVxdWlyZWRDb250YWluZXIgPSBTeW50YXhDb2RlQmxvY2tDb250YWluZXI7ClN5bnRheENvZGVCbG9jay5hbGxvd2VkQ2hpbGRyZW4gPSBbQ29kZVRva2VuLCBfY3Vyc29yLmRlZmF1bHQsIF90ZXh0LmRlZmF1bHQsIF9icmVhay5kZWZhdWx0XTsKdmFyIGhpZ2hsaWdodCA9IGZ1bmN0aW9uIGhpZ2hsaWdodChsaWIsIGxhbmd1YWdlLCB0ZXh0KSB7CiAgaWYgKHR5cGVvZiBsaWIudmVyc2lvblN0cmluZyA9PT0gJ3N0cmluZycpIHsKICAgIHZhciBtYWpvclZlcnNpb24gPSBsaWIudmVyc2lvblN0cmluZy5zcGxpdCgnLicpWzBdOwogICAgaWYgKHBhcnNlSW50KG1ham9yVmVyc2lvbiwgMTApID49IDExKSB7CiAgICAgIHJldHVybiBsaWIuaGlnaGxpZ2h0KHRleHQsIHsKICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UKICAgICAgfSkudmFsdWU7CiAgICB9CiAgfQogIHJldHVybiBsaWIuaGlnaGxpZ2h0KGxhbmd1YWdlLCB0ZXh0KS52YWx1ZTsKfTsKdmFyIFN5bnRheCA9IGV4cG9ydHMuZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX01vZHVsZSkgewogIGZ1bmN0aW9uIFN5bnRheChxdWlsbCwgb3B0aW9ucykgewogICAgdmFyIF90aGlzMzsKICAgICgwLCBfY2xhc3NDYWxsQ2hlY2syLmRlZmF1bHQpKHRoaXMsIFN5bnRheCk7CiAgICBfdGhpczMgPSAoMCwgX2NhbGxTdXBlcjIuZGVmYXVsdCkodGhpcywgU3ludGF4LCBbcXVpbGwsIG9wdGlvbnNdKTsKICAgIGlmIChfdGhpczMub3B0aW9ucy5obGpzID09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW50YXggbW9kdWxlIHJlcXVpcmVzIGhpZ2hsaWdodC5qcy4gUGxlYXNlIGluY2x1ZGUgdGhlIGxpYnJhcnkgb24gdGhlIHBhZ2UgYmVmb3JlIFF1aWxsLicpOwogICAgfQogICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXggbWUgbGF0ZXIKICAgIF90aGlzMy5sYW5ndWFnZXMgPSBfdGhpczMub3B0aW9ucy5sYW5ndWFnZXMucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBfcmVmMikgewogICAgICB2YXIga2V5ID0gX3JlZjIua2V5OwogICAgICBtZW1vW2tleV0gPSB0cnVlOwogICAgICByZXR1cm4gbWVtbzsKICAgIH0sIHt9KTsKICAgIF90aGlzMy5oaWdobGlnaHRCbG90ID0gX3RoaXMzLmhpZ2hsaWdodEJsb3QuYmluZChfdGhpczMpOwogICAgX3RoaXMzLmluaXRMaXN0ZW5lcigpOwogICAgX3RoaXMzLmluaXRUaW1lcigpOwogICAgcmV0dXJuIF90aGlzMzsKICB9CiAgKDAsIF9pbmhlcml0czIuZGVmYXVsdCkoU3ludGF4LCBfTW9kdWxlKTsKICByZXR1cm4gKDAsIF9jcmVhdGVDbGFzczIuZGVmYXVsdCkoU3ludGF4LCBbewogICAga2V5OiAiaW5pdExpc3RlbmVyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0TGlzdGVuZXIoKSB7CiAgICAgIHZhciBfdGhpczQgPSB0aGlzOwogICAgICB0aGlzLnF1aWxsLm9uKF9xdWlsbC5kZWZhdWx0LmV2ZW50cy5TQ1JPTExfQkxPVF9NT1VOVCwgZnVuY3Rpb24gKGJsb3QpIHsKICAgICAgICBpZiAoIShibG90IGluc3RhbmNlb2YgU3ludGF4Q29kZUJsb2NrQ29udGFpbmVyKSkgcmV0dXJuOwogICAgICAgIHZhciBzZWxlY3QgPSBfdGhpczQucXVpbGwucm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpOwogICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgX3RoaXM0Lm9wdGlvbnMubGFuZ3VhZ2VzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7CiAgICAgICAgICB2YXIga2V5ID0gX3JlZjMua2V5LAogICAgICAgICAgICBsYWJlbCA9IF9yZWYzLmxhYmVsOwogICAgICAgICAgdmFyIG9wdGlvbiA9IHNlbGVjdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgb3B0aW9uLnRleHRDb250ZW50ID0gbGFiZWw7CiAgICAgICAgICBvcHRpb24uc2V0QXR0cmlidXRlKCd2YWx1ZScsIGtleSk7CiAgICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uKTsKICAgICAgICB9KTsKICAgICAgICBzZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgYmxvdC5mb3JtYXQoU3ludGF4Q29kZUJsb2NrLmJsb3ROYW1lLCBzZWxlY3QudmFsdWUpOwogICAgICAgICAgX3RoaXM0LnF1aWxsLnJvb3QuZm9jdXMoKTsgLy8gUHJldmVudCBzY3JvbGxpbmcKICAgICAgICAgIF90aGlzNC5oaWdobGlnaHQoYmxvdCwgdHJ1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGJsb3QudWlOb2RlID09IG51bGwpIHsKICAgICAgICAgIGJsb3QuYXR0YWNoVUkoc2VsZWN0KTsKICAgICAgICAgIGlmIChibG90LmNoaWxkcmVuLmhlYWQpIHsKICAgICAgICAgICAgc2VsZWN0LnZhbHVlID0gU3ludGF4Q29kZUJsb2NrLmZvcm1hdHMoYmxvdC5jaGlsZHJlbi5oZWFkLmRvbU5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfSwgewogICAga2V5OiAiaW5pdFRpbWVyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0VGltZXIoKSB7CiAgICAgIHZhciBfdGhpczUgPSB0aGlzOwogICAgICB2YXIgdGltZXIgPSBudWxsOwogICAgICB0aGlzLnF1aWxsLm9uKF9xdWlsbC5kZWZhdWx0LmV2ZW50cy5TQ1JPTExfT1BUSU1JWkUsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodGltZXIpIHsKICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgICAgfQogICAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBfdGhpczUuaGlnaGxpZ2h0KCk7CiAgICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgfSwgX3RoaXM1Lm9wdGlvbnMuaW50ZXJ2YWwpOwogICAgICB9KTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJoaWdobGlnaHQiLAogICAgdmFsdWU6IGZ1bmN0aW9uIGhpZ2hsaWdodCgpIHsKICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CiAgICAgIHZhciBibG90ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsOwogICAgICB2YXIgZm9yY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlOwogICAgICBpZiAodGhpcy5xdWlsbC5zZWxlY3Rpb24uY29tcG9zaW5nKSByZXR1cm47CiAgICAgIHRoaXMucXVpbGwudXBkYXRlKF9xdWlsbC5kZWZhdWx0LnNvdXJjZXMuVVNFUik7CiAgICAgIHZhciByYW5nZSA9IHRoaXMucXVpbGwuZ2V0U2VsZWN0aW9uKCk7CiAgICAgIHZhciBibG90cyA9IGJsb3QgPT0gbnVsbCA/IHRoaXMucXVpbGwuc2Nyb2xsLmRlc2NlbmRhbnRzKFN5bnRheENvZGVCbG9ja0NvbnRhaW5lcikgOiBbYmxvdF07CiAgICAgIGJsb3RzLmZvckVhY2goZnVuY3Rpb24gKGNvbnRhaW5lcikgewogICAgICAgIGNvbnRhaW5lci5oaWdobGlnaHQoX3RoaXM2LmhpZ2hsaWdodEJsb3QsIGZvcmNlKTsKICAgICAgfSk7CiAgICAgIHRoaXMucXVpbGwudXBkYXRlKF9xdWlsbC5kZWZhdWx0LnNvdXJjZXMuU0lMRU5UKTsKICAgICAgaWYgKHJhbmdlICE9IG51bGwpIHsKICAgICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbihyYW5nZSwgX3F1aWxsLmRlZmF1bHQuc291cmNlcy5TSUxFTlQpOwogICAgICB9CiAgICB9CiAgfSwgewogICAga2V5OiAiaGlnaGxpZ2h0QmxvdCIsCiAgICB2YWx1ZTogZnVuY3Rpb24gaGlnaGxpZ2h0QmxvdCh0ZXh0KSB7CiAgICAgIHZhciBsYW5ndWFnZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJ3BsYWluJzsKICAgICAgbGFuZ3VhZ2UgPSB0aGlzLmxhbmd1YWdlc1tsYW5ndWFnZV0gPyBsYW5ndWFnZSA6ICdwbGFpbic7CiAgICAgIGlmIChsYW5ndWFnZSA9PT0gJ3BsYWluJykgewogICAgICAgIHJldHVybiAoMCwgX3RleHQuZXNjYXBlVGV4dCkodGV4dCkuc3BsaXQoJ1xuJykucmVkdWNlKGZ1bmN0aW9uIChkZWx0YSwgbGluZSwgaSkgewogICAgICAgICAgaWYgKGkgIT09IDApIHsKICAgICAgICAgICAgZGVsdGEuaW5zZXJ0KCdcbicsICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBfY29kZS5kZWZhdWx0LmJsb3ROYW1lLCBsYW5ndWFnZSkpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGRlbHRhLmluc2VydChsaW5lKTsKICAgICAgICB9LCBuZXcgX3F1aWxsRGVsdGEuZGVmYXVsdCgpKTsKICAgICAgfQogICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5xdWlsbC5yb290Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKF9jb2RlLmRlZmF1bHQuY2xhc3NOYW1lKTsKICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGhpZ2hsaWdodCh0aGlzLm9wdGlvbnMuaGxqcywgbGFuZ3VhZ2UsIHRleHQpOwogICAgICByZXR1cm4gKDAsIF9jbGlwYm9hcmQudHJhdmVyc2UpKHRoaXMucXVpbGwuc2Nyb2xsLCBjb250YWluZXIsIFtmdW5jdGlvbiAobm9kZSwgZGVsdGEpIHsKICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgICAgdmFyIHZhbHVlID0gVG9rZW5BdHRyaWJ1dG9yLnZhbHVlKG5vZGUpOwogICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGRlbHRhLmNvbXBvc2UobmV3IF9xdWlsbERlbHRhLmRlZmF1bHQoKS5yZXRhaW4oZGVsdGEubGVuZ3RoKCksICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBDb2RlVG9rZW4uYmxvdE5hbWUsIHZhbHVlKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVsdGE7CiAgICAgIH1dLCBbZnVuY3Rpb24gKG5vZGUsIGRlbHRhKSB7CiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcgogICAgICAgIHJldHVybiBub2RlLmRhdGEuc3BsaXQoJ1xuJykucmVkdWNlKGZ1bmN0aW9uIChtZW1vLCBub2RlVGV4dCwgaSkgewogICAgICAgICAgaWYgKGkgIT09IDApIG1lbW8uaW5zZXJ0KCdcbicsICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHt9LCBfY29kZS5kZWZhdWx0LmJsb3ROYW1lLCBsYW5ndWFnZSkpOwogICAgICAgICAgcmV0dXJuIG1lbW8uaW5zZXJ0KG5vZGVUZXh0KTsKICAgICAgICB9LCBkZWx0YSk7CiAgICAgIH1dLCBuZXcgV2Vha01hcCgpKTsKICAgIH0KICB9XSwgW3sKICAgIGtleTogInJlZ2lzdGVyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlcigpIHsKICAgICAgX3F1aWxsLmRlZmF1bHQucmVnaXN0ZXIoQ29kZVRva2VuLCB0cnVlKTsKICAgICAgX3F1aWxsLmRlZmF1bHQucmVnaXN0ZXIoU3ludGF4Q29kZUJsb2NrLCB0cnVlKTsKICAgICAgX3F1aWxsLmRlZmF1bHQucmVnaXN0ZXIoU3ludGF4Q29kZUJsb2NrQ29udGFpbmVyLCB0cnVlKTsKICAgIH0KICB9XSk7Cn0oX21vZHVsZS5kZWZhdWx0KTsKU3ludGF4LkRFRkFVTFRTID0gewogIGhsanM6IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB3aW5kb3cuaGxqczsKICB9KCksCiAgaW50ZXJ2YWw6IDEwMDAsCiAgbGFuZ3VhZ2VzOiBbewogICAga2V5OiAncGxhaW4nLAogICAgbGFiZWw6ICdQbGFpbicKICB9LCB7CiAgICBrZXk6ICdiYXNoJywKICAgIGxhYmVsOiAnQmFzaCcKICB9LCB7CiAgICBrZXk6ICdjcHAnLAogICAgbGFiZWw6ICdDKysnCiAgfSwgewogICAga2V5OiAnY3MnLAogICAgbGFiZWw6ICdDIycKICB9LCB7CiAgICBrZXk6ICdjc3MnLAogICAgbGFiZWw6ICdDU1MnCiAgfSwgewogICAga2V5OiAnZGlmZicsCiAgICBsYWJlbDogJ0RpZmYnCiAgfSwgewogICAga2V5OiAneG1sJywKICAgIGxhYmVsOiAnSFRNTC9YTUwnCiAgfSwgewogICAga2V5OiAnamF2YScsCiAgICBsYWJlbDogJ0phdmEnCiAgfSwgewogICAga2V5OiAnamF2YXNjcmlwdCcsCiAgICBsYWJlbDogJ0phdmFTY3JpcHQnCiAgfSwgewogICAga2V5OiAnbWFya2Rvd24nLAogICAgbGFiZWw6ICdNYXJrZG93bicKICB9LCB7CiAgICBrZXk6ICdwaHAnLAogICAgbGFiZWw6ICdQSFAnCiAgfSwgewogICAga2V5OiAncHl0aG9uJywKICAgIGxhYmVsOiAnUHl0aG9uJwogIH0sIHsKICAgIGtleTogJ3J1YnknLAogICAgbGFiZWw6ICdSdWJ5JwogIH0sIHsKICAgIGtleTogJ3NxbCcsCiAgICBsYWJlbDogJ1NRTCcKICB9XQp9Ow=="},{"version":3,"names":["_quillDelta","_interopRequireDefault","require","_parchment","_inline","_quill","_module","_block","_break","_cursor","_text","_interopRequireWildcard","_code","_clipboard","TokenAttributor","ClassAttributor","scope","Scope","INLINE","CodeToken","exports","_Inline","constructor","scroll","domNode","value","_this","_classCallCheck2","default","_callSuper2","add","_inherits2","_createClass2","key","format","blotName","_superPropGet2","remove","classList","statics","className","optimize","arguments","unwrap","formats","node","contains","CodeBlock","parentNode","undefined","Inline","SyntaxCodeBlock","_CodeBlock","name","setAttribute","replaceWith","formatAt","length","create","getAttribute","register","SyntaxCodeBlockContainer","_CodeBlockContainer","attach","forceNext","emitMount","children","forEach","child","index","highlight","_this2","forced","head","nodes","Array","from","childNodes","filter","uiNode","text","concat","map","textContent","join","language","cachedText","trim","oldDelta","reduce","delta","blockDelta","Delta","diff","_ref","retain","attributes","Object","keys","includes","html","_this$children$find","find","_this$children$find2","_slicedToArray2","codeBlock","escapeText","code","context","parent","CodeBlockContainer","allowedChildren","requiredContainer","CursorBlot","TextBlot","BreakBlot","lib","versionString","majorVersion","split","parseInt","Syntax","_Module","quill","options","_this3","hljs","Error","languages","memo","_ref2","highlightBlot","bind","initListener","initTimer","_this4","on","Quill","events","SCROLL_BLOT_MOUNT","blot","select","root","ownerDocument","createElement","_ref3","label","option","appendChild","addEventListener","focus","attachUI","_this5","timer","SCROLL_OPTIMIZE","clearTimeout","setTimeout","interval","_this6","force","selection","composing","update","sources","USER","range","getSelection","blots","descendants","container","SILENT","setSelection","line","i","insert","_defineProperty2","innerHTML","traverse","compose","data","nodeText","WeakMap","Module","DEFAULTS","window"],"sources":["../../src/modules/syntax.ts"],"sourcesContent":["import Delta from 'quill-delta';\nimport { ClassAttributor, Scope } from 'parchment';\nimport type { Blot, ScrollBlot } from 'parchment';\nimport Inline from '../blots/inline.js';\nimport Quill from '../core/quill.js';\nimport Module from '../core/module.js';\nimport { blockDelta } from '../blots/block.js';\nimport BreakBlot from '../blots/break.js';\nimport CursorBlot from '../blots/cursor.js';\nimport TextBlot, { escapeText } from '../blots/text.js';\nimport CodeBlock, { CodeBlockContainer } from '../formats/code.js';\nimport { traverse } from './clipboard.js';\n\nconst TokenAttributor = new ClassAttributor('code-token', 'hljs', {\n scope: Scope.INLINE,\n});\nclass CodeToken extends Inline {\n static formats(node: Element, scroll: ScrollBlot) {\n while (node != null && node !== scroll.domNode) {\n if (node.classList && node.classList.contains(CodeBlock.className)) {\n // @ts-expect-error\n return super.formats(node, scroll);\n }\n // @ts-expect-error\n node = node.parentNode;\n }\n return undefined;\n }\n\n constructor(scroll: ScrollBlot, domNode: Node, value: unknown) {\n // @ts-expect-error\n super(scroll, domNode, value);\n TokenAttributor.add(this.domNode, value);\n }\n\n format(format: string, value: unknown) {\n if (format !== CodeToken.blotName) {\n super.format(format, value);\n } else if (value) {\n TokenAttributor.add(this.domNode, value);\n } else {\n TokenAttributor.remove(this.domNode);\n this.domNode.classList.remove(this.statics.className);\n }\n }\n\n optimize(...args: unknown[]) {\n // @ts-expect-error\n super.optimize(...args);\n if (!TokenAttributor.value(this.domNode)) {\n this.unwrap();\n }\n }\n}\nCodeToken.blotName = 'code-token';\nCodeToken.className = 'ql-token';\n\nclass SyntaxCodeBlock extends CodeBlock {\n static create(value: unknown) {\n const domNode = super.create(value);\n if (typeof value === 'string') {\n domNode.setAttribute('data-language', value);\n }\n return domNode;\n }\n\n static formats(domNode: Node) {\n // @ts-expect-error\n return domNode.getAttribute('data-language') || 'plain';\n }\n\n static register() {} // Syntax module will register\n\n format(name: string, value: unknown) {\n if (name === this.statics.blotName && value) {\n // @ts-expect-error\n this.domNode.setAttribute('data-language', value);\n } else {\n super.format(name, value);\n }\n }\n\n replaceWith(name: string | Blot, value?: any) {\n this.formatAt(0, this.length(), CodeToken.blotName, false);\n return super.replaceWith(name, value);\n }\n}\n\nclass SyntaxCodeBlockContainer extends CodeBlockContainer {\n forceNext?: boolean;\n cachedText?: string | null;\n\n attach() {\n super.attach();\n this.forceNext = false;\n // @ts-expect-error\n this.scroll.emitMount(this);\n }\n\n format(name: string, value: unknown) {\n if (name === SyntaxCodeBlock.blotName) {\n this.forceNext = true;\n this.children.forEach((child) => {\n // @ts-expect-error\n child.format(name, value);\n });\n }\n }\n\n formatAt(index: number, length: number, name: string, value: unknown) {\n if (name === SyntaxCodeBlock.blotName) {\n this.forceNext = true;\n }\n super.formatAt(index, length, name, value);\n }\n\n highlight(\n highlight: (text: string, language: string) => Delta,\n forced = false,\n ) {\n if (this.children.head == null) return;\n const nodes = Array.from(this.domNode.childNodes).filter(\n (node) => node !== this.uiNode,\n );\n const text = `${nodes.map((node) => node.textContent).join('\\n')}\\n`;\n const language = SyntaxCodeBlock.formats(this.children.head.domNode);\n if (forced || this.forceNext || this.cachedText !== text) {\n if (text.trim().length > 0 || this.cachedText == null) {\n const oldDelta = this.children.reduce((delta, child) => {\n // @ts-expect-error\n return delta.concat(blockDelta(child, false));\n }, new Delta());\n const delta = highlight(text, language);\n oldDelta.diff(delta).reduce((index, { retain, attributes }) => {\n // Should be all retains\n if (!retain) return index;\n if (attributes) {\n Object.keys(attributes).forEach((format) => {\n if (\n [SyntaxCodeBlock.blotName, CodeToken.blotName].includes(format)\n ) {\n // @ts-expect-error\n this.formatAt(index, retain, format, attributes[format]);\n }\n });\n }\n // @ts-expect-error\n return index + retain;\n }, 0);\n }\n this.cachedText = text;\n this.forceNext = false;\n }\n }\n\n html(index: number, length: number) {\n const [codeBlock] = this.children.find(index);\n const language = codeBlock\n ? SyntaxCodeBlock.formats(codeBlock.domNode)\n : 'plain';\n\n return `
\\n${escapeText(\n this.code(index, length),\n )}\\n`;\n }\n\n optimize(context: Record