/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __export = (target, all) => { __markAsModule(target); for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __reExport = (target, module2, desc) => { if (module2 && typeof module2 === "object" || typeof module2 === "function") { for (let key of __getOwnPropNames(module2)) if (!__hasOwnProp.call(target, key) && key !== "default") __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); } return target; }; var __toModule = (module2) => { return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); }; var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // main.ts __export(exports, { default: () => ObsidianCamera }); var import_obsidian = __toModule(require("obsidian")); var ObsidianCamera = class extends import_obsidian.Plugin { onload() { return __async(this, null, function* () { this.addRibbonIcon("camera", "Obsidian Camera", (evt) => { new CameraModal(this.app).open(); }); this.addCommand({ id: "Open camera modal", name: "Open camera modal / File Picker", callback: () => { new CameraModal(this.app).open(); } }); }); } }; var CameraModal = class extends import_obsidian.Modal { constructor(app2) { super(app2); } onOpen() { return __async(this, null, function* () { const { contentEl } = this; const webCamContainer = contentEl.createDiv(); const videoEl = webCamContainer.createEl("video"); videoEl.autoplay = true; videoEl.muted = true; const recordVideoButton = webCamContainer.createEl("button", { text: "Start recording" }); const switchCameraButton = webCamContainer.createEl("button", { text: "Switch Camera" }); const snapPhotoButton = webCamContainer.createEl("button", { text: "Take a snap" }); const filePicker = webCamContainer.createEl("input", { placeholder: "Choose image file from system", type: "file" }); filePicker.accept = "image/*,video/*"; filePicker.capture = "camera"; const filePicker2 = webCamContainer.createEl("input", { placeholder: "Choose image file from system", type: "file" }); filePicker2.accept = "image/*"; filePicker2.capture = "camera"; const chosenFolderPath = "attachments/snaps"; const chunks = []; let recorder = null; let videoStream = null; const cameras = (yield navigator.mediaDevices.enumerateDevices()).filter((d) => d.kind === "videoinput"); if (cameras.length <= 1) switchCameraButton.style.display = "none"; let cameraIndex = 0; const getVideoStream = () => __async(this, null, function* () { try { return yield navigator.mediaDevices.getUserMedia({ video: { deviceId: cameras[cameraIndex].deviceId }, audio: true }); } catch (error) { console.log(error); return null; } }); videoStream = yield getVideoStream(); if (!videoStream) { videoEl.style.display = "none"; snapPhotoButton.style.display = "none"; recordVideoButton.style.display = "none"; switchCameraButton.style.display = "none"; filePicker2.style.display = "block"; } const handleImageSelectChange = (file) => __async(this, null, function* () { const chosenFile = file; const bufferFile = yield chosenFile.arrayBuffer(); saveFile(bufferFile, false, chosenFile.name.split(" ").join("-")); }); filePicker.onchange = () => handleImageSelectChange(filePicker.files[0]); filePicker2.onchange = () => handleImageSelectChange(filePicker2.files[0]); const view = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView); const saveFile = (file, isImage = false, fileName = "") => __async(this, null, function* () { if (!fileName) { const dateString = (new Date() + "").slice(4, 28).split(" ").join("_").split(":").join("-"); fileName = isImage ? `image_${dateString}.png` : `video_${dateString}.webm`; } if (!isImage) new import_obsidian.Notice("Adding video to vault..."); const filePath = chosenFolderPath + "/" + fileName; const folderExists = app.vault.getAbstractFileByPath(chosenFolderPath); if (!folderExists) yield app.vault.createFolder(chosenFolderPath); const fileExists = app.vault.getAbstractFileByPath(filePath); if (!fileExists) yield app.vault.createBinary(filePath, file); if (!view) return new import_obsidian.Notice(`Saved to ${filePath}`); const cursor = view.editor.getCursor(); view.editor.replaceRange(isImage ? `![${fileName}](${filePath}) ` : ` ![[${filePath}]] `, cursor); videoStream && videoStream.getTracks().forEach((track) => { track.stop(); }); this.close(); }); switchCameraButton.onclick = () => __async(this, null, function* () { cameraIndex = (cameraIndex + 1) % cameras.length; videoStream = yield getVideoStream(); }); snapPhotoButton.onclick = () => { const canvas = webCamContainer.createEl("canvas"); canvas.style.display = "none"; const { videoHeight, videoWidth } = videoEl; canvas.height = videoHeight; canvas.width = videoWidth; canvas.getContext("2d").drawImage(videoEl, 0, 0, videoWidth, videoHeight); canvas.toBlob((blob) => __async(this, null, function* () { const bufferFile = yield blob.arrayBuffer(); saveFile(bufferFile, true); }), "image/png"); }; videoEl.srcObject = videoStream; recordVideoButton.onclick = () => __async(this, null, function* () { switchCameraButton.disabled = true; let isRecording = recorder && recorder.state === "recording"; if (isRecording) recorder.stop(); isRecording = !isRecording; recordVideoButton.innerText = isRecording ? "Stop Recording" : "Start Recording"; if (!recorder) { recorder = new MediaRecorder(videoStream, { mimeType: "video/webm" }); } recorder.ondataavailable = (e) => chunks.push(e.data); recorder.onstop = (e) => __async(this, null, function* () { const blob = new Blob(chunks, { type: "audio/ogg; codecs=opus" }); const bufferFile = yield blob.arrayBuffer(); saveFile(bufferFile, false); }); recorder.start(); }); }); } onClose() { const { contentEl } = this; contentEl.empty(); } }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQXBwLCBNYXJrZG93blZpZXcsIE1vZGFsLCBOb3RpY2UsIFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPYnNpZGlhbkNhbWVyYSBleHRlbmRzIFBsdWdpbiB7XG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHR0aGlzLmFkZFJpYmJvbkljb24oXCJjYW1lcmFcIiwgXCJPYnNpZGlhbiBDYW1lcmFcIiwgKGV2dDogTW91c2VFdmVudCkgPT4ge1xuXHRcdFx0bmV3IENhbWVyYU1vZGFsKHRoaXMuYXBwKS5vcGVuKCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwiT3BlbiBjYW1lcmEgbW9kYWxcIixcblx0XHRcdG5hbWU6IFwiT3BlbiBjYW1lcmEgbW9kYWwgLyBGaWxlIFBpY2tlclwiLFxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHtcblx0XHRcdFx0bmV3IENhbWVyYU1vZGFsKHRoaXMuYXBwKS5vcGVuKCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG59XG5cbmNsYXNzIENhbWVyYU1vZGFsIGV4dGVuZHMgTW9kYWwge1xuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCkge1xuXHRcdHN1cGVyKGFwcCk7XG5cdH1cblxuXHRhc3luYyBvbk9wZW4oKSB7XG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cdFx0Y29uc3Qgd2ViQ2FtQ29udGFpbmVyID0gY29udGVudEVsLmNyZWF0ZURpdigpO1xuXHRcdC8vIGNvbnN0IHBUZXh0ID0gd2ViQ2FtQ29udGFpbmVyLmNyZWF0ZUVsKCdwJywgeyB0ZXh0OiAnZ2V0VmlkZW9TdHJlYW0gbm90IHlldCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuJyB9KTtcblx0XHQvLyBwVGV4dC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG5cdFx0Y29uc3QgdmlkZW9FbCA9IHdlYkNhbUNvbnRhaW5lci5jcmVhdGVFbChcInZpZGVvXCIpO1xuXHRcdHZpZGVvRWwuYXV0b3BsYXkgPSB0cnVlO1xuXHRcdHZpZGVvRWwubXV0ZWQgPSB0cnVlXG5cdFx0Y29uc3QgcmVjb3JkVmlkZW9CdXR0b24gPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuXHRcdFx0dGV4dDogXCJTdGFydCByZWNvcmRpbmdcIixcblx0XHR9KTtcblx0XHRjb25zdCBzd2l0Y2hDYW1lcmFCdXR0b24gPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuXHRcdFx0dGV4dDogXCJTd2l0Y2ggQ2FtZXJhXCIsXG5cdFx0fSk7XG5cdFx0Y29uc3Qgc25hcFBob3RvQnV0dG9uID0gd2ViQ2FtQ29udGFpbmVyLmNyZWF0ZUVsKFwiYnV0dG9uXCIsIHtcblx0XHRcdHRleHQ6IFwiVGFrZSBhIHNuYXBcIixcblx0XHR9KTtcblxuXHRcdGNvbnN0IGZpbGVQaWNrZXIgPSB3ZWJDYW1Db250YWluZXIuY3JlYXRlRWwoXCJpbnB1dFwiLCB7XG5cdFx0XHRwbGFjZWhvbGRlcjogXCJDaG9vc2UgaW1hZ2UgZmlsZSBmcm9tIHN5c3RlbVwiLFxuXHRcdFx0dHlwZTogXCJmaWxlXCIsXG5cdFx0fSk7XG5cdFx0ZmlsZVBpY2tlci5hY2NlcHQgPSBcImltYWdlLyosdmlkZW8vKlwiO1xuXHRcdGZpbGVQaWNrZXIuY2FwdHVyZSA9IFwiY2FtZXJhXCI7IC8vIGJhY2sgY2FtZXJhIGJ5IGRlZmF1bHQgZm9yIG1vYmlsZSBzY3JlZW5zXG5cblx0XHRjb25zdCBmaWxlUGlja2VyMiA9IHdlYkNhbUNvbnRhaW5lci5jcmVhdGVFbChcImlucHV0XCIsIHtcblx0XHRcdHBsYWNlaG9sZGVyOiBcIkNob29zZSBpbWFnZSBmaWxlIGZyb20gc3lzdGVtXCIsXG5cdFx0XHR0eXBlOiBcImZpbGVcIixcblx0XHR9KTtcblx0XHRmaWxlUGlja2VyMi5hY2NlcHQgPSBcImltYWdlLypcIjtcblx0XHRmaWxlUGlja2VyMi5jYXB0dXJlID0gXCJjYW1lcmFcIjsgLy8gYmFjayBjYW1lcmEgYnkgZGVmYXVsdCBmb3IgbW9iaWxlIHNjcmVlbnNcblx0XHQvLyBmaWxlUGlja2VyMi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG5cblxuXHRcdGNvbnN0IGNob3NlbkZvbGRlclBhdGggPSBcImF0dGFjaG1lbnRzL3NuYXBzXCI7XG5cdFx0Y29uc3QgY2h1bmtzOiBCbG9iUGFydFtdID0gW107XG5cdFx0bGV0IHJlY29yZGVyOiBNZWRpYVJlY29yZGVyID0gbnVsbDtcblx0XHRsZXQgdmlkZW9TdHJlYW06IE1lZGlhU3RyZWFtID0gbnVsbDtcblxuXHRcdGNvbnN0IGNhbWVyYXMgPSAoXG5cdFx0XHRhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKVxuXHRcdCkuZmlsdGVyKChkKSA9PiBkLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiKTtcblxuXHRcdGlmIChjYW1lcmFzLmxlbmd0aCA8PSAxKSBzd2l0Y2hDYW1lcmFCdXR0b24uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdGxldCBjYW1lcmFJbmRleCA9IDA7XG5cblx0XHRjb25zdCBnZXRWaWRlb1N0cmVhbSA9IGFzeW5jICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJldHVybiBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG5cdFx0XHRcdFx0dmlkZW86IHsgZGV2aWNlSWQ6IGNhbWVyYXNbY2FtZXJhSW5kZXhdLmRldmljZUlkIH0sXG5cdFx0XHRcdFx0YXVkaW86IHRydWUsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc29sZS5sb2coZXJyb3IpO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmlkZW9TdHJlYW0gPSBhd2FpdCBnZXRWaWRlb1N0cmVhbSgpO1xuXHRcdGlmICghdmlkZW9TdHJlYW0pIHtcblx0XHRcdHZpZGVvRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuXHRcdFx0Ly8gcFRleHQuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcblx0XHRcdHNuYXBQaG90b0J1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG5cdFx0XHRyZWNvcmRWaWRlb0J1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG5cdFx0XHRzd2l0Y2hDYW1lcmFCdXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuXHRcdFx0ZmlsZVBpY2tlcjIuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcblx0XHR9XG5cblx0XHRjb25zdCBoYW5kbGVJbWFnZVNlbGVjdENoYW5nZSA9IGFzeW5jIChmaWxlOiBGaWxlKSA9PiB7XG5cdFx0XHRjb25zdCBjaG9zZW5GaWxlID0gZmlsZTtcblx0XHRcdGNvbnN0IGJ1ZmZlckZpbGUgPSBhd2FpdCBjaG9zZW5GaWxlLmFycmF5QnVmZmVyKCk7XG5cdFx0XHRzYXZlRmlsZShidWZmZXJGaWxlLCBmYWxzZSwgY2hvc2VuRmlsZS5uYW1lLnNwbGl0KCcgJykuam9pbignLScpKTtcblx0XHR9O1xuXHRcdGZpbGVQaWNrZXIub25jaGFuZ2UgPSAoKSA9PiBoYW5kbGVJbWFnZVNlbGVjdENoYW5nZShmaWxlUGlja2VyLmZpbGVzWzBdKVxuXHRcdGZpbGVQaWNrZXIyLm9uY2hhbmdlID0gKCkgPT4gaGFuZGxlSW1hZ2VTZWxlY3RDaGFuZ2UoZmlsZVBpY2tlcjIuZmlsZXNbMF0pXG5cblxuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuXG5cdFx0Y29uc3Qgc2F2ZUZpbGUgPSBhc3luYyAoZmlsZTogQXJyYXlCdWZmZXIsIGlzSW1hZ2UgPSBmYWxzZSwgZmlsZU5hbWUgPSAnJykgPT4ge1xuXHRcdFx0aWYgKCFmaWxlTmFtZSkge1xuXHRcdFx0XHRjb25zdCBkYXRlU3RyaW5nID0gKG5ldyBEYXRlKCkgKyBcIlwiKVxuXHRcdFx0XHRcdC5zbGljZSg0LCAyOClcblx0XHRcdFx0XHQuc3BsaXQoXCIgXCIpXG5cdFx0XHRcdFx0LmpvaW4oXCJfXCIpXG5cdFx0XHRcdFx0LnNwbGl0KFwiOlwiKVxuXHRcdFx0XHRcdC5qb2luKFwiLVwiKTtcblx0XHRcdFx0ZmlsZU5hbWUgPSBpc0ltYWdlXG5cdFx0XHRcdFx0PyBgaW1hZ2VfJHtkYXRlU3RyaW5nfS5wbmdgXG5cdFx0XHRcdFx0OiBgdmlkZW9fJHtkYXRlU3RyaW5nfS53ZWJtYDtcblx0XHRcdH1cblx0XHRcdGlmICghaXNJbWFnZSkgbmV3IE5vdGljZShcIkFkZGluZyB2aWRlbyB0byB2YXVsdC4uLlwiKVxuXG5cdFx0XHRjb25zdCBmaWxlUGF0aCA9IGNob3NlbkZvbGRlclBhdGggKyBcIi9cIiArIGZpbGVOYW1lO1xuXHRcdFx0Y29uc3QgZm9sZGVyRXhpc3RzID1cblx0XHRcdFx0YXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChjaG9zZW5Gb2xkZXJQYXRoKTtcblx0XHRcdGlmICghZm9sZGVyRXhpc3RzKSBhd2FpdCBhcHAudmF1bHQuY3JlYXRlRm9sZGVyKGNob3NlbkZvbGRlclBhdGgpO1xuXHRcdFx0Y29uc3QgZmlsZUV4aXN0cyA9XG5cdFx0XHRcdGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZmlsZVBhdGgpO1xuXHRcdFx0aWYgKCFmaWxlRXhpc3RzKVxuXHRcdFx0XHRhd2FpdCBhcHAudmF1bHQuY3JlYXRlQmluYXJ5KGZpbGVQYXRoLCBmaWxlKTtcblxuXHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gbmV3IE5vdGljZShgU2F2ZWQgdG8gJHtmaWxlUGF0aH1gKTtcblxuXHRcdFx0Y29uc3QgY3Vyc29yID0gdmlldy5lZGl0b3IuZ2V0Q3Vyc29yKCk7XG5cdFx0XHR2aWV3LmVkaXRvci5yZXBsYWNlUmFuZ2UoXG5cdFx0XHRcdGlzSW1hZ2Vcblx0XHRcdFx0XHQ/IGAhWyR7ZmlsZU5hbWV9XSgke2ZpbGVQYXRofSlcXG5gXG5cdFx0XHRcdFx0OiBgXFxuIVtbJHtmaWxlUGF0aH1dXVxcbmAsXG5cdFx0XHRcdGN1cnNvclxuXHRcdFx0KTtcblx0XHRcdHZpZGVvU3RyZWFtICYmIHZpZGVvU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB7XG5cdFx0XHRcdHRyYWNrLnN0b3AoKTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5jbG9zZSgpOyAvLyBjbG9zaW5nIHRoZSBtb2RhbFxuXHRcdH07XG5cblxuXHRcdHN3aXRjaENhbWVyYUJ1dHRvbi5vbmNsaWNrID0gYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y2FtZXJhSW5kZXggPSAoY2FtZXJhSW5kZXggKyAxKSAlIGNhbWVyYXMubGVuZ3RoO1xuXHRcdFx0dmlkZW9TdHJlYW0gPSBhd2FpdCBnZXRWaWRlb1N0cmVhbSgpO1xuXHRcdH07XG5cblx0XHRzbmFwUGhvdG9CdXR0b24ub25jbGljayA9ICgpID0+IHtcblx0XHRcdGNvbnN0IGNhbnZhcyA9IHdlYkNhbUNvbnRhaW5lci5jcmVhdGVFbChcImNhbnZhc1wiKTtcblx0XHRcdGNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0XHRjb25zdCB7IHZpZGVvSGVpZ2h0LCB2aWRlb1dpZHRoIH0gPSB2aWRlb0VsXG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gdmlkZW9IZWlnaHQ7XG5cdFx0XHRjYW52YXMud2lkdGggPSB2aWRlb1dpZHRoO1xuXG5cdFx0XHRjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLmRyYXdJbWFnZSh2aWRlb0VsLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7XG5cdFx0XHRjYW52YXMudG9CbG9iKGFzeW5jIChibG9iKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGJ1ZmZlckZpbGUgPSBhd2FpdCBibG9iLmFycmF5QnVmZmVyKCk7XG5cdFx0XHRcdHNhdmVGaWxlKGJ1ZmZlckZpbGUsIHRydWUpO1xuXHRcdFx0fSwgXCJpbWFnZS9wbmdcIik7XG5cdFx0fTtcblxuXHRcdHZpZGVvRWwuc3JjT2JqZWN0ID0gdmlkZW9TdHJlYW07XG5cblx0XHRyZWNvcmRWaWRlb0J1dHRvbi5vbmNsaWNrID0gYXN5bmMgKCkgPT4ge1xuXHRcdFx0c3dpdGNoQ2FtZXJhQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdGxldCBpc1JlY29yZGluZzogYm9vbGVhbiA9XG5cdFx0XHRcdHJlY29yZGVyICYmIHJlY29yZGVyLnN0YXRlID09PSBcInJlY29yZGluZ1wiO1xuXHRcdFx0aWYgKGlzUmVjb3JkaW5nKSByZWNvcmRlci5zdG9wKCk7XG5cdFx0XHRpc1JlY29yZGluZyA9ICFpc1JlY29yZGluZztcblx0XHRcdHJlY29yZFZpZGVvQnV0dG9uLmlubmVyVGV4dCA9IGlzUmVjb3JkaW5nXG5cdFx0XHRcdD8gXCJTdG9wIFJlY29yZGluZ1wiXG5cdFx0XHRcdDogXCJTdGFydCBSZWNvcmRpbmdcIjtcblxuXHRcdFx0aWYgKCFyZWNvcmRlcikge1xuXHRcdFx0XHRyZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKHZpZGVvU3RyZWFtLCB7XG5cdFx0XHRcdFx0bWltZVR5cGU6IFwidmlkZW8vd2VibVwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0cmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGUpID0+IGNodW5rcy5wdXNoKGUuZGF0YSk7XG5cdFx0XHRyZWNvcmRlci5vbnN0b3AgPSBhc3luYyAoZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBibG9iID0gbmV3IEJsb2IoY2h1bmtzLCB7XG5cdFx0XHRcdFx0dHlwZTogXCJhdWRpby9vZ2c7IGNvZGVjcz1vcHVzXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCBidWZmZXJGaWxlID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuXHRcdFx0XHRzYXZlRmlsZShidWZmZXJGaWxlLCBmYWxzZSk7XG5cdFx0XHR9O1xuXHRcdFx0cmVjb3JkZXIuc3RhcnQoKTtcblx0XHR9O1xuXG5cblx0fVxuXG5cdG9uQ2xvc2UoKSB7XG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cdFx0Y29udGVudEVsLmVtcHR5KCk7XG5cdH1cbn1cblxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFBeUQ7QUFFekQsbUNBQTRDLHVCQUFPO0FBQUEsRUFDNUMsU0FBUztBQUFBO0FBQ2QsV0FBSyxjQUFjLFVBQVUsbUJBQW1CLENBQUMsUUFBb0I7QUFDcEUsWUFBSSxZQUFZLEtBQUssS0FBSztBQUFBO0FBRzNCLFdBQUssV0FBVztBQUFBLFFBQ2YsSUFBSTtBQUFBLFFBQ0osTUFBTTtBQUFBLFFBQ04sVUFBVSxNQUFNO0FBQ2YsY0FBSSxZQUFZLEtBQUssS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNOUIsZ0NBQTBCLHNCQUFNO0FBQUEsRUFDL0IsWUFBWSxNQUFVO0FBQ3JCLFVBQU07QUFBQTtBQUFBLEVBR0QsU0FBUztBQUFBO0FBQ2QsWUFBTSxFQUFFLGNBQWM7QUFDdEIsWUFBTSxrQkFBa0IsVUFBVTtBQUdsQyxZQUFNLFVBQVUsZ0JBQWdCLFNBQVM7QUFDekMsY0FBUSxXQUFXO0FBQ25CLGNBQVEsUUFBUTtBQUNoQixZQUFNLG9CQUFvQixnQkFBZ0IsU0FBUyxVQUFVO0FBQUEsUUFDNUQsTUFBTTtBQUFBO0FBRVAsWUFBTSxxQkFBcUIsZ0JBQWdCLFNBQVMsVUFBVTtBQUFBLFFBQzdELE1BQU07QUFBQTtBQUVQLFlBQU0sa0JBQWtCLGdCQUFnQixTQUFTLFVBQVU7QUFBQSxRQUMxRCxNQUFNO0FBQUE7QUFHUCxZQUFNLGFBQWEsZ0JBQWdCLFNBQVMsU0FBUztBQUFBLFFBQ3BELGFBQWE7QUFBQSxRQUNiLE1BQU07QUFBQTtBQUVQLGlCQUFXLFNBQVM7QUFDcEIsaUJBQVcsVUFBVTtBQUVyQixZQUFNLGNBQWMsZ0JBQWdCLFNBQVMsU0FBUztBQUFBLFFBQ3JELGFBQWE7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