summaryrefslogtreecommitdiff
path: root/SI/.obsidian/plugins/obsidian-scroll-offset/main.js
blob: abd6d0f8255f6502f5576f9cc27fa813528f7cf3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/*
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());
  });
};

// src/main.ts
__export(exports, {
  default: () => ScrollOffset
});
var import_obsidian = __toModule(require("obsidian"));

// src/ScrollOffsetCM6.ts
var import_view = __toModule(require("@codemirror/view"));
var import_state = __toModule(require("@codemirror/state"));
var eventHandlers = {
  mousedown(event, view) {
    this.switch = false;
  },
  keydown(event, view) {
    this.switch = true;
  }
};
function generateScrollOffsetCM6Plugin(calcRequiredOffset) {
  return import_state.Prec.highest(import_view.ViewPlugin.fromClass(class {
    constructor(_view) {
      this.margin = 200;
      this.switch = true;
    }
    update(_update) {
      if (!_update.selectionSet)
        return;
      const view = _update.view;
      view.requestMeasure({
        read: () => {
          return {
            cursor: view.coordsAtPos(view.state.selection.main.head)
          };
        },
        write: ({ cursor }) => {
          if (!cursor)
            return;
          if (this.switch) {
            const cursorHeight = cursor.bottom - cursor.top + 5;
            const requiredOffset = calcRequiredOffset(view.dom, cursorHeight);
            this.margin = requiredOffset;
          } else {
            this.margin = 0;
          }
        }
      });
    }
  }, {
    eventHandlers,
    provide: (plugin) => import_view.EditorView.scrollMargins.of((view) => {
      const value = view.plugin(plugin);
      return {
        top: value.margin,
        bottom: value.margin
      };
    })
  }));
}
var ScrollOffsetCM6_default = generateScrollOffsetCM6Plugin;

// src/main.ts
var DEFAULT_SETTINGS = {
  percentageMode: true,
  offset: "25"
};
var ScrollOffset = class extends import_obsidian.Plugin {
  constructor() {
    super(...arguments);
    this.clickSwitch = true;
    this.mouseDownHandler = () => {
      this.clickSwitch = false;
    };
    this.cursorActiveHandler = (cm) => {
      if (!this.clickSwitch) {
        this.clickSwitch = true;
        return;
      }
      this.scrollLaunch(cm);
    };
    this.calcRequiredOffset = (container, cursorHeight) => {
      const { settings } = this;
      const maxOffset = (container.offsetHeight - cursorHeight) / 2;
      let requiredOffset = settings.percentageMode ? container.offsetHeight * +settings.offset / 100 : +settings.offset;
      requiredOffset = Math.min(requiredOffset, maxOffset);
      return requiredOffset;
    };
    this.scrollLaunch = (cm) => {
      const cursor = cm.charCoords(cm.getCursor());
      const cursorHeight = cursor.bottom - cursor.top + 5;
      const container = cm.getWrapperElement();
      const requiredOffset = this.calcRequiredOffset(container, cursorHeight);
      cm.scrollIntoView(null, requiredOffset);
    };
    this.enableScrollOffset = () => {
      this.registerCodeMirror((cm) => {
        cm.on("mousedown", this.mouseDownHandler);
        cm.on("cursorActivity", this.cursorActiveHandler);
      });
      this.registerEditorExtension(ScrollOffsetCM6_default(this.calcRequiredOffset));
    };
    this.disableScrollOffset = () => {
      this.app.workspace.iterateCodeMirrors((cm) => {
        cm.off("mousedown", this.mouseDownHandler);
        cm.off("cursorActivity", this.cursorActiveHandler);
      });
    };
  }
  onload() {
    return __async(this, null, function* () {
      console.log("Loading Scroll Offset.");
      yield this.loadSettings();
      this.addSettingTab(new ScrollOffsetSettingTab(this.app, this));
      this.enableScrollOffset();
    });
  }
  onunload() {
    this.disableScrollOffset();
    console.log("Scroll Offset unloaded.");
  }
  loadSettings() {
    return __async(this, null, function* () {
      this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
    });
  }
  saveSettings() {
    return __async(this, null, function* () {
      yield this.saveData(this.settings);
    });
  }
};
var ScrollOffsetSettingTab = class extends import_obsidian.PluginSettingTab {
  constructor(app, plugin) {
    super(app, plugin);
    this.plugin = plugin;
  }
  display() {
    const { containerEl } = this;
    containerEl.empty();
    containerEl.createEl("h2", { text: "Scroll Offset Settings." });
    new import_obsidian.Setting(containerEl).setName("Use percentage offset").setDesc("Use percentage offset, or use fixed number of distance instead").addToggle((comp) => comp.setValue(this.plugin.settings.percentageMode).onChange((value) => {
      this.plugin.settings.percentageMode = value;
      this.plugin.saveSettings();
    }));
    new import_obsidian.Setting(containerEl).setName("Distance").setDesc('unit in "px", or "%" if using percentage offset, 0 to disable this plugin').addText((text) => text.setValue(this.plugin.settings.offset).onChange((value) => {
      this.plugin.settings.offset = value;
      this.plugin.saveSettings();
    }));
  }
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL1Njcm9sbE9mZnNldENNNi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQXBwLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCBnZW5lcmF0ZVNjcm9sbE9mZnNldENNNlBsdWdpbiBmcm9tICcuL1Njcm9sbE9mZnNldENNNic7XHJcblxyXG5pbnRlcmZhY2UgU2Nyb2xsT2Zmc2V0U2V0dGluZ3Mge1xyXG5cdHBlcmNlbnRhZ2VNb2RlOiBib29sZWFuO1xyXG5cdG9mZnNldDogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBTY3JvbGxPZmZzZXRTZXR0aW5ncyA9IHtcclxuXHRwZXJjZW50YWdlTW9kZTogdHJ1ZSxcclxuXHRvZmZzZXQ6ICcyNScsXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjcm9sbE9mZnNldCBleHRlbmRzIFBsdWdpbiB7XHJcblx0cHJpdmF0ZSBjbGlja1N3aXRjaCA9IHRydWU7XHJcblx0c2V0dGluZ3M6IFNjcm9sbE9mZnNldFNldHRpbmdzO1xyXG5cclxuXHQvLyBwcmV2ZW50IGNsaWNrIHNjcm9sbFxyXG5cdG1vdXNlRG93bkhhbmRsZXIgPSAoKSA9PiB7XHJcblx0XHR0aGlzLmNsaWNrU3dpdGNoID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHQvLyBDTTUgc2Nyb2xsIGhhbmRsZXJcclxuXHRjdXJzb3JBY3RpdmVIYW5kbGVyID0gKGNtOiBDb2RlTWlycm9yLkVkaXRvcikgPT4ge1xyXG5cdFx0aWYgKCF0aGlzLmNsaWNrU3dpdGNoKSB7XHJcblx0XHRcdHRoaXMuY2xpY2tTd2l0Y2ggPSB0cnVlO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zY3JvbGxMYXVuY2goY20pO1xyXG5cdH1cclxuXHJcblx0Y2FsY1JlcXVpcmVkT2Zmc2V0ID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGN1cnNvckhlaWdodDogbnVtYmVyKSA9PiB7XHJcblx0XHRjb25zdCB7c2V0dGluZ3N9ID0gdGhpcztcclxuXHRcdGNvbnN0IG1heE9mZnNldCA9IChjb250YWluZXIub2Zmc2V0SGVpZ2h0IC0gY3Vyc29ySGVpZ2h0KSAvIDI7XHJcblxyXG5cdFx0bGV0IHJlcXVpcmVkT2Zmc2V0OiBudW1iZXIgPSBzZXR0aW5ncy5wZXJjZW50YWdlTW9kZVxyXG5cdFx0XHQ/IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQgKiArc2V0dGluZ3Mub2Zmc2V0IC8gMTAwXHJcblx0XHRcdDogK3NldHRpbmdzLm9mZnNldDtcclxuXHRcclxuXHRcdHJlcXVpcmVkT2Zmc2V0ID0gTWF0aC5taW4ocmVxdWlyZWRPZmZzZXQsIG1heE9mZnNldCk7XHJcblxyXG5cdFx0cmV0dXJuIHJlcXVpcmVkT2Zmc2V0XHJcblx0fVxyXG5cclxuXHRzY3JvbGxMYXVuY2ggPSAoY206IENvZGVNaXJyb3IuRWRpdG9yKSA9PiB7XHJcblx0XHRjb25zdCBjdXJzb3IgPSBjbS5jaGFyQ29vcmRzKGNtLmdldEN1cnNvcigpKTtcclxuXHRcdGNvbnN0IGN1cnNvckhlaWdodCA9IGN1cnNvci5ib3R0b20gLSBjdXJzb3IudG9wICsgNTtcclxuXHRcdGNvbnN0IGNvbnRhaW5lciA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCk7XHJcblx0XHRjb25zdCByZXF1aXJlZE9mZnNldCA9IHRoaXMuY2FsY1JlcXVpcmVkT2Zmc2V0KGNvbnRhaW5lciwgY3Vyc29ySGVpZ2h0KTtcclxuXHJcblx0XHQvLyBGaXJzdCBhcmd1bWVudCBgbnVsbGAgbWVhbnMgdGhlIGN1cnNvclxyXG5cdFx0Y20uc2Nyb2xsSW50b1ZpZXcobnVsbCwgcmVxdWlyZWRPZmZzZXQpXHJcblx0fVxyXG5cclxuXHRlbmFibGVTY3JvbGxPZmZzZXQgPSAoKSA9PiB7XHJcblx0XHQvLyB0aGlzIHdvcmtzIHdpdGggQ001XHJcblx0XHR0aGlzLnJlZ2lzdGVyQ29kZU1pcnJvcihjbSA9PiB7XHJcblx0XHRcdGNtLm9uKCdtb3VzZWRvd24nLCB0aGlzLm1vdXNlRG93bkhhbmRsZXIpXHJcblx0XHRcdGNtLm9uKCdjdXJzb3JBY3Rpdml0eScsIHRoaXMuY3Vyc29yQWN0aXZlSGFuZGxlcik7XHJcblx0XHR9KVxyXG5cclxuXHRcdC8vIHRoaXMgd29ya3Mgd2l0aCBDTTZcclxuXHRcdHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24oZ2VuZXJhdGVTY3JvbGxPZmZzZXRDTTZQbHVnaW4odGhpcy5jYWxjUmVxdWlyZWRPZmZzZXQpKTtcclxuXHR9XHJcblxyXG5cdGRpc2FibGVTY3JvbGxPZmZzZXQgPSAoKSA9PiB7XHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2UuaXRlcmF0ZUNvZGVNaXJyb3JzKGNtID0+IHtcclxuXHRcdFx0Y20ub2ZmKCdtb3VzZWRvd24nLCB0aGlzLm1vdXNlRG93bkhhbmRsZXIpXHJcblx0XHRcdGNtLm9mZignY3Vyc29yQWN0aXZpdHknLCB0aGlzLmN1cnNvckFjdGl2ZUhhbmRsZXIpO1xyXG5cdFx0fSlcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdMb2FkaW5nIFNjcm9sbCBPZmZzZXQuJylcclxuXHJcblx0XHQvLyBUaGlzIGxvYWQgY3VycmVudCBzZXR0aW5ncy5cclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cclxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2Nyb2xsT2Zmc2V0U2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdHRoaXMuZW5hYmxlU2Nyb2xsT2Zmc2V0KCk7XHJcblx0fVxyXG5cclxuXHRvbnVubG9hZCgpIHtcclxuXHRcdHRoaXMuZGlzYWJsZVNjcm9sbE9mZnNldCgpO1xyXG5cdFxyXG5cdFx0Y29uc29sZS5sb2coJ1Njcm9sbCBPZmZzZXQgdW5sb2FkZWQuJylcclxuXHR9XHJcblxyXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcclxuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuXHJcbi8vIFNldHRpbmdzIHRhYlxyXG5jbGFzcyBTY3JvbGxPZmZzZXRTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblx0cGx1Z2luOiBTY3JvbGxPZmZzZXQ7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFNjcm9sbE9mZnNldCkge1xyXG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHRkaXNwbGF5KCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7dGV4dDogJ1Njcm9sbCBPZmZzZXQgU2V0dGluZ3MuJ30pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVXNlIHBlcmNlbnRhZ2Ugb2Zmc2V0JylcclxuXHRcdFx0LnNldERlc2MoJ1VzZSBwZXJjZW50YWdlIG9mZnNldCwgb3IgdXNlIGZpeGVkIG51bWJlciBvZiBkaXN0YW5jZSBpbnN0ZWFkJylcclxuXHRcdFx0LmFkZFRvZ2dsZShjb21wID0+IGNvbXBcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucGVyY2VudGFnZU1vZGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucGVyY2VudGFnZU1vZGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdEaXN0YW5jZScpXHJcblx0XHRcdC5zZXREZXNjKCd1bml0IGluIFwicHhcIiwgb3IgXCIlXCIgaWYgdXNpbmcgcGVyY2VudGFnZSBvZmZzZXQsIDAgdG8gZGlzYWJsZSB0aGlzIHBsdWdpbicpXHJcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5vZmZzZXQpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Mub2Zmc2V0ID0gdmFsdWU7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0fVxyXG59XHJcbiIsICJpbXBvcnQge1ZpZXdQbHVnaW4sIFZpZXdVcGRhdGUsIEVkaXRvclZpZXd9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHsgUHJlYyB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJ1xuXG5jb25zdCBldmVudEhhbmRsZXJzID0ge1xuICBtb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHZpZXc6IEVkaXRvclZpZXcpIHtcbiAgICB0aGlzLnN3aXRjaCA9IGZhbHNlO1xuICB9LFxuICBrZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCB2aWV3OiBFZGl0b3JWaWV3KSB7XG4gICAgdGhpcy5zd2l0Y2ggPSB0cnVlO1xuICB9LFxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVNjcm9sbE9mZnNldENNNlBsdWdpbihjYWxjUmVxdWlyZWRPZmZzZXQ6IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBjdXJzb3JIZWlnaHQ6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gIHJldHVybiBQcmVjLmhpZ2hlc3QoVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIG1hcmdpbiA9IDIwMDtcbiAgICBzd2l0Y2ggPSB0cnVlO1xuICBcbiAgICBjb25zdHJ1Y3RvcihfdmlldzogRWRpdG9yVmlldykge31cbiAgXG4gICAgdXBkYXRlKF91cGRhdGU6IFZpZXdVcGRhdGUpIHtcbiAgICAgIGlmICghX3VwZGF0ZS5zZWxlY3Rpb25TZXQpIHJldHVybiA7XG5cbiAgICAgIGNvbnN0IHZpZXcgPSBfdXBkYXRlLnZpZXc7XG5cbiAgICAgIHZpZXcucmVxdWVzdE1lYXN1cmUoe1xuICAgICAgICByZWFkOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnNvcjogdmlldy5jb29yZHNBdFBvcyh2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmhlYWQpLFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd3JpdGU6ICh7Y3Vyc29yfSkgPT4ge1xuICAgICAgICAgIGlmICghY3Vyc29yKSByZXR1cm4gO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc3dpdGNoKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENhbid0IHVzZSBgbGluZUhlaWdodGAgYmVjYXVzZSBvZiBtdWx0aXBsZSBsaW5lIHBhcmFncmFwaFxuICAgICAgICAgICAgICogQnV0IGN1cnNvckhlaWdodCBpcyBsZXNzIHRoZW4gbGluZUhlaWdodCBhYm91dCA1cHhcbiAgICAgICAgICAgICAqIFNvIGFkZCB0aGlzIDVweDtcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgY3Vyc29ySGVpZ2h0ID0gY3Vyc29yLmJvdHRvbSAtIGN1cnNvci50b3AgKyA1XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZE9mZnNldCA9IGNhbGNSZXF1aXJlZE9mZnNldCh2aWV3LmRvbSwgY3Vyc29ySGVpZ2h0KVxuXG4gICAgICAgICAgICB0aGlzLm1hcmdpbiA9IHJlcXVpcmVkT2Zmc2V0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hcmdpbiA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0sIFxuICB7XG4gICAgZXZlbnRIYW5kbGVycyxcbiAgICBwcm92aWRlOiBwbHVnaW4gPT4gRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zLm9mKHZpZXcgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b3A6IHZhbHVlLm1hcmdpbixcbiAgICAgICAgYm90dG9tOiB2YWx1ZS5tYXJnaW5cbiAgICAgIH1cbiAgICB9KVxuICB9KSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2VuZXJhdGVTY3JvbGxPZmZzZXRDTTZQbHVnaW4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUF1RDs7O0FDQXZELGtCQUFpRDtBQUNqRCxtQkFBcUI7QUFFckIsSUFBTSxnQkFBZ0I7QUFBQSxFQUNwQixVQUFVLE9BQW1CLE1BQWtCO0FBQzdDLFNBQUssU0FBUztBQUFBO0FBQUEsRUFFaEIsUUFBUSxPQUFzQixNQUFrQjtBQUM5QyxTQUFLLFNBQVM7QUFBQTtBQUFBO0FBSWxCLHVDQUF1QyxvQkFBOEU7QUFDbkgsU0FBTyxrQkFBSyxRQUFRLHVCQUFXLFVBQVUsTUFBTTtBQUFBLElBSTdDLFlBQVksT0FBbUI7QUFIL0Isb0JBQVM7QUFDVCxvQkFBUztBQUFBO0FBQUEs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