├── .gitignore
├── .eslintrc.js
├── .DS_Store
├── icon.png
├── .vscode
└── settings.json
├── src
├── misc
│ ├── entitlements.mac.plist
│ └── notarize.js
├── style.css
├── renderer_utils
│ ├── darkMode.js
│ └── autoUpdate.js
├── preload.js
├── main_utils
│ └── menu.js
└── renderer.js
├── appveyor.yml
├── index.html
├── test
└── index.js
├── old_package_json_app_store_friendly
├── package.json
├── README.md
├── LICENSE.md
├── main.js
├── CHANGELOG.md
├── pA11990.gb
└── pA11990 copy.gb
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist/
3 | .env
4 | .DS_Store
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: "teselagen/node"
3 | }
--------------------------------------------------------------------------------
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeselaGen/ove-electron/HEAD/.DS_Store
--------------------------------------------------------------------------------
/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TeselaGen/ove-electron/HEAD/icon.png
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "files.exclude": {
3 | "**/.git": true,
4 | "**/.svn": true,
5 | "**/.hg": true,
6 | "**/CVS": true,
7 | "**/.DS_Store": true,
8 | "**/Thumbs.db": true,
9 | "**/build":false
10 | }
11 | }
--------------------------------------------------------------------------------
/src/misc/entitlements.mac.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.cs.allow-unsigned-executable-memory
6 |
7 | com.apple.security.cs.allow-jit
8 |
9 |
10 |
--------------------------------------------------------------------------------
/appveyor.yml:
--------------------------------------------------------------------------------
1 | image: Visual Studio 2019
2 | environment:
3 | GH_TOKEN:
4 | secure: kvUWbn2M0QD68917ZIXoOaIR0fPBkFP/VhABUpEIjs+/AHjQjj9L3+qmVeJYeQ9G
5 |
6 | platform:
7 | - x64
8 |
9 | cache:
10 | - node_modules
11 | - '%USERPROFILE%\.electron'
12 |
13 | init:
14 | - git config --global core.autocrlf input
15 |
16 | install:
17 | - ps: Install-Product node 14 x64
18 | - yarn
19 |
20 | build_script:
21 | - yarn deploy-win
22 |
23 | test: off
--------------------------------------------------------------------------------
/src/style.css:
--------------------------------------------------------------------------------
1 | #notification {
2 | position: fixed;
3 | bottom: 20px;
4 | left: 20px;
5 | width: 200px;
6 | z-index: 100000;
7 | padding: 20px;
8 | border-radius: 5px;
9 | background-color: white;
10 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
11 | }
12 | .hidden {
13 | display: none;
14 | }
15 | .darkModeBtn {
16 | z-index: 100000;
17 | position: absolute;
18 | top: 5px;
19 | right: 5px;
20 | }
21 | .bp3-toast-container {
22 | z-index: 100000000;
23 | }
--------------------------------------------------------------------------------
/src/renderer_utils/darkMode.js:
--------------------------------------------------------------------------------
1 | //run once per window initialization
2 | if (window.localStorage.getItem("isDarkMode") === "true") {
3 | document.body.classList.add("bp3-dark");
4 | }
5 |
6 | window.toggleDarkMode = () => {
7 | if (document.body.classList.contains("bp3-dark")) {
8 | window.localStorage.setItem("isDarkMode", "false");
9 | document.body.classList.remove("bp3-dark");
10 | } else {
11 | window.localStorage.setItem("isDarkMode", "true");
12 |
13 | document.body.classList.add("bp3-dark");
14 | }
15 | };
16 |
--------------------------------------------------------------------------------
/src/misc/notarize.js:
--------------------------------------------------------------------------------
1 | const { notarize } = require('electron-notarize');
2 |
3 | exports.default = async function notarizing(context) {
4 | const { electronPlatformName, appOutDir } = context;
5 | if (electronPlatformName !== 'darwin') {
6 | return;
7 | }
8 |
9 | const appName = context.packager.appInfo.productFilename;
10 |
11 | return await notarize({
12 | appBundleId: 'com.teselagen.openVectorEditor',
13 | appPath: `${appOutDir}/${appName}.app`,
14 | appleId: process.env.APPLEID,
15 | appleIdPassword: process.env.APPLEIDPASS,
16 | });
17 | };
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Open Vector Editor
6 |
7 |
8 |
9 |
14 |
15 |
16 |
17 |
18 |
21 |
24 |
25 |
26 |
32 |
36 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/test/index.js:
--------------------------------------------------------------------------------
1 | // tnr: running `yarn test` will run this file. It doesn't do much at the moment because we can't actually interact with the native dialogs..
2 |
3 | const Application = require("spectron").Application;
4 | const assert = require("assert");
5 | const electronPath = require("electron"); // Require Electron from the binaries included in node_modules.
6 | const path = require("path");
7 |
8 | describe("Application launch", function () {
9 | this.timeout(10000);
10 |
11 | const startApp = async () => {
12 | const app = new Application({
13 | connectionRetryCount: 1,
14 | path: electronPath,
15 | args: [path.join(__dirname, "..")],
16 | });
17 | this.app = app;
18 | await app.start();
19 | return app;
20 | };
21 |
22 | afterEach(() => {
23 | if (this.app && this.app.isRunning()) {
24 | return this.app.stop();
25 | }
26 | });
27 |
28 | it("saving works", async () => {
29 | const app = await startApp();
30 | await app.client.getWindowCount().then((count) => {
31 | assert.equal(count, 1);
32 | // Please note that getWindowCount() will return 2 if `dev tools` are opened.
33 | // assert.equal(count, 2)
34 | });
35 | const elem = await app.client.$(`//button[contains(.//span, 'File')]`);
36 | await elem.click();
37 | await (await app.client.$(`//a[contains(.//div, 'Save')]`)).click();
38 |
39 | //tnr.. spectron doesn't actually support interacting with the dialogs or with menus so this is kind of pointless...
40 | });
41 | });
42 |
--------------------------------------------------------------------------------
/src/preload.js:
--------------------------------------------------------------------------------
1 | // tnr: We now only access the ipcRenderer from here and
2 | // create a bridge called "api" to communicate back to the
3 | // main process from renderer. I also am now setting the initial sequence data
4 | // using a querystring - https://stackoverflow.com/questions/38335004/how-to-pass-parameters-from-main-process-to-render-processes-in-electron/38401579#38401579
5 |
6 | const { ipcRenderer, contextBridge } = require("electron");
7 |
8 | // Adds an object 'api' to the global window object:
9 | contextBridge.exposeInMainWorld("api", {
10 | send: async (type, arg) => {
11 | return await ipcRenderer.invoke(type, arg);
12 | },
13 | });
14 |
15 | // Add the initial seq data to the renderer window
16 |
17 | const urlParams = new URLSearchParams(global.location.search);
18 |
19 | try {
20 | const datastring = urlParams.get('initialSeqJson');
21 | if (datastring) {
22 | const data = JSON.parse(datastring);
23 | contextBridge.exposeInMainWorld("initialSeqJson", data);
24 | }
25 | } catch (error) {
26 | console.error(`error with initialSeqJson:`, error);
27 | }
28 | // Add the filepath to the renderer window
29 | try {
30 | const datastring = urlParams.get('filePath');
31 | if (datastring) {
32 | const data = JSON.parse(datastring);
33 | contextBridge.exposeInMainWorld("filePath", data);
34 | }
35 | } catch (error) {
36 | console.error(`error with filePath:`, error);
37 | }
38 |
39 | // function getParameterByName(name, url ) {
40 | // name = name.replace(/[\[\]]/g, '\\$&');
41 | // const regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)'),
42 | // results = regex.exec(url);
43 | // if (!results) return null;
44 | // if (!results[2]) return '';
45 | // return decodeURIComponent(results[2].replace(/\+/g, ' '));
46 | // }
--------------------------------------------------------------------------------
/src/renderer_utils/autoUpdate.js:
--------------------------------------------------------------------------------
1 | //tnr: DEPRECATING FOR NOW
2 | const notification = document.getElementById("notification");
3 | const message = document.getElementById("message");
4 | const restartButton = document.getElementById("restart-button");
5 | window.ipcRenderer.on("checking-for-update", () => {
6 | window.ipcRenderer.removeAllListeners("checking-for-update");
7 | message.innerText = "Checking for updates...";
8 | notification.classList.remove("hidden");
9 | });
10 | // window.ipcRenderer.on("update-not-available", () => {
11 | // window.ipcRenderer.removeAllListeners("update-not-available");
12 | // message.innerText = "No updates available";
13 | // notification.classList.remove("hidden");
14 | // setTimeout(() => {
15 | // notification.classList.add("hidden");
16 | // }, 2000);
17 | // });
18 | window.ipcRenderer.on("download-progress", (e, text) => {
19 | message.innerText = text;
20 | notification.classList.remove("hidden"); //tnrtodo comment this out
21 | });
22 | window.ipcRenderer.on("error", (e, text) => {
23 | window.ipcRenderer.removeAllListeners("error");
24 | message.innerText = "Error updating: " + text;
25 | });
26 | window.ipcRenderer.on("update_available", () => {
27 | window.ipcRenderer.removeAllListeners("update_available");
28 | message.innerText = "A new update is available. Downloading now...";
29 | notification.classList.remove("hidden");
30 | });
31 | window.ipcRenderer.on("update_downloaded", () => {
32 | window.ipcRenderer.removeAllListeners("update_downloaded");
33 | message.innerText =
34 | "Update Downloaded. It will be installed on restart. Restart now?";
35 | restartButton.classList.remove("hidden");
36 | notification.classList.remove("hidden");
37 | });
38 |
39 | window.closeNotification = function closeNotification() {
40 | notification.classList.add("hidden");
41 | };
42 | window.restartApp = function restartApp() {
43 | window.ipcRenderer.send("restart_app");
44 | };
45 |
--------------------------------------------------------------------------------
/old_package_json_app_store_friendly:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ove-electron",
3 | "version": "1.4.3",
4 | "description": "An open source vector or plasmid editor",
5 | "main": "main.js",
6 | "scripts": {
7 | "start": "electron . ./pA11990.gb",
8 | "test": "mocha",
9 | "build": "env-cmd electron-builder -wml --publish never",
10 | "build-win": "env-cmd electron-builder --win --publish never",
11 | "build-mac": "env-cmd electron-builder --mac --publish never",
12 | "deploy": "env-cmd electron-builder --mac --linux --publish always",
13 | "deploy-win": "electron-builder --win --publish always",
14 | "deploy-mac": "env-cmd electron-builder --mac --publish always",
15 | "deploy-linux": "env-cmd electron-builder --linux --publish always",
16 | "generateChangelog": "auto-changelog -p && git add . && git commit -m 'Updating CHANGELOG' && git push"
17 | },
18 | "build": {
19 | "appx": {
20 | "identityName": "56560Teselagen.OpenVectorEditor",
21 | "publisher": "CN=D373F92F-3481-433F-9DC5-0BE55DE5500D",
22 | "publisherDisplayName": "Teselagen",
23 | "applicationId": "OpenVectorEditor",
24 | "displayName": "OpenVectorEditor"
25 | },
26 | "win": {
27 | "target": "appx"
28 | },
29 | "productName": "OpenVectorEditor",
30 | "publish": {
31 | "provider": "github",
32 | "repo": "ove-electron",
33 | "owner": "tnrich"
34 | },
35 | "afterSign": "src/misc/notarize.js",
36 | "mac": {
37 | "hardenedRuntime": true,
38 | "gatekeeperAssess": false,
39 | "target": {
40 | "target": "default",
41 | "arch": [
42 | "x64",
43 | "arm64"
44 | ]
45 | },
46 | "entitlements": "src/misc/entitlements.mac.plist",
47 | "entitlementsInherit": "src/misc/entitlements.mac.plist"
48 | },
49 | "appId": "com.teselagen.openVectorEditor",
50 | "fileAssociations": [
51 | {
52 | "ext": "json"
53 | },
54 | {
55 | "ext": "gb"
56 | },
57 | {
58 | "ext": "dna"
59 | },
60 | {
61 | "ext": "gbk"
62 | },
63 | {
64 | "ext": "gp"
65 | },
66 | {
67 | "ext": "fas"
68 | },
69 | {
70 | "ext": "fasta"
71 | },
72 | {
73 | "ext": "fa"
74 | },
75 | {
76 | "ext": "fna"
77 | },
78 | {
79 | "ext": "ffn"
80 | },
81 | {
82 | "ext": "gff"
83 | },
84 | {
85 | "ext": "gff3"
86 | }
87 | ]
88 | },
89 | "repository": "https://github.com/electron/ove-electron",
90 | "keywords": [
91 | "Electron",
92 | "open-vector-editor",
93 | "plasmid",
94 | "editor",
95 | "dna",
96 | "ove"
97 | ],
98 | "author": "tnrich",
99 | "license": "MIT",
100 | "devDependencies": {
101 | "auto-changelog": "^2.4.0",
102 | "electron": "^21.1.0",
103 | "electron-builder": "^23.6.0",
104 | "electron-notarize": "^1.2.1",
105 | "env-cmd": "^10.1.0",
106 | "eslint": "^8.24.0",
107 | "eslint-config-teselagen": "^6.0.6",
108 | "mocha": "^10.0.0",
109 | "spectron": "^19.0.0"
110 | },
111 | "dependencies": {
112 | "bio-parsers": "^8.3.32",
113 | "electron-updater": "^5.3.0",
114 | "electron-window-state": "^5.0.3",
115 | "open-vector-editor": "^18.1.37",
116 | "ove-auto-annotate": "^0.0.5",
117 | "querystring": "^0.2.1",
118 | "ve-range-utils": "^2.6.6",
119 | "ve-sequence-utils": "^5.1.38"
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ove-electron",
3 | "version": "1.5.5",
4 | "description": "An open source vector or plasmid editor",
5 | "main": "main.js",
6 | "author": "Thomas (tnrich) Willheim ",
7 | "scripts": {
8 | "start": "electron . ./pA11990.gb",
9 | "test": "mocha",
10 | "build": "env-cmd electron-builder -wml --publish never",
11 | "build-win": "env-cmd electron-builder --win --publish never",
12 | "build-mac": "env-cmd electron-builder --mac --publish never",
13 | "build-linux": "env-cmd electron-builder --linux --publish never",
14 | "deploy": "env-cmd electron-builder --mac --linux --win --publish always",
15 | "deploy-win": "electron-builder --win --publish always",
16 | "deploy-mac": "env-cmd electron-builder --mac --publish always",
17 | "deploy-linux": "env-cmd electron-builder --linux --publish always",
18 | "generateChangelog": "auto-changelog -p && git add . && git commit -m 'Updating CHANGELOG' && git push"
19 | },
20 | "build": {
21 | "appx": {
22 | "identityName": "56560Teselagen.OpenVectorEditor",
23 | "publisher": "CN=D373F92F-3481-433F-9DC5-0BE55DE5500D",
24 | "publisherDisplayName": "Teselagen",
25 | "applicationId": "OpenVectorEditor",
26 | "displayName": "OpenVectorEditor"
27 | },
28 | "win": {
29 | "target": "nsis"
30 | },
31 | "linux": {
32 | "target": {
33 | "target": "deb",
34 | "arch": [
35 | "x64",
36 | "arm64"
37 | ]
38 | },
39 | "icon": "build/icon.icns"
40 | },
41 | "productName": "OpenVectorEditor",
42 | "publish": {
43 | "provider": "github",
44 | "repo": "ove-electron",
45 | "owner": "tnrich"
46 | },
47 | "afterSign": "src/misc/notarize.js",
48 | "mac": {
49 | "hardenedRuntime": true,
50 | "gatekeeperAssess": false,
51 | "target": {
52 | "target": "dmg",
53 | "arch": [
54 | "x64",
55 | "arm64"
56 | ]
57 | },
58 | "entitlements": "src/misc/entitlements.mac.plist",
59 | "entitlementsInherit": "src/misc/entitlements.mac.plist"
60 | },
61 | "appId": "com.teselagen.openVectorEditor",
62 | "fileAssociations": [
63 | {
64 | "ext": "json"
65 | },
66 | {
67 | "ext": "gb"
68 | },
69 | {
70 | "ext": "dna"
71 | },
72 | {
73 | "ext": "gbk"
74 | },
75 | {
76 | "ext": "gp"
77 | },
78 | {
79 | "ext": "fas"
80 | },
81 | {
82 | "ext": "fasta"
83 | },
84 | {
85 | "ext": "fa"
86 | },
87 | {
88 | "ext": "fna"
89 | },
90 | {
91 | "ext": "ffn"
92 | },
93 | {
94 | "ext": "gff"
95 | },
96 | {
97 | "ext": "gff3"
98 | }
99 | ]
100 | },
101 | "repository": "https://github.com/electron/ove-electron",
102 | "keywords": [
103 | "Electron",
104 | "open-vector-editor",
105 | "plasmid",
106 | "editor",
107 | "dna",
108 | "ove"
109 | ],
110 | "license": "MIT",
111 | "devDependencies": {
112 | "auto-changelog": "^2.4.0",
113 | "electron": "22.0.0",
114 | "electron-builder": "^23.6.0",
115 | "electron-notarize": "^1.2.1",
116 | "env-cmd": "^10.1.0",
117 | "eslint": "^8.28.0",
118 | "eslint-config-teselagen": "^6.0.16",
119 | "mocha": "^10.1.0",
120 | "spectron": "^19.0.0"
121 | },
122 | "dependencies": {
123 | "bio-parsers": "^9.0.1",
124 | "electron-updater": "^5.3.0",
125 | "electron-window-state": "^5.0.3",
126 | "open-vector-editor": "^18.1.53",
127 | "ove-auto-annotate": "^0.0.5",
128 | "querystring": "^0.2.1",
129 | "ve-range-utils": "^2.6.6",
130 | "ve-sequence-utils": "^5.2.8"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/main_utils/menu.js:
--------------------------------------------------------------------------------
1 | const { Menu } = require("electron");
2 |
3 | const { dialog } = require("electron");
4 |
5 | const isMac = process.platform === "darwin";
6 |
7 | module.exports = function createMenu({ createWindow, getSeqJsonFromPath }) {
8 | const template = [
9 | // { role: 'appMenu' }
10 | ...(isMac
11 | ? [
12 | {
13 | label: "OVE",
14 | submenu: [
15 | { role: "about" },
16 | { type: "separator" },
17 | { role: "services" },
18 | { type: "separator" },
19 | { role: "hide" },
20 | { role: "hideothers" },
21 | { role: "unhide" },
22 | { type: "separator" },
23 | { role: "quit" },
24 | ],
25 | },
26 | ]
27 | : []),
28 | // { role: 'fileMenu' }
29 | {
30 | label: "File",
31 | submenu: [
32 | {
33 | label: "New File",
34 | accelerator: "CmdOrCtrl+N",
35 | click: () => {
36 | createWindow({
37 | initialSeqJson: undefined,
38 | });
39 | },
40 | },
41 | {
42 | label: "Open",
43 | accelerator: "CmdOrCtrl+O",
44 | click: async () => {
45 | const { filePaths } = await dialog.showOpenDialog({
46 | filters: [
47 | {
48 | name: "Sequence Files",
49 | extensions: [
50 | "gb",
51 | "json",
52 | "dna",
53 | "gbk",
54 | "gp",
55 | "fas",
56 | "fasta",
57 | "fa",
58 | "fna",
59 | "ffn",
60 | "gff",
61 | "gff3",
62 | ],
63 | },
64 | ],
65 | properties: ["openFile", "multiSelections"],
66 | });
67 |
68 | filePaths.forEach(async (p) => {
69 | const initialSeqJson = await getSeqJsonFromPath(p);
70 | createWindow({
71 | initialSeqJson,
72 | filePath: p
73 | });
74 | });
75 | },
76 | },
77 | isMac ? { role: "close" } : { role: "quit" },
78 | ],
79 | },
80 | // { role: 'editMenu' }
81 | {
82 | label: "Edit",
83 | submenu: [
84 | // { role: 'undo' },
85 | // { role: 'redo' },
86 | // { type: 'separator' },
87 | { role: "cut" },
88 | { role: "copy" },
89 | { role: "paste" },
90 | // ...(isMac ? [
91 | // { role: 'pasteAndMatchStyle' },
92 | // { role: 'delete' },
93 | // { role: 'selectAll' },
94 | // { type: 'separator' },
95 | // {
96 | // label: 'Speech',
97 | // submenu: [
98 | // { role: 'startspeaking' },
99 | // { role: 'stopspeaking' }
100 | // ]
101 | // }
102 | // ] : [
103 | // { role: 'delete' },
104 | // { type: 'separator' },
105 | // { role: 'selectAll' }
106 | // ])
107 | ],
108 | },
109 | // { role: 'viewMenu' }
110 | {
111 | label: "View",
112 | submenu: [
113 | { role: "reload" },
114 | { role: "forcereload" },
115 | { role: "toggledevtools" },
116 | { type: "separator" },
117 | { role: "resetzoom" },
118 | { role: "zoomin" },
119 | { role: "zoomout" },
120 | { type: "separator" },
121 | { role: "togglefullscreen" },
122 | ],
123 | },
124 | // { role: 'windowMenu' }
125 | {
126 | label: "Window",
127 | submenu: [
128 | { role: "minimize" },
129 | { role: "zoom" },
130 | ...(isMac
131 | ? [
132 | { type: "separator" },
133 | { role: "front" },
134 | { type: "separator" },
135 | { role: "window" },
136 | ]
137 | : [{ role: "close" }]),
138 | ],
139 | },
140 | ];
141 |
142 | // const menu = Menu.buildFromTemplate([
143 | // {label: "a", click: }
144 | // ])
145 | const menu = Menu.buildFromTemplate(template);
146 | Menu.setApplicationMenu(menu);
147 | };
148 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | # ove-electron
4 |
5 | This packages the open-vector-editor web app as an electron tool that can be used on windows/mac/linux
6 |
7 | 
8 |
9 | # Installation Instructions:
10 | - windows -- go to the windows store https://www.microsoft.com/en-us/p/openvectoreditor/9nxcc5vc41k9?activetab=pivot:overviewtab and download it! (old instructions: download the .exe file and double click to install it)
11 |
12 | - Mac/Linux: Go to https://github.com/tnrich/ove-electron/releases and find the latest release for the platform you're on (win/mac/linux)
13 | - mac -- download the DMG file and double click to install it
14 | - linux -- download the .AppImage file and open a terminal. Run:
15 |
16 | ```
17 | chmod +x Open-Vector-Editor-0.1.5.AppImage
18 | ./Open-Vector-Editor-0.1.5.AppImage
19 | ```
20 |
21 | # Developing
22 |
23 | ```
24 | yarn
25 | yarn start
26 | ```
27 |
28 | ## To speed up trying out changes from OVE
29 |
30 | ```
31 | cd open-vector-editor;
32 | yarn link;
33 | cd ove-electron;
34 | yarn link open-vector-editor
35 |
36 |
37 | esModules: console.log("commentMeBackOut") || false,
38 | cjs: console.log("commentMeBackOut") || false
39 |
40 | cd open-vector-editor;
41 | yarn build; //this will now build only the UMD file that ove-electron uses
42 | ```
43 | # Releasing
44 | - Bump the package.json version number
45 | - Build mac, windows and linux:
46 | ```
47 | yarn deploy
48 | ```
49 | - (despite having tried to remove macOS code signing from the process because it takes way too long to run, it looks like mac says the file is Damaged unless it has been code-signed - https://github.com/TeselaGen/openVectorEditor/issues/862#issuecomment-1333771642)
50 | - Go to https://github.com/tnrich/ove-electron/releases
51 | - Edit the most recently pushed release to publish it
52 | - Add the following instructions to the release notes
53 | <---------------Copy Paste The Following into the Release Notes------------------->
54 | # Installing on Mac
55 | - Download the correct mac file (arm64.dmg for M1/M2 macs or .dmg for intel macs)
56 | - Right click the downloaded file and hit open (can't double click to open it)
57 | - Accept the unknown developer warning
58 |
59 | # Installing on Ubuntu (or other .deb linux flavors):
60 | - Download the .deb file (either the AMD or ARM file based on the chip you're computer is using)
61 | - From the terminal run:
62 | ```
63 | sudo dpkg -i ./Downloads/ove-electron_1.5.0_arm64.deb
64 | ```
65 |
66 | # Installing on Windows
67 | - Download the .exe file
68 | - Choose to keep the file (if it warns you it might be malicious)
69 | - Open it (it should start the installer)
70 | <---------------Copy Paste The Above into the Release Notes------------------->
71 | # Testing
72 |
73 | I've set up a single spectron test under /test
74 | It can be run via `yarn test`
75 | Unfortunately spectron doesn't support interacting with native dialogs so I'd need to mock those to have the tests be at all useful. I should probably do this sometime down the line. (note OVE itself is close to full test coverage https://github.com/TeselaGen/openVectorEditor)
76 |
77 |
78 | # DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::
79 | # OLD -- Releasing
80 |
81 | These environment variables will need to be set in a local .env file:
82 |
83 | ```
84 | APPLEID=yourstringhere //my apple id
85 | //this needs to be an app-specific password (not just my apple password) https://appleid.apple.com/account/manage
86 | APPLEIDPASS=yourstringhere
87 | GH_TOKEN=yourstringhere
88 | ```
89 |
90 | - Bump the package.json version number
91 | Login to snapcraft (credentials under https://passwords.google.com/ --> ubuntu.com)
92 | snapcraft login
93 | Go to https://developer.apple.com/account and make sure all notices are signed
94 | - Build mac and linux:
95 | ```
96 | yarn deploy
97 | ```
98 | wait for it to finish
99 | - Go to https://github.com/tnrich/ove-electron/releases
100 | - Edit the most recently pushed release to publish it
101 | - Keep all the files (the blockmap and latest.yml files as they are used by the auto-updater)
102 | - Commit changes
103 | - yarn generateChangelog
104 |
105 | - Windows needs to be built by appveyor. Hit the "New Build" button here to start the windows build - https://ci.appveyor.com/project/tnrich/ove-electron
106 | - after it finishes building it should automatically be pushed to the draft release page https://github.com/tnrich/ove-electron/releases
107 | - go to https://partner.microsoft.com/en-us/dashboard/products and add a new submission for the store using the appx file in the draft release
108 |
109 | ## Troubleshooting release process
110 |
111 | How auto-updating works :
112 | https://medium.com/@johndyer24/creating-and-deploying-an-auto-updating-electron-app-for-mac-and-windows-using-electron-builder-6a3982c0cee6
113 |
114 | If apple notarize isn't working, this can help to troubleshoot:
115 | https://stackoverflow.com/questions/58358449/notarizing-electron-apps-throws-you-must-first-sign-the-relevant-contracts-on
116 |
117 | If you're seeing an itunes signing in error, maybe the app specific password needs to be updated:
118 | https://david.dev/how-to-notarize-your-electron-app
119 |
120 | If you're seeing this error:
121 | The request is missing an Authorization header field containing a valid macaroon
122 | You'll need to re-login to snapcraft.io (credentials under ubuntu.com)
123 |
124 | ```
125 | snapcraft login
126 | ```
127 | # DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::DEPRECATED::
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | CC0 1.0 Universal
2 | ==================
3 |
4 | Statement of Purpose
5 | ---------------------
6 |
7 | The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
8 |
9 | Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
10 |
11 | For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
12 |
13 | 1. Copyright and Related Rights.
14 | --------------------------------
15 | A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
16 |
17 | i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
18 | ii. moral rights retained by the original author(s) and/or performer(s);
19 | iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
20 | iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
21 | v. rights protecting the extraction, dissemination, use and reuse of data in a Work;
22 | vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
23 | vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
24 |
25 | 2. Waiver.
26 | -----------
27 | To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
28 |
29 | 3. Public License Fallback.
30 | ----------------------------
31 | Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
32 |
33 | 4. Limitations and Disclaimers.
34 | --------------------------------
35 |
36 | a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
37 | b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
38 | c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
39 | d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
40 |
--------------------------------------------------------------------------------
/main.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-console*/
2 | // Modules to control application life and create native browser window
3 | const { app, BrowserWindow, ipcMain, dialog } = require("electron");
4 | const path = require("path");
5 | const bioParsers = require("bio-parsers");
6 | const fs = require("fs");
7 | const createMenu = require("./src/main_utils/menu");
8 | const windowStateKeeper = require("electron-window-state");
9 | const { autoUpdater } = require("electron-updater");
10 |
11 | let isAppReady = false;
12 | let isMacOpenTriggered = false;
13 | // Keep a global reference of the window object, if you don't, the window will
14 | // be closed automatically when the JavaScript object is garbage collected.
15 | const windows = [];
16 | createMenu({ windows, createWindow, getSeqJsonFromPath });
17 |
18 | async function getSeqJsonFromPath(_filePath) {
19 | const filePath = _filePath || process.argv[1];
20 | // const filePath = _filePath || process.argv[2] || process.argv[1];
21 | if (filePath === ".") return;
22 | const data = fs.readFileSync(path.resolve(filePath));
23 | //open, read, handle file
24 | if (!data) return;
25 | const fileName = filePath.replace(/^.*[\\/]/, "");
26 | try {
27 | if (fileName.endsWith(".json") && (data.sequence || data.proteinSequence)) {
28 | return data;
29 | }
30 | const res = await bioParsers.anyToJson(data, { fileName });
31 | return res[0].parsedSequence;
32 | } catch (error) {
33 | console.error(`error:`, error);
34 | return {};
35 | }
36 | }
37 |
38 | function waitTillAppReady() {
39 | return new Promise((resolve, reject) => {
40 | const waitTillReadyInterval = setInterval(() => {
41 | if (isAppReady) {
42 | resolve();
43 | clearInterval(waitTillReadyInterval);
44 | }
45 | }, 100);
46 | });
47 | }
48 |
49 | async function createWindow({ initialSeqJson, filePath, windowToUse } = {}) {
50 | await waitTillAppReady();
51 | //if no windowVars are passed then we should
52 | // Create the browser window.
53 |
54 | if (filePath) {
55 | let alreadyOpen = false;
56 | windows.forEach((w) => {
57 | if (w.__filePath === filePath) {
58 | w.bw.show();
59 | alreadyOpen = true;
60 | }
61 | });
62 | if (alreadyOpen) {
63 | return;
64 | }
65 | }
66 | const mainWindowState = windowStateKeeper({
67 | defaultWidth: 1000,
68 | defaultHeight: 800,
69 | });
70 |
71 | let newWindow =
72 | windowToUse ||
73 | new BrowserWindow({
74 | x: mainWindowState.x,
75 | y: mainWindowState.y,
76 | width: mainWindowState.width,
77 | height: mainWindowState.height,
78 | show: false,
79 | webPreferences: {
80 | contextIsolation: true,
81 | // nodeIntegration: true, //we don't want to enable this because it is a security risk and slows down the app
82 | preload: path.join(__dirname, "src/preload.js"),
83 | },
84 | });
85 |
86 | newWindow.once("ready-to-show", () => {
87 | newWindow.show();
88 | });
89 |
90 | // Let us register listeners on the window, so we can update the state
91 | // automatically (the listeners will be removed when the window is closed)
92 | // and restore the maximized or full screen state
93 | mainWindowState.manage(newWindow);
94 |
95 | !windowToUse &&
96 | windows.push({
97 | bw: newWindow,
98 | //set a __filePath property so we can reference this if a user tries to open the same file multiple times
99 | __filePath: filePath,
100 | });
101 | console.log(`initialSeqJson:`,initialSeqJson)
102 | newWindow.loadFile("index.html", {
103 | query: { initialSeqJson: JSON.stringify(initialSeqJson), filePath },
104 | });
105 |
106 | // Open the DevTools.
107 | // newWindow.webContents.openDevTools()
108 |
109 | // Emitted when the window is closed.
110 | newWindow.on("closed", function () {
111 | // Dereference the window object, usually you would store windows
112 | // in an array if your app supports multi windows, this is the time
113 | // when you should delete the corresponding element.
114 | let indexToSplice;
115 | windows.forEach((w, i) => {
116 | if (w.bw === newWindow) {
117 | indexToSplice = i;
118 | }
119 | });
120 | windows.splice(indexToSplice, 1);
121 | newWindow = null;
122 | });
123 | }
124 |
125 | app.on("open-file", async (event, path) => {
126 | isMacOpenTriggered = true;
127 | //mac only
128 | event.preventDefault();
129 | console.log(`open-file`)
130 | try {
131 | console.log("trying to open gb file");
132 | const initialSeqJson = await getSeqJsonFromPath(path);
133 | createWindow({ filePath: path, initialSeqJson });
134 | } catch (e) {
135 | console.error(`e73562891230:`, e);
136 | }
137 | });
138 |
139 | // This method will be called when Electron has finished
140 | // initialization and is ready to create browser windows.
141 | // Some APIs can only be used after this event occurs.
142 | app.on("ready", async () => {
143 | console.info(`App Starting Up`);
144 | autoUpdater.checkForUpdatesAndNotify();
145 | isAppReady = true;
146 | if (!windows.length && !isMacOpenTriggered) {
147 | let initialSeqJson;
148 | if ( process.argv.length >= 2) {
149 | initialSeqJson = await getSeqJsonFromPath();
150 | }
151 | createWindow({ filePath: path, initialSeqJson });
152 | }
153 | });
154 |
155 | // Quit when all windows are closed.
156 | app.on("window-all-closed", function () {
157 | // On macOS it is common for applications and their menu bar
158 | // to stay active until the user quits explicitly with Cmd + Q
159 | if (process.platform !== "darwin") app.quit();
160 | });
161 |
162 | app.on("activate", function () {
163 | // On macOS it's common to re-create a window in the app when the
164 | // dock icon is clicked and there are no other windows open.
165 | if (!windows.length) {
166 | console.log(`onActivate`);
167 | createWindow();
168 | }
169 | });
170 |
171 | // ipcMain.on("restart_app", () => {
172 | // setImmediate(() => {
173 | // autoUpdater.quitAndInstall();
174 | // });
175 | // });
176 |
177 | /* HANDLE THE API CALLS FROM THE RENDERER PROCESS */
178 |
179 | ipcMain.handle(
180 | "ove_saveFile",
181 | (event, { sequenceDataToSave, filePath, isSaveAs }) => {
182 | const browserWindow = BrowserWindow.fromWebContents(event.sender);
183 |
184 | const ext = path.extname(filePath);
185 |
186 | let formattedSeqString;
187 | if (ext === ".fasta") {
188 | formattedSeqString = bioParsers.jsonToFasta(sequenceDataToSave);
189 | } else if (ext === ".bed") {
190 | formattedSeqString = bioParsers.jsonToBed(sequenceDataToSave);
191 | } else if (ext === ".json") {
192 | formattedSeqString = JSON.stringify(sequenceDataToSave, null, 2);
193 | } else {
194 | formattedSeqString = bioParsers.jsonToGenbank(sequenceDataToSave);
195 | }
196 | fs.writeFileSync(filePath, formattedSeqString);
197 | !isSaveAs &&
198 | windows.forEach((w) => {
199 | if (w.bw === browserWindow) {
200 | //update the __filePath prop we're saving on the window to prevent opening the same file twice
201 | w.__filePath = filePath;
202 | }
203 | });
204 | }
205 | );
206 |
207 | ipcMain.handle("ove_showSaveDialog", async (event, opts) => {
208 | return dialog.showSaveDialogSync(
209 | BrowserWindow.fromWebContents(event.sender),
210 | opts
211 | );
212 | });
213 |
214 | /* ************************************************** */
215 |
--------------------------------------------------------------------------------
/src/renderer.js:
--------------------------------------------------------------------------------
1 | // This window.initialSeqJson is getting set in preload from the query string from the main process load() call
2 | const seqDataToUse = window.initialSeqJson || { circular: true };
3 | // export default generateSequenceData()
4 | const originalTitle = document.title;
5 |
6 | setNewTitle(seqDataToUse.name);
7 |
8 | function setNewTitle(name) {
9 | document.title = originalTitle + " -- " + (name || "Untitled Sequence");
10 | }
11 |
12 | const handleSave =
13 | (isSaveAs) =>
14 | async (event, sequenceDataToSave, editorProps, onSuccessCallback) => {
15 | const filters = [
16 | { name: "Genbank", extensions: ["gb"] },
17 | { name: "Fasta", extensions: ["fasta"] },
18 | { name: "TeselaGen JSON", extensions: ["json"] },
19 | { name: "Bed", extensions: ["bed"] },
20 | ];
21 |
22 | let nameToUse;
23 | let defaultPath = "~/Downloads/";
24 | if (window.filePath) {
25 | nameToUse = window.filePath.slice(window.filePath.lastIndexOf("/") + 1);
26 | defaultPath = window.filePath.slice(
27 | 0,
28 | window.filePath.lastIndexOf("/") + 1
29 | );
30 | }
31 | //we need to get the newFilePath
32 | nameToUse =
33 | nameToUse || `${sequenceDataToSave.name || "Untitled_Sequence"}.gb`;
34 | const newFilePath = await window.api.send("ove_showSaveDialog", {
35 | filters,
36 | title: nameToUse,
37 | defaultPath: defaultPath + nameToUse,
38 | buttonLabel: `Save file ${isSaveAs ? "as" : ""}`,
39 | });
40 |
41 | if (!newFilePath) {
42 | return; //cancel the save!
43 | }
44 |
45 | sequenceDataToSave.name = newFilePath.slice(
46 | newFilePath.lastIndexOf("/") + 1
47 | );
48 | filters.forEach(({ extensions }) => {
49 | //strip the extension from the name
50 | sequenceDataToSave.name = sequenceDataToSave.name.replace(
51 | `.${extensions[0]}`,
52 | ""
53 | );
54 | });
55 |
56 | if (!isSaveAs) {
57 | setNewTitle(sequenceDataToSave.name);
58 | window.filePath = newFilePath;
59 | editor.updateEditor({
60 | //update the name of the seq without triggering the undo/redo stack tracking
61 | sequenceData: sequenceDataToSave,
62 | });
63 | }
64 |
65 | window.api.send("ove_saveFile", {
66 | filePath: newFilePath,
67 | sequenceDataToSave,
68 | isSaveAs,
69 | });
70 | onSuccessCallback();
71 | window.toastr.success(`Sequence Saved to ${newFilePath}`);
72 | };
73 |
74 | const editor = window.createVectorEditor("createDomNodeForMe", {
75 | autoAnnotateFeatures: window._ove_addons.autoAnnotateFeatures,
76 | autoAnnotateParts: window._ove_addons.autoAnnotateParts,
77 | autoAnnotatePrimers: window._ove_addons.autoAnnotatePrimers,
78 | isFullscreen: true,
79 | // or you can pass "createDomNodeForMe" but make sure to use editor.close() to clean up the dom node!
80 |
81 | //you can also pass a DOM node as the first arg here
82 | // showReadOnly: false,
83 | // disableSetReadOnly: true,
84 | allowPrimerBasesToBeEdited: true,
85 | defaultLinkedOligoMessage: '',
86 | shouldAutosave: false,
87 | alwaysAllowSave: true,
88 | // rightClickOverrides: {
89 | // selectionLayerRightClicked: (items /* { annotation }, props */) => {
90 | // return [
91 | // ...items,
92 | // {
93 | // text: "Create Part",
94 | // onClick: () => console.info("hey!≈")
95 | // }
96 | // ];
97 | // }
98 | // },
99 | // handleFullscreenClose: () => { //comment this function in to make the editor fullscreen by default
100 | // editor.close() //this calls reactDom.unmountComponent at the node you passed as the first arg
101 | // },
102 | onRename: (newName) => {
103 | setNewTitle(newName);
104 | }, //this option should be shown by default
105 | // onNew: () => {}, //unless this callback is defined, don't show the option to create a new seq
106 | // onDuplicate: () => {}, //unless this callback is defined, don't show the option to create a new seq
107 | onSaveAs: handleSave(true),
108 | onSave: handleSave(),
109 | onImport: (sequenceData) => {
110 | try {
111 | editor.updateEditor({
112 | sequenceData,
113 | });
114 | } catch (error) {
115 | console.error(`error 129821:`, error);
116 | }
117 | },
118 | // onDelete: data => {
119 | // console.warn("would delete", data);
120 | // },
121 | // onCopy: function(event, copiedSequenceData /* , editorState */) {
122 | // //the copiedSequenceData is the subset of the sequence that has been copied in the teselagen sequence format
123 | // const clipboardData = event.clipboardData;
124 | // clipboardData.setData("text/plain", copiedSequenceData.sequence);
125 | // clipboardData.setData(
126 | // "application/json",
127 | // //for example here you could change teselagen parts into jbei parts
128 | // JSON.stringify(copiedSequenceData)
129 | // );
130 | // event.preventDefault();
131 | // //in onPaste in your app you can do:
132 | // // e.clipboardData.getData('application/json')
133 | // },
134 | // onPaste: function(event /* , editorState */) {
135 | // //the onPaste here must return sequenceData in the teselagen data format
136 | // const clipboardData = event.clipboardData;
137 | // let jsonData = clipboardData.getData("application/json");
138 | // if (jsonData) {
139 | // jsonData = JSON.parse(jsonData);
140 | // if (jsonData.isJbeiSeq) {
141 | // jsonData = convertJbeiToTeselagen(jsonData);
142 | // }
143 | // }
144 | // const sequenceData = jsonData || {
145 | // sequence: clipboardData.getData("text/plain")
146 | // };
147 | // return sequenceData;
148 | // },
149 | // getSequenceAtVersion: versionId => {
150 | // if (versionId === 2) {
151 | // return {
152 | // sequence: "thomaswashere"
153 | // };
154 | // } else if ((versionId = 3)) {
155 | // return {
156 | // features: [{ start: 4, end: 6 }],
157 | // sequence:
158 | // "GGGAAAagagagtgagagagtagagagagaccacaccccccGGGAAAagagagtgagagagtagagagagaccacaccccccGGGAAAagagagtgagagagtagagagagaccacaccccccGGGAAAagagagtgagagagtagagagagaccacacccccc"
159 | // };
160 | // } else {
161 | // console.error("we shouldn't be here...");
162 | // return {
163 | // sequence: "taa"
164 | // };
165 | // }
166 | // },
167 | // getVersionList: () => {
168 | // return [
169 | // {
170 | // dateChanged: "12/30/2211",
171 | // editedBy: "Nara",
172 | // // revisionType: "Sequence Deletion",
173 | // versionId: 2
174 | // },
175 | // {
176 | // dateChanged: "8/30/2211",
177 | // editedBy: "Ralph",
178 | // // revisionType: "Feature Edit",
179 | // versionId: 3
180 | // }
181 | // ];
182 | // },
183 | showMenuBar: true,
184 | PropertiesProps: {
185 | propertiesList: [
186 | "general",
187 | "features",
188 | "parts",
189 | "primers",
190 | "translations",
191 | "cutsites",
192 | "orfs",
193 | "genbank",
194 | ],
195 | },
196 | ToolBarProps: {
197 | toolList: [
198 | "saveTool",
199 | "downloadTool",
200 | "importTool",
201 | "undoTool",
202 | "redoTool",
203 | "cutsiteTool",
204 | "featureTool",
205 | "alignmentTool",
206 | "versionHistoryTool",
207 | // "oligoTool",
208 | "orfTool",
209 | // "viewTool",
210 | "editTool",
211 | "findTool",
212 | "visibilityTool",
213 | // "propertiesTool"
214 | ],
215 | },
216 | }); /* createDomNodeForMe will make a dom node for you and append it to the document.body*/
217 |
218 | const isCircular = seqDataToUse && seqDataToUse.circular;
219 | editor.updateEditor({
220 | sequenceData: seqDataToUse,
221 | sequenceDataHistory: {}, //clear the sequenceDataHistory if there is any left over from a previous sequence
222 | annotationVisibility: {
223 | // features: false,
224 | orfTranslations: false,
225 | },
226 | readOnly: false,
227 | panelsShown: [
228 | [
229 | {
230 | // fullScreen: true,
231 | active: !!isCircular,
232 | id: "circular",
233 | name: "Circular Map",
234 | },
235 | {
236 | id: "rail",
237 | name: "Linear Map",
238 | active: !isCircular,
239 | },
240 | ],
241 | [
242 | {
243 | id: "sequence",
244 | name: "Sequence Map",
245 | active: true,
246 | },
247 |
248 | {
249 | id: "properties",
250 | name: "Properties",
251 | },
252 | ],
253 | ],
254 | annotationsToSupport: {
255 | features: true,
256 | translations: true,
257 | parts: true,
258 | orfs: true,
259 | cutsites: true,
260 | primers: true,
261 | },
262 | });
263 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ### Changelog
2 |
3 | All notable changes to this project will be documented in this file. Dates are displayed in UTC.
4 |
5 | Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6 |
7 | #### [v1.4.0](https://github.com/tnrich/ove-electron/compare/v1.4.0...v1.4.0)
8 |
9 | - updating preload script to fix improper use of npm package [`0967dba`](https://github.com/tnrich/ove-electron/commit/0967dba2c58b1088b275fb1a74a3c7630930b6c1)
10 |
11 | #### [v1.4.0](https://github.com/tnrich/ove-electron/compare/v1.3.0...v1.4.0)
12 |
13 | > 3 August 2022
14 |
15 | - updating deps [`d0363c7`](https://github.com/tnrich/ove-electron/commit/d0363c788dbda02e7bd12cf34179a31bffcd82c7)
16 | - Updating CHANGELOG [`98900dd`](https://github.com/tnrich/ove-electron/commit/98900ddbc0b200888fcafaf9cc5b0f89928aee0a)
17 | - bumping version [`66b118b`](https://github.com/tnrich/ove-electron/commit/66b118b3162fc0bb8e63895fabc8f45efcfbb264)
18 |
19 | #### [v1.3.0](https://github.com/tnrich/ove-electron/compare/v1.2.8...v1.3.0)
20 |
21 | > 5 January 2022
22 |
23 | - bumping deps [`9d8f4e2`](https://github.com/tnrich/ove-electron/commit/9d8f4e27ba7629ed45b343c48fc7ae81583cfcf5)
24 | - adding in build icons for appx [`5acaa41`](https://github.com/tnrich/ove-electron/commit/5acaa4135dea4831fa551d4167dd9054558a54fb)
25 | - updating data [`494c832`](https://github.com/tnrich/ove-electron/commit/494c832719681962356f7ab9942d02f27000980d)
26 |
27 | #### [v1.2.8](https://github.com/tnrich/ove-electron/compare/v1.2.6...v1.2.8)
28 |
29 | > 24 September 2021
30 |
31 | - adding encrypted appveyor env vars and removing env-cmd [`03231db`](https://github.com/tnrich/ove-electron/commit/03231db7e56b94293b2823630adea95f99eb5517)
32 | - adding appveyor.yml [`d954224`](https://github.com/tnrich/ove-electron/commit/d954224217d21f63ce13961968aba4074f60149b)
33 | - updating appveyor to only build windows [`777a8e0`](https://github.com/tnrich/ove-electron/commit/777a8e0a79776309e0f902704334aef0d670cd90)
34 |
35 | #### [v1.2.6](https://github.com/tnrich/ove-electron/compare/v1.2.5...v1.2.6)
36 |
37 | > 19 August 2021
38 |
39 | - releasing with updated deps [`59bd94d`](https://github.com/tnrich/ove-electron/commit/59bd94d3cdf3c2d9045e0e1a911e761e74dfb735)
40 |
41 | #### [v1.2.5](https://github.com/tnrich/ove-electron/compare/v1.2.4...v1.2.5)
42 |
43 | > 28 July 2021
44 |
45 | - adding back linux [`7544874`](https://github.com/tnrich/ove-electron/commit/75448746b98627a191347c987d4769cd06fa6b37)
46 | - update readme [`953d4bf`](https://github.com/tnrich/ove-electron/commit/953d4bf24c50f457f37ee0b8f82ea886060d2f75)
47 |
48 | #### [v1.2.4](https://github.com/tnrich/ove-electron/compare/v1.2.2...v1.2.4)
49 |
50 | > 20 July 2021
51 |
52 | - updating to allow .json files to be opened [`e9213ed`](https://github.com/tnrich/ove-electron/commit/e9213ed1009981c57a643aaec1667dd3b6bbc89a)
53 |
54 | #### [v1.2.2](https://github.com/tnrich/ove-electron/compare/v1.2.1...v1.2.2)
55 |
56 | > 8 July 2021
57 |
58 | - adding in auto annotate addon [`bfa932c`](https://github.com/tnrich/ove-electron/commit/bfa932cd7a5706de6f2dc852a48f105e98759977)
59 | - undoing test [`169a8ee`](https://github.com/tnrich/ove-electron/commit/169a8ee9ee6ad8c8db25c6ca1a7d7a6e17e8e289)
60 | - zoink [`8b62b60`](https://github.com/tnrich/ove-electron/commit/8b62b6013bdf9423b3e7e93d54025a375a0538ae)
61 |
62 | #### [v1.2.1](https://github.com/tnrich/ove-electron/compare/v1.1.1...v1.2.1)
63 |
64 | > 28 April 2021
65 |
66 | - updating readme and bumping version; commenting out --linux from build process for now (it still seems to generate an appImage even without that but just doesn't publish to snapcraft) [`b8d5e58`](https://github.com/tnrich/ove-electron/commit/b8d5e58f0da131f1ddca2c1939d4b297039d88c0)
67 |
68 | #### [v1.1.1](https://github.com/tnrich/ove-electron/compare/v1.1.0...v1.1.1)
69 |
70 | > 16 April 2021
71 |
72 | #### [v1.1.0](https://github.com/tnrich/ove-electron/compare/v1.0.1...v1.1.0)
73 |
74 | > 16 April 2021
75 |
76 | - fixing broken saving functionality https://github.com/tnrich/ove-electron/issues/18; updating all deps; refactoring to use ipcRenderer correctly instead of deprecated electron.remote module [`fc35367`](https://github.com/tnrich/ove-electron/commit/fc353675e3286219c87d90bcadceac982c885aef)
77 | - fixing modules issue; https://github.com/tnrich/ove-electron/issues/15#issuecomment-768174633 [`9dbad1a`](https://github.com/tnrich/ove-electron/commit/9dbad1a96c94317275136c8e4fe3975baae7b054)
78 | - Updating CHANGELOG [`d8abbe7`](https://github.com/tnrich/ove-electron/commit/d8abbe766ccd8244db09c34e5751098344131863)
79 |
80 | #### [v1.0.1](https://github.com/tnrich/ove-electron/compare/v1.0.0...v1.0.1)
81 |
82 | > 27 January 2021
83 |
84 | - updating readme and changelog [`ee02562`](https://github.com/tnrich/ove-electron/commit/ee02562b2ee5951bc39c2e2379881145b156a2aa)
85 | - updating deps [`f01298f`](https://github.com/tnrich/ove-electron/commit/f01298f41ef0fb8e9741f2e3deead504c98e2474)
86 |
87 | ### [v1.0.0](https://github.com/tnrich/ove-electron/compare/v0.1.10...v1.0.0)
88 |
89 | > 26 January 2021
90 |
91 | - fixing https://github.com/tnrich/ove-electron/issues/15; upgrading to electron 11 [`75c1a8f`](https://github.com/tnrich/ove-electron/commit/75c1a8fa95e1363e76fdce7a088167c2aaa28d39)
92 |
93 | #### [v0.1.10](https://github.com/tnrich/ove-electron/compare/v0.1.9...v0.1.10)
94 |
95 | > 30 July 2020
96 |
97 | - adding loggin [`5fc739b`](https://github.com/tnrich/ove-electron/commit/5fc739b757c7a66542a53e7244246c9f8a28519b)
98 | - tiny [`1409a08`](https://github.com/tnrich/ove-electron/commit/1409a086dfe14ce066c9ff23f32f34e975668087)
99 | - trying out passing the window onOpen [`915467d`](https://github.com/tnrich/ove-electron/commit/915467dc4770eda0a2780de2cc76cbe96ce1d518)
100 |
101 | #### [v0.1.9](https://github.com/tnrich/ove-electron/compare/v0.1.8...v0.1.9)
102 |
103 | > 12 April 2020
104 |
105 | - fixing new feature note create [`c0608d1`](https://github.com/tnrich/ove-electron/commit/c0608d12b05b2ef3720640b28ccfd33aded89719)
106 |
107 | #### [v0.1.8](https://github.com/tnrich/ove-electron/compare/v0.1.6...v0.1.8)
108 |
109 | > 10 April 2020
110 |
111 | - updating to latest version of OVE [`8d76441`](https://github.com/tnrich/ove-electron/commit/8d76441d60c4529bfc32aea4c00cd30af1ebcd76)
112 | - updating package.json [`0670bc2`](https://github.com/tnrich/ove-electron/commit/0670bc2407cd931c260dd65e2d3d162d5ffcbb67)
113 | - bumping version [`32b0b35`](https://github.com/tnrich/ove-electron/commit/32b0b35039e0a47d538ce02b93f954f0d5316cc4)
114 |
115 | #### [v0.1.6](https://github.com/tnrich/ove-electron/compare/v0.1.5...v0.1.6)
116 |
117 | > 17 December 2019
118 |
119 | - adding save functionality; bumping ove version to get multiple fixes-- drag fix -- window resize fix [`367ff69`](https://github.com/tnrich/ove-electron/commit/367ff69cc2cd664215f5f3d846b7eb85ee83e01e)
120 | - Update README.md [`8d278a8`](https://github.com/tnrich/ove-electron/commit/8d278a8845e5e589d22e10d69bf83822c905c2e9)
121 | - adding ability to publish linux releases [`3c7ab9a`](https://github.com/tnrich/ove-electron/commit/3c7ab9ab711b70785ec7ebd93825ed77fb9cffa8)
122 |
123 | #### [v0.1.5](https://github.com/tnrich/ove-electron/compare/v0.1.4...v0.1.5)
124 |
125 | > 30 September 2019
126 |
127 | - tiny [`e445e5e`](https://github.com/tnrich/ove-electron/commit/e445e5ee30a3a0b7b09c590e8c047f9fe31f775c)
128 |
129 | #### [v0.1.4](https://github.com/tnrich/ove-electron/compare/v0.1.3...v0.1.4)
130 |
131 | > 23 September 2019
132 |
133 | #### [v0.1.3](https://github.com/tnrich/ove-electron/compare/v0.1.2...v0.1.3)
134 |
135 | > 23 September 2019
136 |
137 | - adding dark mode, file reconfigure [`041ea40`](https://github.com/tnrich/ove-electron/commit/041ea40c10fd7c597ea7570b13890da030891489)
138 | - updating dark mode btn [`afff50d`](https://github.com/tnrich/ove-electron/commit/afff50d852fd22ce26587f6fcb7c205be6a03c7f)
139 |
140 | #### [v0.1.2](https://github.com/tnrich/ove-electron/compare/v0.1.1...v0.1.2)
141 |
142 | > 23 September 2019
143 |
144 | #### [v0.1.1](https://github.com/tnrich/ove-electron/compare/v0.1.0...v0.1.1)
145 |
146 | > 23 September 2019
147 |
148 | - test release [`ff9c67c`](https://github.com/tnrich/ove-electron/commit/ff9c67c250185842e60827d79ef9e0b1a52cb5dd)
149 |
150 | #### [v0.1.0](https://github.com/tnrich/ove-electron/compare/v0.0.7...v0.1.0)
151 |
152 | > 23 September 2019
153 |
154 | - removing unecessary popup; bumping to v0.1.0 [`d71ad89`](https://github.com/tnrich/ove-electron/commit/d71ad89773493b00fcc481d65cea84597ee2a477)
155 | - tiny [`a63be5d`](https://github.com/tnrich/ove-electron/commit/a63be5d7143b229aae9c1a0817ce5fc6132f9d62)
156 |
157 | #### [v0.0.7](https://github.com/tnrich/ove-electron/compare/v0.0.6...v0.0.7)
158 |
159 | > 23 September 2019
160 |
161 | - bumping [`3576a79`](https://github.com/tnrich/ove-electron/commit/3576a791231fafcbafd3bbebc4b1442d3b52e5a3)
162 |
163 | #### [v0.0.6](https://github.com/tnrich/ove-electron/compare/v0.0.5...v0.0.6)
164 |
165 | > 23 September 2019
166 |
167 | - adding mac notarization [`533916c`](https://github.com/tnrich/ove-electron/commit/533916c18084da34a95d94f7635f9a0f9cfdf481)
168 | - bumping version [`f9f0b6d`](https://github.com/tnrich/ove-electron/commit/f9f0b6d2fa98255f02170989415f9157d5d903a6)
169 |
170 | #### [v0.0.5](https://github.com/tnrich/ove-electron/compare/v0.0.4...v0.0.5)
171 |
172 | > 23 September 2019
173 |
174 | - fixing issues with autoupdater [`90469b0`](https://github.com/tnrich/ove-electron/commit/90469b0a1f61df893883f540b97735a33483f0cb)
175 | - tiny [`57e5056`](https://github.com/tnrich/ove-electron/commit/57e50562bd827138ce25574288b85e51412df629)
176 | - updating gitignore [`f63fc8e`](https://github.com/tnrich/ove-electron/commit/f63fc8ef91983843a22aa31b7e6fb481046ec1f1)
177 |
178 | #### [v0.0.4](https://github.com/tnrich/ove-electron/compare/v0.0.3...v0.0.4)
179 |
180 | > 19 September 2019
181 |
182 | #### [v0.0.3](https://github.com/tnrich/ove-electron/compare/0.0.2...v0.0.3)
183 |
184 | > 19 September 2019
185 |
186 | - setting up auto-updates [`0cba703`](https://github.com/tnrich/ove-electron/commit/0cba703d608b3d2827f1021c6ff885a61a633427)
187 | - adding readme; adding back preload; fixing initial open [`1ecfb41`](https://github.com/tnrich/ove-electron/commit/1ecfb4195feb4e69b36e42b0c994ad51c25bb507)
188 |
189 | #### [0.0.2](https://github.com/tnrich/ove-electron/compare/0.0.1...0.0.2)
190 |
191 | > 18 September 2019
192 |
193 | - fixing import filename passing [`223b957`](https://github.com/tnrich/ove-electron/commit/223b957eaa9adad63693c739c978ddd857ff0376)
194 | - bumping version [`3e2d717`](https://github.com/tnrich/ove-electron/commit/3e2d7172c84ad87dc89196a8c48b97b73611ce71)
195 | - fixing initial open [`cc09899`](https://github.com/tnrich/ove-electron/commit/cc09899928a0f40ea980b4516a362f5466b06c0a)
196 |
197 | #### 0.0.1
198 |
199 | > 17 September 2019
200 |
201 | - updating history [`54251c0`](https://github.com/tnrich/ove-electron/commit/54251c087b6852a576af49806a902880f10dfea0)
202 | - first commit [`9118369`](https://github.com/tnrich/ove-electron/commit/9118369b0c6f160ea8fb1f283ae79fc6456f2553)
203 | - updating dist [`8a8be66`](https://github.com/tnrich/ove-electron/commit/8a8be66a8a6e0df701647dac4f1cb2a187994ffb)
204 |
--------------------------------------------------------------------------------
/pA11990.gb:
--------------------------------------------------------------------------------
1 | LOCUS pA11990 6705 bp DNA circular 06-FEB-2019
2 | FEATURES Location/Qualifiers
3 | promoter 1..19
4 | /label="T7 prom"
5 | misc_feature 19..46
6 | /label="lacO reg"
7 | misc_feature 53..127
8 | /label="RiboJ10"
9 | primer_bind 89..106
10 | /label="oIG00007"
11 | primer complement(94..127)
12 | /label="pARZ4_backbone_new_REV"
13 | primer_bind complement(94..122)
14 | /label="oIG00006"
15 | RBS 128..169
16 | /label="RiboJ10-RBSmax-F13557"
17 | CDS 170..1315
18 | /label="F13557"
19 | misc_feature 170..1315
20 | /label="insert synthon"
21 | primer_bind 424..469
22 | /label="oIG00005"
23 | primer_bind complement(424..453)
24 | /label="oIG00008"
25 | primer 1316..1344
26 | /label="pARZ4_backbone_new_FOR"
27 | terminator 1316..1516
28 | /label="DT10"
29 | plasmid 1316..127
30 | /label="backbone plasmid"
31 | misc_feature 1517..1556
32 | /label="INS230"
33 | misc_structure 1557..1562
34 | /label="linker"
35 | misc_feature 1563..1580
36 | /label="6X His tag"
37 | terminator 1591..1719
38 | /label="T7 term"
39 | rep_origin 1730..2174
40 | /label="M13 origin"
41 | rep_origin 1747..2053
42 | /label="f1 origin"
43 | CDS complement(2278..3093)
44 | /label="kan2 marker"
45 | rep_origin 3139..3821
46 | /label="colE1 origin"
47 | terminator 3195..3237
48 | /label="terminator"
49 | rep_origin 3199..3818
50 | /label="pBR322 origin"
51 | terminator 3688..3728
52 | /label="putative terminator"
53 | terminator 3796..3863
54 | /label="putative terminator(1)"
55 | terminator 4419..4458
56 | /label="putative terminator(2)"
57 | CDS 4456..4824
58 | /label="uncharacterized protein"
59 | CDS complement(4821..5177)
60 | /label="tet"
61 | CDS complement(5233..6315)
62 | /label="lacI"
63 | 5'UTR complement(6316..6343)
64 | /label="lacI 5' UTR"
65 | misc_feature complement(6407..6670)
66 | /label="tet(1)"
67 | ORIGIN
68 | 1 TAATACGACT CACTATAGGG GAATTGTGAG CGGATAACAA TTCCCCTCTA GAAGCGCTCA
69 | 61 ACGGGTGTGC TTCCCGTTCT GATGAGTCCG TGAGGACGAA AGCGCCTCTA CAAATAATTT
70 | 121 TGTTTAAAGT AGAGCTCGCG TTTTTTAGCG ATAAGGAGGT TTTTTTTTTA TGCGTGTAGG
71 | 181 AATCCCGACT GAAACCAAAA ACAATGAGTT CCGTGTTGCG ATTACCCCAG CGGGCGTGGC
72 | 241 GGAACTGACC CGTCGTGGTC ACGAAGTGCT GATTCAGGCG GGTGCGGGCG AAGGTTCTGC
73 | 301 GATTACCGAT GCAGATTTCA AAGCGGCAGG TGCCCAGTTG GTGGGCACCG CTGACCAGGT
74 | 361 GTGGGCGGAT GCCGACCTGC TGTTGAAAGT CAAAGAACCG ATTGCCGCAG AGTATGGTCG
75 | 421 TCTGCGTCAC GGTCAGATTC TGTTTACCTT TCTCCACCTG GCGGCAAGCC GTGCCTGTAC
76 | 481 CGATGCCCTG CTGGATAGCG GCACGACCAG CATTGCCTAT GAAACCGTTC AGACCGCAGA
77 | 541 TGGTGCCCTG CCGTTACTGG CACCGATGAG TGAAGTGGCG GGTCGACTTG CGGCACAAGT
78 | 601 TGGTGCGTAT CACCTGATGC GTACCCAGGG CGGTCGTGGC GTGCTGATGG GCGGTGTTCC
79 | 661 AGGAGTGGAA CCAGCGGATG TGGTTGTGAT TGGTGCTGGC ACCGCAGGCT ATAATGCGGC
80 | 721 ACGCATTGCC AATGGTATGG GTGCGACGGT GACCGTTCTG GACATCAACA TTGATAAACT
81 | 781 GCGTCAACTG GATGCCGAGT TTTGCGGTCG TATTCACACC CGTTATTCCA GTGCGTATGA
82 | 841 ACTGGAAGGT GCGGTGAAGC GTGCGGATTT AGTTATTGGT GCCGTGCTGG TGCCAGGTGC
83 | 901 GAAAGCCCCG AAACTGGTGA GCAACAGCCT GGTTGCCCAC ATGAAACCAG GTGCCGTTCT
84 | 961 GGTGGACATT GCCATTGACC AGGGCGGTTG CTTTGAAGGC AGCCGCCCGA CCACCTATGA
85 | 1021 CCATCCGACC TTCGCCGTTC ACGATACCCT GTTTTATTGC GTGGCGAATA TGCCAGCGTC
86 | 1081 GGTGCCGAAA ACCAGCACCT ATGCCCTGAC CAACGCCACG ATGCCGTATG TTCTGGAACT
87 | 1141 GGCGGACCAC GGCTGGCGTG CGGCGTGTCG AAGCAATCCA GCACTGGCGA AAGGTCTGAG
88 | 1201 CACCCACGAA GGTGCTCTGC TGAGCGAACG GGTTGCAACC GATTTAGGCG TGCCGTTTAC
89 | 1261 CGAACCAGCG TCTGTTCTGG CGGGCAGCGG CAGTCACCAT CATCATCACC ATTAATTCAG
90 | 1321 CCAAAAAACT TAAGACCGCC GGTCTTGTCC ACTACCTTGC AGTAATGCGG TGGACAGGAT
91 | 1381 CGGCGGTTTT CTTTTCTCTT CTCAATACAA ATGAAAGTAC ATAGAAATTA CTCGGTACCA
92 | 1441 AATTCCAGAA AAGAGGCCTC CCGAAAGGGG GGCCTTTTTT CGTTTTGGTC CTCATAGGCA
93 | 1501 ATACGATCGC ATGTCCGTTC TACCCTGGAC TTACAGTTGT CGGCTGAAAG CGAAACCTCG
94 | 1561 AGCACCACCA CCACCACCAC TGAGATCCGG CTGCTAACAA AGCCCGAAAG GAAGCTGAGT
95 | 1621 TGGCTGCTGC CACCGCTGAG CAATAACTAG CATAACCCCT TGGGGCCTCT AAACGGGTCT
96 | 1681 TGAGGGGTTT TTTGCTGAAA GGAGGAACTA TATCCGGATG GCGAATGGGA CGCGCCCTGT
97 | 1741 AGCGGCGCAT TAAGCGCGGC GGGTGTGGTG GTTACGCGCA GCGTGACCGC TACACTTGCC
98 | 1801 AGCGCCCTAG CGCCCGCTCC TTTCGCTTTC TTCCCTTCCT TTCTCGCCAC GTTCGCCGGC
99 | 1861 TTTCCCCGTC AAGCTCTAAA TCGGGGGCTC CCTTTAGGGT TCCGATTTAG TGCTTTACGG
100 | 1921 CACCTCGACC CCAAAAAACT TGATTAGGGT GATGGTTCAC GTAGTGGGCC ATCGCCCTGA
101 | 1981 TAGACGGTTT TTCGCCCTTT GACGTTGGAG TCCACGTTCT TTAATAGTGG ACTCTTGTTC
102 | 2041 CAAACTGGAA CAACACTCAA CCCTATCTCG GTCTATTCTT TTGATTTATA AGGGATTTTG
103 | 2101 CCGATTTCGG CCTATTGGTT AAAAAATGAG CTGATTTAAC AAAAATTTAA CGCGAATTTT
104 | 2161 AACAAAATAT TAACGTTTAC AATTTCAGGT GGCACTTTTC GGGGAAATGT GCGCGGAACC
105 | 2221 CCTATTTGTT TATTTTTCTA AATACATTCA AATATGTATC CGCTCATGAA TTAATTCTTA
106 | 2281 GAAAAACTCA TCGAGCATCA AATGAAACTG CAATTTATTC ATATCAGGAT TATCAATACC
107 | 2341 ATATTTTTGA AAAAGCCGTT TCTGTAATGA AGGAGAAAAC TCACCGAGGC AGTTCCATAG
108 | 2401 GATGGCAAGA TCCTGGTATC GGTCTGCGAT TCCGACTCGT CCAACATCAA TACAACCTAT
109 | 2461 TAATTTCCCC TCGTCAAAAA TAAGGTTATC AAGTGAGAAA TCACCATGAG TGACGACTGA
110 | 2521 ATCCGGTGAG AATGGCAAAA GTTTATGCAT TTCTTTCCAG ACTTGTTCAA CAGGCCAGCC
111 | 2581 ATTACGCTCG TCATCAAAAT CACTCGCATC AACCAAACCG TTATTCATTC GTGATTGCGC
112 | 2641 CTGAGCGAGA CGAAATACGC GATCGCTGTT AAAAGGACAA TTACAAACAG GAATCGAATG
113 | 2701 CAACCGGCGC AGGAACACTG CCAGCGCATC AACAATATTT TCACCTGAAT CAGGATATTC
114 | 2761 TTCTAATACC TGGAATGCTG TTTTCCCGGG GATCGCAGTG GTGAGTAACC ATGCATCATC
115 | 2821 AGGAGTACGG ATAAAATGCT TGATGGTCGG AAGAGGCATA AATTCCGTCA GCCAGTTTAG
116 | 2881 TCTGACCATC TCATCTGTAA CATCATTGGC AACGCTACCT TTGCCATGTT TCAGAAACAA
117 | 2941 CTCTGGCGCA TCGGGCTTCC CATACAATCG ATAGATTGTC GCACCTGATT GCCCGACATT
118 | 3001 ATCGCGAGCC CATTTATACC CATATAAATC AGCATCCATG TTGGAATTTA ATCGCGGCCT
119 | 3061 AGAGCAAGAC GTTTCCCGTT GAATATGGCT CATAACACCC CTTGTATTAC TGTTTATGTA
120 | 3121 AGCAGACAGT TTTATTGTTC ATGACCAAAA TCCCTTAACG TGAGTTTTCG TTCCACTGAG
121 | 3181 CGTCAGACCC CGTAGAAAAG ATCAAAGGAT CTTCTTGAGA TCCTTTTTTT CTGCGCGTAA
122 | 3241 TCTGCTGCTT GCAAACAAAA AAACCACCGC TACCAGCGGT GGTTTGTTTG CCGGATCAAG
123 | 3301 AGCTACCAAC TCTTTTTCCG AAGGTAACTG GCTTCAGCAG AGCGCAGATA CCAAATACTG
124 | 3361 TCCTTCTAGT GTAGCCGTAG TTAGGCCACC ACTTCAAGAA CTCTGTAGCA CCGCCTACAT
125 | 3421 ACCTCGCTCT GCTAATCCTG TTACCAGTGG CTGCTGCCAG TGGCGATAAG TCGTGTCTTA
126 | 3481 CCGGGTTGGA CTCAAGACGA TAGTTACCGG ATAAGGCGCA GCGGTCGGGC TGAACGGGGG
127 | 3541 GTTCGTGCAC ACAGCCCAGC TTGGAGCGAA CGACCTACAC CGAACTGAGA TACCTACAGC
128 | 3601 GTGAGCTATG AGAAAGCGCC ACGCTTCCCG AAGGGAGAAA GGCGGACAGG TATCCGGTAA
129 | 3661 GCGGCAGGGT CGGAACAGGA GAGCGCACGA GGGAGCTTCC AGGGGGAAAC GCCTGGTATC
130 | 3721 TTTATAGTCC TGTCGGGTTT CGCCACCTCT GACTTGAGCG TCGATTTTTG TGATGCTCGT
131 | 3781 CAGGGGGGCG GAGCCTATGG AAAAACGCCA GCAACGCGGC CTTTTTACGG TTCCTGGCCT
132 | 3841 TTTGCTGGCC TTTTGCTCAC ATGTTCTTTC CTGCGTTATC CCCTGATTCT GTGGATAACC
133 | 3901 GTATTACCGC CTTTGAGTGA GCTGATACCG CTCGCCGCAG CCGAACGACC GAGCGCAGCG
134 | 3961 AGTCAGTGAG CGAGGAAGCG GAAGAGCGCC TGATGCGGTA TTTTCTCCTT ACGCATCTGT
135 | 4021 GCGGTATTTC ACACCGCATA TATGGTGCAC TCTCAGTACA ATCTGCTCTG ATGCCGCATA
136 | 4081 GTTAAGCCAG TATACACTCC GCTATCGCTA CGTGACTGGG TCATGGCTGC GCCCCGACAC
137 | 4141 CCGCCAACAC CCGCTGACGC GCCCTGACGG GCTTGTCTGC TCCCGGCATC CGCTTACAGA
138 | 4201 CAAGCTGTGA CCGTCTCCGG GAGCTGCATG TGTCAGAGGT TTTCACCGTC ATCACCGAAA
139 | 4261 CGCGCGAGGC AGCTGCGGTA AAGCTCATCA GCGTGGTCGT GAAGCGATTC ACAGATGTCT
140 | 4321 GCCTGTTCAT CCGCGTCCAG CTCGTTGAGT TTCTCCAGAA GCGTTAATGT CTGGCTTCTG
141 | 4381 ATAAAGCGGG CCATGTTAAG GGCGGTTTTT TCCTGTTTGG TCACTGATGC CTCCGTGTAA
142 | 4441 GGGGGATTTC TGTTCATGGG GGTAATGATA CCGATGAAAC GAGAGAGGAT GCTCACGATA
143 | 4501 CGGGTTACTG ATGATGAACA TGCCCGGTTA CTGGAACGTT GTGAGGGTAA ACAACTGGCG
144 | 4561 GTATGGATGC GGCGGGACCA GAGAAAAATC ACTCAGGGTC AATGCCAGCG CTTCGTTAAT
145 | 4621 ACAGATGTAG GTGTTCCACA GGGTAGCCAG CAGCATCCTG CGATGCAGAT CCGGAACATA
146 | 4681 ATGGTGCAGG GCGCTGACTT CCGCGTTTCC AGACTTTACG AAACACGGAA ACCGAAGACC
147 | 4741 ATTCATGTTG TTGCTCAGGT CGCAGACGTT TTGCAGCAGC AGTCGCTTCA CGTTCGCTCG
148 | 4801 CGTATCGGTG ATTCATTCTG CTAACCAGTA AGGCAACCCC GCCAGCCTAG CCGGGTCCTC
149 | 4861 AACGACAGGA GCACGATCAT GCGCACCCGT GGGGCCGCCA TGCCGGCGAT AATGGCCTGC
150 | 4921 TTCTCGCCGA AACGTTTGGT GGCGGGACCA GTGACGAAGG CTTGAGCGAG GGCGTGCAAG
151 | 4981 ATTCCGAATA CCGCAAGCGA CAGGCCGATC ATCGTCGCGC TCCAGCGAAA GCGGTCCTCG
152 | 5041 CCGAAAATGA CCCAGAGCGC TGCCGGCACC TGTCCTACGA GTTGCATGAT AAAGAAGACA
153 | 5101 GTCATAAGTG CGGCGACGAT AGTCATGCCC CGCGCCCACC GGAAGGAGCT GACTGGGTTG
154 | 5161 AAGGCTCTCA AGGGCATCGG TCGAGATCCC GGTGCCTAAT GAGTGAGCTA ACTTACATTA
155 | 5221 ATTGCGTTGC GCTCACTGCC CGCTTTCCAG TCGGGAAACC TGTCGTGCCA GCTGCATTAA
156 | 5281 TGAATCGGCC AACGCGCGGG GAGAGGCGGT TTGCGTATTG GGCGCCAGGG TGGTTTTTCT
157 | 5341 TTTCACCAGT GAGACGGGCA ACAGCTGATT GCCCTTCACC GCCTGGCCCT GAGAGAGTTG
158 | 5401 CAGCAAGCGG TCCACGCTGG TTTGCCCCAG CAGGCGAAAA TCCTGTTTGA TGGTGGTTAA
159 | 5461 CGGCGGGATA TAACATGAGC TGTCTTCGGT ATCGTCGTAT CCCACTACCG AGATGTCCGC
160 | 5521 ACCAACGCGC AGCCCGGACT CGGTAATGGC GCGCATTGCG CCCAGCGCCA TCTGATCGTT
161 | 5581 GGCAACCAGC ATCGCAGTGG GAACGATGCC CTCATTCAGC ATTTGCATGG TTTGTTGAAA
162 | 5641 ACCGGACATG GCACTCCAGT CGCCTTCCCG TTCCGCTATC GGCTGAATTT GATTGCGAGT
163 | 5701 GAGATATTTA TGCCAGCCAG CCAGACGCAG ACGCGCCGAG ACAGAACTTA ATGGGCCCGC
164 | 5761 TAACAGCGCG ATTTGCTGGT GACCCAATGC GACCAGATGC TCCACGCCCA GTCGCGTACC
165 | 5821 GTCTTCATGG GAGAAAATAA TACTGTTGAT GGGTGTCTGG TCAGAGACAT CAAGAAATAA
166 | 5881 CGCCGGAACA TTAGTGCAGG CAGCTTCCAC AGCAATGGCA TCCTGGTCAT CCAGCGGATA
167 | 5941 GTTAATGATC AGCCCACTGA CGCGTTGCGC GAGAAGATTG TGCACCGCCG CTTTACAGGC
168 | 6001 TTCGACGCCG CTTCGTTCTA CCATCGACAC CACCACGCTG GCACCCAGTT GATCGGCGCG
169 | 6061 AGATTTAATC GCCGCGACAA TTTGCGACGG CGCGTGCAGG GCCAGACTGG AGGTGGCAAC
170 | 6121 GCCAATCAGC AACGACTGTT TGCCCGCCAG TTGTTGTGCC ACGCGGTTGG GAATGTAATT
171 | 6181 CAGCTCCGCC ATCGCCGCTT CCACTTTTTC CCGCGTTTTC GCAGAAACGT GGCTGGCCTG
172 | 6241 GTTCACCACG CGGGAAACGG TCTGATAAGA GACACCGGCA TACTCTGCGA CATCGTATAA
173 | 6301 CGTTACTGGT TTCACATTCA CCACCCTGAA TTGACTCTCT TCCGGGCGCT ATCATGCCAT
174 | 6361 ACCGCGAAAG GTTTTGCGCC ATTCGATGGT GTCCGGGATC TCGACGCTCT CCCTTATGCG
175 | 6421 ACTCCTGCAT TAGGAAGCAG CCCAGTAGTA GGTTGAGGCC GTTGAGCACC GCCGCCGCAA
176 | 6481 GGAATGGTGC ATGCAAGGAG ATGGCGCCCA ACAGTCCCCC GGCCACGGGG CCTGCCACCA
177 | 6541 TACCCACGCC GAAACAAGCG CTCATGAGCC CGAAGTGGCG AGCCCGATCT TCCCCATCGG
178 | 6601 TGATGTCGGC GATATAGGCG CCAGCAACCG CACCTGTGGC GCCGGTGATG CCGGCCACGA
179 | 6661 TGCGTCCGGC GTAGAGGATC GAGATCGATC TCGATCCCGC GAAAT
180 | //
--------------------------------------------------------------------------------
/pA11990 copy.gb:
--------------------------------------------------------------------------------
1 | LOCUS pA11990 6705 bp DNA circular 06-FEB-2019
2 | FEATURES Location/Qualifiers
3 | promoter 1..19
4 | /label="T7 prom"
5 | misc_feature 19..46
6 | /label="lacO reg"
7 | misc_feature 53..127
8 | /label="RiboJ10"
9 | primer_bind 89..106
10 | /label="oIG00007"
11 | primer complement(94..127)
12 | /label="pARZ4_backbone_new_REV"
13 | primer_bind complement(94..122)
14 | /label="oIG00006"
15 | RBS 128..169
16 | /label="RiboJ10-RBSmax-F13557"
17 | CDS 170..1315
18 | /label="F13557"
19 | misc_feature 170..1315
20 | /label="insert synthon"
21 | primer_bind 424..469
22 | /label="oIG00005"
23 | primer_bind complement(424..453)
24 | /label="oIG00008"
25 | primer 1316..1344
26 | /label="pARZ4_backbone_new_FOR"
27 | terminator 1316..1516
28 | /label="DT10"
29 | plasmid 1316..127
30 | /label="backbone plasmid"
31 | misc_feature 1517..1556
32 | /label="INS230"
33 | misc_structure 1557..1562
34 | /label="linker"
35 | misc_feature 1563..1580
36 | /label="6X His tag"
37 | terminator 1591..1719
38 | /label="T7 term"
39 | rep_origin 1730..2174
40 | /label="M13 origin"
41 | rep_origin 1747..2053
42 | /label="f1 origin"
43 | CDS complement(2278..3093)
44 | /label="kan2 marker"
45 | rep_origin 3139..3821
46 | /label="colE1 origin"
47 | terminator 3195..3237
48 | /label="terminator"
49 | rep_origin 3199..3818
50 | /label="pBR322 origin"
51 | terminator 3688..3728
52 | /label="putative terminator"
53 | terminator 3796..3863
54 | /label="putative terminator(1)"
55 | terminator 4419..4458
56 | /label="putative terminator(2)"
57 | CDS 4456..4824
58 | /label="uncharacterized protein"
59 | CDS complement(4821..5177)
60 | /label="tet"
61 | CDS complement(5233..6315)
62 | /label="lacI"
63 | 5'UTR complement(6316..6343)
64 | /label="lacI 5' UTR"
65 | misc_feature complement(6407..6670)
66 | /label="tet(1)"
67 | ORIGIN
68 | 1 TAATACGACT CACTATAGGG GAATTGTGAG CGGATAACAA TTCCCCTCTA GAAGCGCTCA
69 | 61 ACGGGTGTGC TTCCCGTTCT GATGAGTCCG TGAGGACGAA AGCGCCTCTA CAAATAATTT
70 | 121 TGTTTAAAGT AGAGCTCGCG TTTTTTAGCG ATAAGGAGGT TTTTTTTTTA TGCGTGTAGG
71 | 181 AATCCCGACT GAAACCAAAA ACAATGAGTT CCGTGTTGCG ATTACCCCAG CGGGCGTGGC
72 | 241 GGAACTGACC CGTCGTGGTC ACGAAGTGCT GATTCAGGCG GGTGCGGGCG AAGGTTCTGC
73 | 301 GATTACCGAT GCAGATTTCA AAGCGGCAGG TGCCCAGTTG GTGGGCACCG CTGACCAGGT
74 | 361 GTGGGCGGAT GCCGACCTGC TGTTGAAAGT CAAAGAACCG ATTGCCGCAG AGTATGGTCG
75 | 421 TCTGCGTCAC GGTCAGATTC TGTTTACCTT TCTCCACCTG GCGGCAAGCC GTGCCTGTAC
76 | 481 CGATGCCCTG CTGGATAGCG GCACGACCAG CATTGCCTAT GAAACCGTTC AGACCGCAGA
77 | 541 TGGTGCCCTG CCGTTACTGG CACCGATGAG TGAAGTGGCG GGTCGACTTG CGGCACAAGT
78 | 601 TGGTGCGTAT CACCTGATGC GTACCCAGGG CGGTCGTGGC GTGCTGATGG GCGGTGTTCC
79 | 661 AGGAGTGGAA CCAGCGGATG TGGTTGTGAT TGGTGCTGGC ACCGCAGGCT ATAATGCGGC
80 | 721 ACGCATTGCC AATGGTATGG GTGCGACGGT GACCGTTCTG GACATCAACA TTGATAAACT
81 | 781 GCGTCAACTG GATGCCGAGT TTTGCGGTCG TATTCACACC CGTTATTCCA GTGCGTATGA
82 | 841 ACTGGAAGGT GCGGTGAAGC GTGCGGATTT AGTTATTGGT GCCGTGCTGG TGCCAGGTGC
83 | 901 GAAAGCCCCG AAACTGGTGA GCAACAGCCT GGTTGCCCAC ATGAAACCAG GTGCCGTTCT
84 | 961 GGTGGACATT GCCATTGACC AGGGCGGTTG CTTTGAAGGC AGCCGCCCGA CCACCTATGA
85 | 1021 CCATCCGACC TTCGCCGTTC ACGATACCCT GTTTTATTGC GTGGCGAATA TGCCAGCGTC
86 | 1081 GGTGCCGAAA ACCAGCACCT ATGCCCTGAC CAACGCCACG ATGCCGTATG TTCTGGAACT
87 | 1141 GGCGGACCAC GGCTGGCGTG CGGCGTGTCG AAGCAATCCA GCACTGGCGA AAGGTCTGAG
88 | 1201 CACCCACGAA GGTGCTCTGC TGAGCGAACG GGTTGCAACC GATTTAGGCG TGCCGTTTAC
89 | 1261 CGAACCAGCG TCTGTTCTGG CGGGCAGCGG CAGTCACCAT CATCATCACC ATTAATTCAG
90 | 1321 CCAAAAAACT TAAGACCGCC GGTCTTGTCC ACTACCTTGC AGTAATGCGG TGGACAGGAT
91 | 1381 CGGCGGTTTT CTTTTCTCTT CTCAATACAA ATGAAAGTAC ATAGAAATTA CTCGGTACCA
92 | 1441 AATTCCAGAA AAGAGGCCTC CCGAAAGGGG GGCCTTTTTT CGTTTTGGTC CTCATAGGCA
93 | 1501 ATACGATCGC ATGTCCGTTC TACCCTGGAC TTACAGTTGT CGGCTGAAAG CGAAACCTCG
94 | 1561 AGCACCACCA CCACCACCAC TGAGATCCGG CTGCTAACAA AGCCCGAAAG GAAGCTGAGT
95 | 1621 TGGCTGCTGC CACCGCTGAG CAATAACTAG CATAACCCCT TGGGGCCTCT AAACGGGTCT
96 | 1681 TGAGGGGTTT TTTGCTGAAA GGAGGAACTA TATCCGGATG GCGAATGGGA CGCGCCCTGT
97 | 1741 AGCGGCGCAT TAAGCGCGGC GGGTGTGGTG GTTACGCGCA GCGTGACCGC TACACTTGCC
98 | 1801 AGCGCCCTAG CGCCCGCTCC TTTCGCTTTC TTCCCTTCCT TTCTCGCCAC GTTCGCCGGC
99 | 1861 TTTCCCCGTC AAGCTCTAAA TCGGGGGCTC CCTTTAGGGT TCCGATTTAG TGCTTTACGG
100 | 1921 CACCTCGACC CCAAAAAACT TGATTAGGGT GATGGTTCAC GTAGTGGGCC ATCGCCCTGA
101 | 1981 TAGACGGTTT TTCGCCCTTT GACGTTGGAG TCCACGTTCT TTAATAGTGG ACTCTTGTTC
102 | 2041 CAAACTGGAA CAACACTCAA CCCTATCTCG GTCTATTCTT TTGATTTATA AGGGATTTTG
103 | 2101 CCGATTTCGG CCTATTGGTT AAAAAATGAG CTGATTTAAC AAAAATTTAA CGCGAATTTT
104 | 2161 AACAAAATAT TAACGTTTAC AATTTCAGGT GGCACTTTTC GGGGAAATGT GCGCGGAACC
105 | 2221 CCTATTTGTT TATTTTTCTA AATACATTCA AATATGTATC CGCTCATGAA TTAATTCTTA
106 | 2281 GAAAAACTCA TCGAGCATCA AATGAAACTG CAATTTATTC ATATCAGGAT TATCAATACC
107 | 2341 ATATTTTTGA AAAAGCCGTT TCTGTAATGA AGGAGAAAAC TCACCGAGGC AGTTCCATAG
108 | 2401 GATGGCAAGA TCCTGGTATC GGTCTGCGAT TCCGACTCGT CCAACATCAA TACAACCTAT
109 | 2461 TAATTTCCCC TCGTCAAAAA TAAGGTTATC AAGTGAGAAA TCACCATGAG TGACGACTGA
110 | 2521 ATCCGGTGAG AATGGCAAAA GTTTATGCAT TTCTTTCCAG ACTTGTTCAA CAGGCCAGCC
111 | 2581 ATTACGCTCG TCATCAAAAT CACTCGCATC AACCAAACCG TTATTCATTC GTGATTGCGC
112 | 2641 CTGAGCGAGA CGAAATACGC GATCGCTGTT AAAAGGACAA TTACAAACAG GAATCGAATG
113 | 2701 CAACCGGCGC AGGAACACTG CCAGCGCATC AACAATATTT TCACCTGAAT CAGGATATTC
114 | 2761 TTCTAATACC TGGAATGCTG TTTTCCCGGG GATCGCAGTG GTGAGTAACC ATGCATCATC
115 | 2821 AGGAGTACGG ATAAAATGCT TGATGGTCGG AAGAGGCATA AATTCCGTCA GCCAGTTTAG
116 | 2881 TCTGACCATC TCATCTGTAA CATCATTGGC AACGCTACCT TTGCCATGTT TCAGAAACAA
117 | 2941 CTCTGGCGCA TCGGGCTTCC CATACAATCG ATAGATTGTC GCACCTGATT GCCCGACATT
118 | 3001 ATCGCGAGCC CATTTATACC CATATAAATC AGCATCCATG TTGGAATTTA ATCGCGGCCT
119 | 3061 AGAGCAAGAC GTTTCCCGTT GAATATGGCT CATAACACCC CTTGTATTAC TGTTTATGTA
120 | 3121 AGCAGACAGT TTTATTGTTC ATGACCAAAA TCCCTTAACG TGAGTTTTCG TTCCACTGAG
121 | 3181 CGTCAGACCC CGTAGAAAAG ATCAAAGGAT CTTCTTGAGA TCCTTTTTTT CTGCGCGTAA
122 | 3241 TCTGCTGCTT GCAAACAAAA AAACCACCGC TACCAGCGGT GGTTTGTTTG CCGGATCAAG
123 | 3301 AGCTACCAAC TCTTTTTCCG AAGGTAACTG GCTTCAGCAG AGCGCAGATA CCAAATACTG
124 | 3361 TCCTTCTAGT GTAGCCGTAG TTAGGCCACC ACTTCAAGAA CTCTGTAGCA CCGCCTACAT
125 | 3421 ACCTCGCTCT GCTAATCCTG TTACCAGTGG CTGCTGCCAG TGGCGATAAG TCGTGTCTTA
126 | 3481 CCGGGTTGGA CTCAAGACGA TAGTTACCGG ATAAGGCGCA GCGGTCGGGC TGAACGGGGG
127 | 3541 GTTCGTGCAC ACAGCCCAGC TTGGAGCGAA CGACCTACAC CGAACTGAGA TACCTACAGC
128 | 3601 GTGAGCTATG AGAAAGCGCC ACGCTTCCCG AAGGGAGAAA GGCGGACAGG TATCCGGTAA
129 | 3661 GCGGCAGGGT CGGAACAGGA GAGCGCACGA GGGAGCTTCC AGGGGGAAAC GCCTGGTATC
130 | 3721 TTTATAGTCC TGTCGGGTTT CGCCACCTCT GACTTGAGCG TCGATTTTTG TGATGCTCGT
131 | 3781 CAGGGGGGCG GAGCCTATGG AAAAACGCCA GCAACGCGGC CTTTTTACGG TTCCTGGCCT
132 | 3841 TTTGCTGGCC TTTTGCTCAC ATGTTCTTTC CTGCGTTATC CCCTGATTCT GTGGATAACC
133 | 3901 GTATTACCGC CTTTGAGTGA GCTGATACCG CTCGCCGCAG CCGAACGACC GAGCGCAGCG
134 | 3961 AGTCAGTGAG CGAGGAAGCG GAAGAGCGCC TGATGCGGTA TTTTCTCCTT ACGCATCTGT
135 | 4021 GCGGTATTTC ACACCGCATA TATGGTGCAC TCTCAGTACA ATCTGCTCTG ATGCCGCATA
136 | 4081 GTTAAGCCAG TATACACTCC GCTATCGCTA CGTGACTGGG TCATGGCTGC GCCCCGACAC
137 | 4141 CCGCCAACAC CCGCTGACGC GCCCTGACGG GCTTGTCTGC TCCCGGCATC CGCTTACAGA
138 | 4201 CAAGCTGTGA CCGTCTCCGG GAGCTGCATG TGTCAGAGGT TTTCACCGTC ATCACCGAAA
139 | 4261 CGCGCGAGGC AGCTGCGGTA AAGCTCATCA GCGTGGTCGT GAAGCGATTC ACAGATGTCT
140 | 4321 GCCTGTTCAT CCGCGTCCAG CTCGTTGAGT TTCTCCAGAA GCGTTAATGT CTGGCTTCTG
141 | 4381 ATAAAGCGGG CCATGTTAAG GGCGGTTTTT TCCTGTTTGG TCACTGATGC CTCCGTGTAA
142 | 4441 GGGGGATTTC TGTTCATGGG GGTAATGATA CCGATGAAAC GAGAGAGGAT GCTCACGATA
143 | 4501 CGGGTTACTG ATGATGAACA TGCCCGGTTA CTGGAACGTT GTGAGGGTAA ACAACTGGCG
144 | 4561 GTATGGATGC GGCGGGACCA GAGAAAAATC ACTCAGGGTC AATGCCAGCG CTTCGTTAAT
145 | 4621 ACAGATGTAG GTGTTCCACA GGGTAGCCAG CAGCATCCTG CGATGCAGAT CCGGAACATA
146 | 4681 ATGGTGCAGG GCGCTGACTT CCGCGTTTCC AGACTTTACG AAACACGGAA ACCGAAGACC
147 | 4741 ATTCATGTTG TTGCTCAGGT CGCAGACGTT TTGCAGCAGC AGTCGCTTCA CGTTCGCTCG
148 | 4801 CGTATCGGTG ATTCATTCTG CTAACCAGTA AGGCAACCCC GCCAGCCTAG CCGGGTCCTC
149 | 4861 AACGACAGGA GCACGATCAT GCGCACCCGT GGGGCCGCCA TGCCGGCGAT AATGGCCTGC
150 | 4921 TTCTCGCCGA AACGTTTGGT GGCGGGACCA GTGACGAAGG CTTGAGCGAG GGCGTGCAAG
151 | 4981 ATTCCGAATA CCGCAAGCGA CAGGCCGATC ATCGTCGCGC TCCAGCGAAA GCGGTCCTCG
152 | 5041 CCGAAAATGA CCCAGAGCGC TGCCGGCACC TGTCCTACGA GTTGCATGAT AAAGAAGACA
153 | 5101 GTCATAAGTG CGGCGACGAT AGTCATGCCC CGCGCCCACC GGAAGGAGCT GACTGGGTTG
154 | 5161 AAGGCTCTCA AGGGCATCGG TCGAGATCCC GGTGCCTAAT GAGTGAGCTA ACTTACATTA
155 | 5221 ATTGCGTTGC GCTCACTGCC CGCTTTCCAG TCGGGAAACC TGTCGTGCCA GCTGCATTAA
156 | 5281 TGAATCGGCC AACGCGCGGG GAGAGGCGGT TTGCGTATTG GGCGCCAGGG TGGTTTTTCT
157 | 5341 TTTCACCAGT GAGACGGGCA ACAGCTGATT GCCCTTCACC GCCTGGCCCT GAGAGAGTTG
158 | 5401 CAGCAAGCGG TCCACGCTGG TTTGCCCCAG CAGGCGAAAA TCCTGTTTGA TGGTGGTTAA
159 | 5461 CGGCGGGATA TAACATGAGC TGTCTTCGGT ATCGTCGTAT CCCACTACCG AGATGTCCGC
160 | 5521 ACCAACGCGC AGCCCGGACT CGGTAATGGC GCGCATTGCG CCCAGCGCCA TCTGATCGTT
161 | 5581 GGCAACCAGC ATCGCAGTGG GAACGATGCC CTCATTCAGC ATTTGCATGG TTTGTTGAAA
162 | 5641 ACCGGACATG GCACTCCAGT CGCCTTCCCG TTCCGCTATC GGCTGAATTT GATTGCGAGT
163 | 5701 GAGATATTTA TGCCAGCCAG CCAGACGCAG ACGCGCCGAG ACAGAACTTA ATGGGCCCGC
164 | 5761 TAACAGCGCG ATTTGCTGGT GACCCAATGC GACCAGATGC TCCACGCCCA GTCGCGTACC
165 | 5821 GTCTTCATGG GAGAAAATAA TACTGTTGAT GGGTGTCTGG TCAGAGACAT CAAGAAATAA
166 | 5881 CGCCGGAACA TTAGTGCAGG CAGCTTCCAC AGCAATGGCA TCCTGGTCAT CCAGCGGATA
167 | 5941 GTTAATGATC AGCCCACTGA CGCGTTGCGC GAGAAGATTG TGCACCGCCG CTTTACAGGC
168 | 6001 TTCGACGCCG CTTCGTTCTA CCATCGACAC CACCACGCTG GCACCCAGTT GATCGGCGCG
169 | 6061 AGATTTAATC GCCGCGACAA TTTGCGACGG CGCGTGCAGG GCCAGACTGG AGGTGGCAAC
170 | 6121 GCCAATCAGC AACGACTGTT TGCCCGCCAG TTGTTGTGCC ACGCGGTTGG GAATGTAATT
171 | 6181 CAGCTCCGCC ATCGCCGCTT CCACTTTTTC CCGCGTTTTC GCAGAAACGT GGCTGGCCTG
172 | 6241 GTTCACCACG CGGGAAACGG TCTGATAAGA GACACCGGCA TACTCTGCGA CATCGTATAA
173 | 6301 CGTTACTGGT TTCACATTCA CCACCCTGAA TTGACTCTCT TCCGGGCGCT ATCATGCCAT
174 | 6361 ACCGCGAAAG GTTTTGCGCC ATTCGATGGT GTCCGGGATC TCGACGCTCT CCCTTATGCG
175 | 6421 ACTCCTGCAT TAGGAAGCAG CCCAGTAGTA GGTTGAGGCC GTTGAGCACC GCCGCCGCAA
176 | 6481 GGAATGGTGC ATGCAAGGAG ATGGCGCCCA ACAGTCCCCC GGCCACGGGG CCTGCCACCA
177 | 6541 TACCCACGCC GAAACAAGCG CTCATGAGCC CGAAGTGGCG AGCCCGATCT TCCCCATCGG
178 | 6601 TGATGTCGGC GATATAGGCG CCAGCAACCG CACCTGTGGC GCCGGTGATG CCGGCCACGA
179 | 6661 TGCGTCCGGC GTAGAGGATC GAGATCGATC TCGATCCCGC GAAAT
180 | //
--------------------------------------------------------------------------------