470 lines
42 KiB
JavaScript
470 lines
42 KiB
JavaScript
/*
|
||
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
|
||
if you want to view the source visit the plugins github repository
|
||
*/
|
||
|
||
'use strict';
|
||
|
||
var obsidian = require('obsidian');
|
||
var child_process = require('child_process');
|
||
var util = require('util');
|
||
|
||
/******************************************************************************
|
||
Copyright (c) Microsoft Corporation.
|
||
|
||
Permission to use, copy, modify, and/or distribute this software for any
|
||
purpose with or without fee is hereby granted.
|
||
|
||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||
PERFORMANCE OF THIS SOFTWARE.
|
||
***************************************************************************** */
|
||
|
||
function __awaiter(thisArg, _arguments, P, generator) {
|
||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||
return new (P || (P = Promise))(function (resolve, reject) {
|
||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||
});
|
||
}
|
||
|
||
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
||
var e = new Error(message);
|
||
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
||
};
|
||
|
||
const DEFAULT_SETTINGS = {
|
||
fcitxRemotePath_macOS: '/usr/local/bin/fcitx-remote',
|
||
fcitxRemotePath_windows: 'C:\\Program Files\\bin\\fcitx-remote',
|
||
fcitxRemotePath_linux: '/usr/bin/fcitx-remote',
|
||
englishInputMethod: 'com.apple.keylayout.ABC',
|
||
chineseInputMethod: 'auto-detect', // 将自动检测当前中文输入法
|
||
};
|
||
const pexec = util.promisify(child_process.exec);
|
||
var IMStatus;
|
||
(function (IMStatus) {
|
||
IMStatus[IMStatus["None"] = 0] = "None";
|
||
IMStatus[IMStatus["Activate"] = 1] = "Activate";
|
||
IMStatus[IMStatus["Deactivate"] = 2] = "Deactivate";
|
||
})(IMStatus || (IMStatus = {}));
|
||
class VimIMSwitchPlugin extends obsidian.Plugin {
|
||
constructor() {
|
||
super(...arguments);
|
||
this.imStatus = IMStatus.None;
|
||
this.fcitxRemotePath = "";
|
||
this.editorMode = null;
|
||
this.initialized = false;
|
||
this.cmEditor = null;
|
||
this.lastInsertModeIMStatus = IMStatus.None; // 记住上一次insert模式的输入法状态
|
||
this.keyboardListenerSetup = false; // 防止重复设置键盘监听器
|
||
this.lastKeyTime = 0; // 防抖:记录上次按键时间
|
||
this.currentVimMode = 'normal'; // 跟踪当前vim模式
|
||
this.onVimModeChange = (cm) => __awaiter(this, void 0, void 0, function* () {
|
||
// 防止短时间内重复处理相同的模式切换
|
||
const currentTime = Date.now();
|
||
if (cm.mode === this.currentVimMode && currentTime - this.lastKeyTime < 100) {
|
||
return;
|
||
}
|
||
// 更新当前vim模式状态
|
||
this.currentVimMode = cm.mode;
|
||
if (cm.mode == "normal" || cm.mode == "visual") {
|
||
// 进入normal/visual模式前,先保存当前输入法状态
|
||
yield this.getFcitxRemoteStatus();
|
||
if (this.imStatus == IMStatus.Activate) {
|
||
this.lastInsertModeIMStatus = IMStatus.Activate;
|
||
}
|
||
console.log("🔤 [VimIMSwitch] → English");
|
||
yield this.deactivateIM();
|
||
}
|
||
else if (cm.mode == "insert" || cm.mode == "replace") {
|
||
// 进入insert模式时,恢复上次的输入法状态
|
||
if (this.lastInsertModeIMStatus == IMStatus.Activate) {
|
||
console.log("🈳 [VimIMSwitch] → Chinese");
|
||
yield this.activateIM();
|
||
}
|
||
else {
|
||
console.log("🔤 [VimIMSwitch] → English");
|
||
yield this.deactivateIM();
|
||
}
|
||
}
|
||
});
|
||
}
|
||
onload() {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
console.log('🚀 [VimIMSwitch] Loading plugin...');
|
||
yield this.loadSettings();
|
||
// 尽早设置全局键盘监听器
|
||
this.setupObsidianEditorEvents();
|
||
this.addSettingTab(new IMSwitchSettingTab(this.app, this));
|
||
this.addCommand({
|
||
id: 'test-im-switch-to-english',
|
||
name: 'Test: Switch to English',
|
||
callback: () => {
|
||
this.deactivateIM();
|
||
}
|
||
});
|
||
this.addCommand({
|
||
id: 'test-im-switch-to-chinese',
|
||
name: 'Test: Switch to Chinese',
|
||
callback: () => {
|
||
this.activateIM();
|
||
}
|
||
});
|
||
this.addCommand({
|
||
id: 'test-check-im-status',
|
||
name: 'Test: Check IM Status',
|
||
callback: () => {
|
||
this.getFcitxRemoteStatus();
|
||
}
|
||
});
|
||
this.app.workspace.on('file-open', (file) => __awaiter(this, void 0, void 0, function* () {
|
||
if (!this.initialized) {
|
||
yield this.initialize();
|
||
}
|
||
if (this.cmEditor) {
|
||
yield this.getFcitxRemoteStatus();
|
||
this.lastInsertModeIMStatus = this.imStatus;
|
||
yield this.deactivateIM();
|
||
if (typeof this.cmEditor.off === 'function') {
|
||
this.cmEditor.off("vim-mode-change", this.onVimModeChange);
|
||
}
|
||
if (typeof this.cmEditor.on === 'function') {
|
||
this.cmEditor.on("vim-mode-change", this.onVimModeChange);
|
||
}
|
||
}
|
||
}));
|
||
this.app.workspace.on('active-leaf-change', (leaf) => __awaiter(this, void 0, void 0, function* () {
|
||
if (this.app.workspace.activeLeaf.view.getViewType() == "markdown") {
|
||
if (!this.initialized) {
|
||
yield this.initialize();
|
||
}
|
||
if (this.cmEditor) {
|
||
yield this.getFcitxRemoteStatus();
|
||
this.lastInsertModeIMStatus = this.imStatus;
|
||
yield this.deactivateIM();
|
||
this.setupObsidianEditorEvents();
|
||
}
|
||
}
|
||
}));
|
||
});
|
||
}
|
||
initialize() {
|
||
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
if (this.initialized) {
|
||
return;
|
||
}
|
||
if ('editor:toggle-source' in this.app.commands.editorCommands) {
|
||
this.editorMode = 'cm6';
|
||
}
|
||
else {
|
||
this.editorMode = 'cm5';
|
||
}
|
||
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
||
if (view) {
|
||
if (this.editorMode == 'cm6') {
|
||
const possiblePaths = [
|
||
(_c = (_b = (_a = view.sourceMode) === null || _a === void 0 ? void 0 : _a.cmEditor) === null || _b === void 0 ? void 0 : _b.cm) === null || _c === void 0 ? void 0 : _c.cm,
|
||
(_e = (_d = view.sourceMode) === null || _d === void 0 ? void 0 : _d.cmEditor) === null || _e === void 0 ? void 0 : _e.cm,
|
||
(_f = view.sourceMode) === null || _f === void 0 ? void 0 : _f.cmEditor,
|
||
(_g = view.editor) === null || _g === void 0 ? void 0 : _g.cm,
|
||
(_h = view.editor) === null || _h === void 0 ? void 0 : _h.cm
|
||
];
|
||
for (let i = 0; i < possiblePaths.length; i++) {
|
||
const path = possiblePaths[i];
|
||
if (path && !this.cmEditor) {
|
||
this.cmEditor = path;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
const possiblePaths = [
|
||
(_j = view.sourceMode) === null || _j === void 0 ? void 0 : _j.cmEditor,
|
||
(_k = view.editor) === null || _k === void 0 ? void 0 : _k.cm,
|
||
(_l = view.editor) === null || _l === void 0 ? void 0 : _l.cm
|
||
];
|
||
for (let i = 0; i < possiblePaths.length; i++) {
|
||
const path = possiblePaths[i];
|
||
if (path && !this.cmEditor) {
|
||
this.cmEditor = path;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
setupVimModePolling() {
|
||
// 防止重复设置轮询
|
||
if (this.vimModePollingInterval) {
|
||
clearInterval(this.vimModePollingInterval);
|
||
}
|
||
let lastMode = "";
|
||
const pollInterval = setInterval(() => {
|
||
var _a, _b;
|
||
if (!this.cmEditor) {
|
||
return;
|
||
}
|
||
try {
|
||
const realCM = this.cmEditor.cm;
|
||
const currentMode = ((_b = (_a = realCM === null || realCM === void 0 ? void 0 : realCM.state) === null || _a === void 0 ? void 0 : _a.vim) === null || _b === void 0 ? void 0 : _b.mode) || "";
|
||
if (currentMode && currentMode !== lastMode) {
|
||
this.onVimModeChange({ mode: currentMode });
|
||
lastMode = currentMode;
|
||
}
|
||
}
|
||
catch (error) {
|
||
// 忽略轮询错误
|
||
}
|
||
}, 100);
|
||
this.vimModePollingInterval = pollInterval;
|
||
}
|
||
setupObsidianEditorEvents() {
|
||
if (this.keyboardListenerSetup) {
|
||
return;
|
||
}
|
||
const handleKeyDown = (event) => __awaiter(this, void 0, void 0, function* () {
|
||
const currentTime = Date.now();
|
||
// 防抖:100ms内只处理一次
|
||
if (currentTime - this.lastKeyTime < 100) {
|
||
return;
|
||
}
|
||
this.lastKeyTime = currentTime;
|
||
// 处理ESC键:只在insert/replace模式下才切换输入法
|
||
if (event.key === 'Escape') {
|
||
// 只有在insert或replace模式下按ESC才需要处理输入法
|
||
if (this.currentVimMode === 'insert' || this.currentVimMode === 'replace') {
|
||
// 退出insert模式前,先保存当前输入法状态
|
||
const beforeIM = yield this.runCmd(this.fcitxRemotePath, ["-n"]);
|
||
const currentIMName = beforeIM.trim();
|
||
// 检查当前输入法是中文还是英文
|
||
if (currentIMName === this.settings.chineseInputMethod) {
|
||
this.lastInsertModeIMStatus = IMStatus.Activate;
|
||
console.log('🔤 [VimIMSwitch] ESC → English (saved Chinese)');
|
||
}
|
||
else {
|
||
this.lastInsertModeIMStatus = IMStatus.Deactivate;
|
||
console.log('🔤 [VimIMSwitch] ESC → English (saved English)');
|
||
}
|
||
// 切换到英文输入法
|
||
this.currentVimMode = 'normal';
|
||
yield this.deactivateIM();
|
||
}
|
||
// 如果已经在normal模式,ESC键不做任何输入法切换
|
||
}
|
||
// 处理进入insert模式的按键(只在normal模式下)
|
||
else if (this.currentVimMode === 'normal' &&
|
||
['i', 'I', 'a', 'A', 'o', 'O', 's', 'S', 'c', 'C'].includes(event.key) &&
|
||
!event.ctrlKey && !event.metaKey && !event.altKey) {
|
||
// 延迟一下,让Vim先切换模式
|
||
setTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
||
this.currentVimMode = 'insert';
|
||
// 恢复上次的输入法状态
|
||
if (this.lastInsertModeIMStatus == IMStatus.Activate) {
|
||
console.log("🈳 [VimIMSwitch] → Chinese");
|
||
yield this.activateIM();
|
||
}
|
||
else {
|
||
console.log("🔤 [VimIMSwitch] → English");
|
||
yield this.deactivateIM();
|
||
}
|
||
}), 10);
|
||
}
|
||
});
|
||
// 移除旧的监听器
|
||
if (this.obsidianKeyDownListener) {
|
||
document.removeEventListener('keydown', this.obsidianKeyDownListener, { capture: true });
|
||
}
|
||
// 使用capture模式确保更早接收事件
|
||
this.obsidianKeyDownListener = handleKeyDown;
|
||
document.addEventListener('keydown', handleKeyDown, { capture: true });
|
||
this.keyboardListenerSetup = true;
|
||
}
|
||
runCmd(cmd, args = []) {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
const output = yield pexec(`${cmd} ${args.join(" ")}`);
|
||
return output.stdout;
|
||
});
|
||
}
|
||
getFcitxRemoteStatus() {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
if (this.fcitxRemotePath == "") {
|
||
console.log("❌ [VimIMSwitch] Cannot get fcitx-remote path, please set it correctly.");
|
||
return;
|
||
}
|
||
try {
|
||
let fcitxRemoteOutput = yield this.runCmd(this.fcitxRemotePath);
|
||
fcitxRemoteOutput = fcitxRemoteOutput.trimRight();
|
||
if (fcitxRemoteOutput == "1") {
|
||
this.imStatus = IMStatus.Deactivate;
|
||
}
|
||
else if (fcitxRemoteOutput == "2") {
|
||
this.imStatus = IMStatus.Activate;
|
||
}
|
||
else {
|
||
this.imStatus = IMStatus.None;
|
||
}
|
||
}
|
||
catch (error) {
|
||
console.log(`❌ [VimIMSwitch] Error getting IM status:`, error);
|
||
}
|
||
});
|
||
}
|
||
activateIM() {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
if (this.fcitxRemotePath == "") {
|
||
console.log("❌ [VimIMSwitch] Cannot get fcitx-remote path, please set it correctly.");
|
||
return;
|
||
}
|
||
try {
|
||
yield this.runCmd(this.fcitxRemotePath, ["-s", this.settings.chineseInputMethod]);
|
||
yield new Promise(resolve => setTimeout(resolve, 100));
|
||
}
|
||
catch (error) {
|
||
console.log("❌ [VimIMSwitch] Error activating IM:", error);
|
||
}
|
||
});
|
||
}
|
||
deactivateIM() {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
if (this.fcitxRemotePath == "") {
|
||
console.log("❌ [VimIMSwitch] Cannot get fcitx-remote path, please set it correctly.");
|
||
return;
|
||
}
|
||
try {
|
||
yield this.runCmd(this.fcitxRemotePath, ["-s", this.settings.englishInputMethod]);
|
||
yield new Promise(resolve => setTimeout(resolve, 100));
|
||
}
|
||
catch (error) {
|
||
console.log("❌ [VimIMSwitch] Error deactivating IM:", error);
|
||
}
|
||
});
|
||
}
|
||
onunload() {
|
||
// 清理 CodeMirror 事件监听器
|
||
if (this.cmEditor && typeof this.cmEditor.off === 'function') {
|
||
this.cmEditor.off("vim-mode-change", this.onVimModeChange);
|
||
}
|
||
// 清理轮询定时器
|
||
if (this.vimModePollingInterval) {
|
||
clearInterval(this.vimModePollingInterval);
|
||
}
|
||
// 清理键盘事件监听器
|
||
if (this.obsidianKeyDownListener) {
|
||
document.removeEventListener('keydown', this.obsidianKeyDownListener, { capture: true });
|
||
this.keyboardListenerSetup = false;
|
||
}
|
||
}
|
||
loadSettings() {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
|
||
yield this.updateCurrentPath();
|
||
yield this.detectInputMethods();
|
||
});
|
||
}
|
||
detectInputMethods() {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
if (this.settings.chineseInputMethod === 'auto-detect') {
|
||
try {
|
||
const currentIM = yield this.runCmd(this.fcitxRemotePath, ["-n"]);
|
||
const currentName = currentIM.trim();
|
||
if (currentName.includes('pinyin') ||
|
||
currentName.includes('chinese') ||
|
||
currentName.includes('tencent') ||
|
||
currentName.includes('sogou') ||
|
||
currentName.includes('baidu')) {
|
||
this.settings.chineseInputMethod = currentName;
|
||
}
|
||
else {
|
||
this.settings.chineseInputMethod = 'com.tencent.inputmethod.wetype.pinyin';
|
||
}
|
||
}
|
||
catch (error) {
|
||
this.settings.chineseInputMethod = 'com.tencent.inputmethod.wetype.pinyin';
|
||
}
|
||
}
|
||
});
|
||
}
|
||
updateCurrentPath() {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
console.log(`🖥️ [VimIMSwitch] Platform detected: ${process.platform}`);
|
||
switch (process.platform) {
|
||
case 'darwin':
|
||
this.fcitxRemotePath = this.settings.fcitxRemotePath_macOS;
|
||
console.log(`🍎 [VimIMSwitch] Using macOS path: ${this.fcitxRemotePath}`);
|
||
break;
|
||
case 'linux':
|
||
this.fcitxRemotePath = this.settings.fcitxRemotePath_linux;
|
||
console.log(`🐧 [VimIMSwitch] Using Linux path: ${this.fcitxRemotePath}`);
|
||
break;
|
||
case 'win32':
|
||
this.fcitxRemotePath = this.settings.fcitxRemotePath_windows;
|
||
console.log(`🪟 [VimIMSwitch] Using Windows path: ${this.fcitxRemotePath}`);
|
||
break;
|
||
default:
|
||
console.log(`❌ [VimIMSwitch] Platform ${process.platform} is not supported currently.`);
|
||
break;
|
||
}
|
||
});
|
||
}
|
||
saveSettings() {
|
||
return __awaiter(this, void 0, void 0, function* () {
|
||
yield this.saveData(this.settings);
|
||
});
|
||
}
|
||
}
|
||
class IMSwitchSettingTab extends obsidian.PluginSettingTab {
|
||
constructor(app, plugin) {
|
||
super(app, plugin);
|
||
this.plugin = plugin;
|
||
}
|
||
display() {
|
||
let { containerEl } = this;
|
||
containerEl.empty();
|
||
containerEl.createEl('h2', { text: 'Settings for Vim IM Switch plugin.' });
|
||
new obsidian.Setting(containerEl)
|
||
.setName('Fcitx Remote Path for macOS')
|
||
.setDesc('The absolute path to fcitx-remote bin file on macOS.')
|
||
.addText(text => text
|
||
.setPlaceholder(DEFAULT_SETTINGS.fcitxRemotePath_macOS)
|
||
.setValue(this.plugin.settings.fcitxRemotePath_macOS)
|
||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||
this.plugin.settings.fcitxRemotePath_macOS = value;
|
||
this.plugin.updateCurrentPath();
|
||
yield this.plugin.saveSettings();
|
||
})));
|
||
new obsidian.Setting(containerEl)
|
||
.setName('Fcitx Remote Path for Linux')
|
||
.setDesc('The absolute path to fcitx-remote bin file on Linux.')
|
||
.addText(text => text
|
||
.setPlaceholder(DEFAULT_SETTINGS.fcitxRemotePath_linux)
|
||
.setValue(this.plugin.settings.fcitxRemotePath_linux)
|
||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||
this.plugin.settings.fcitxRemotePath_linux = value;
|
||
this.plugin.updateCurrentPath();
|
||
yield this.plugin.saveSettings();
|
||
})));
|
||
new obsidian.Setting(containerEl)
|
||
.setName('Fcitx Remote Path for Windows')
|
||
.setDesc('The absolute path to fcitx-remote bin file on Windows.')
|
||
.addText(text => text
|
||
.setPlaceholder(DEFAULT_SETTINGS.fcitxRemotePath_windows)
|
||
.setValue(this.plugin.settings.fcitxRemotePath_windows)
|
||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
||
this.plugin.settings.fcitxRemotePath_windows = value;
|
||
this.plugin.updateCurrentPath();
|
||
yield this.plugin.saveSettings();
|
||
})));
|
||
}
|
||
}
|
||
|
||
module.exports = VimIMSwitchPlugin;
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbInByb21pc2lmeSIsImV4ZWMiLCJQbHVnaW4iLCJNYXJrZG93blZpZXciLCJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBb0dBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENB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
|