├── img
├── screenshot.png
└── animated-demo.gif
├── src
├── icons
│ ├── icon.ico
│ ├── icon-16.png
│ ├── icon-32.png
│ ├── icon-64.png
│ ├── icon-128.png
│ ├── icon-256.png
│ ├── icon-512.png
│ └── loading-logo.png
├── Markdown Editor.c3p
├── fonts
│ ├── lato-bold.ttf
│ ├── lato-italic.ttf
│ └── lato-regular.ttf
├── scripts
│ ├── register-sw.js
│ ├── offlineClient.js
│ ├── supportCheck.js
│ ├── jobWorker.js
│ ├── dispatchWorker.js
│ └── main.js
├── offline.json
├── arcade.json
├── appmanifest.json
├── style.css
├── index.html
├── converter.js
├── markstyle.css
├── menucss.css
├── sw.js
└── data.json
├── .github
└── FUNDING.yml
├── README.md
├── index.js
├── LICENSE
├── .gitignore
└── package.json
/img/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/img/screenshot.png
--------------------------------------------------------------------------------
/src/icons/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon.ico
--------------------------------------------------------------------------------
/img/animated-demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/img/animated-demo.gif
--------------------------------------------------------------------------------
/src/icons/icon-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-16.png
--------------------------------------------------------------------------------
/src/icons/icon-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-32.png
--------------------------------------------------------------------------------
/src/icons/icon-64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-64.png
--------------------------------------------------------------------------------
/src/Markdown Editor.c3p:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/Markdown Editor.c3p
--------------------------------------------------------------------------------
/src/fonts/lato-bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/fonts/lato-bold.ttf
--------------------------------------------------------------------------------
/src/icons/icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-128.png
--------------------------------------------------------------------------------
/src/icons/icon-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-256.png
--------------------------------------------------------------------------------
/src/icons/icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/icon-512.png
--------------------------------------------------------------------------------
/src/fonts/lato-italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/fonts/lato-italic.ttf
--------------------------------------------------------------------------------
/src/fonts/lato-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/fonts/lato-regular.ttf
--------------------------------------------------------------------------------
/src/icons/loading-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/el3um4s/markdown-c3/HEAD/src/icons/loading-logo.png
--------------------------------------------------------------------------------
/src/scripts/register-sw.js:
--------------------------------------------------------------------------------
1 | "use strict";window.C3_RegisterSW=async function(){if(navigator.serviceWorker)try{const a=await navigator.serviceWorker.register("sw.js",{scope:"./"});console.info("Registered service worker on "+a.scope)}catch(a){console.warn("Failed to register service worker: ",a)}};
--------------------------------------------------------------------------------
/src/offline.json:
--------------------------------------------------------------------------------
1 | {"version":1542836585821,"fileList":["showdown.js","scripts/c3runtime.js","data.json","style.css","scripts/offlineClient.js","scripts/main.js","scripts/dispatchWorker.js","scripts/jobWorker.js","scripts/supportCheck.js","fonts/lato-regular.ttf","fonts/lato-bold.ttf","fonts/lato-italic.ttf","converter.js","markstyle.css","menucss.css","icons/icon-16.png","icons/icon-32.png","icons/icon-64.png","icons/loading-logo.png","icons/icon-128.png","icons/icon-256.png","icons/icon-512.png","arcade.json","scripts/register-sw.js"]}
--------------------------------------------------------------------------------
/src/arcade.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Markdown Editor",
3 | "version": "1.0.0.0",
4 | "description": "",
5 | "id": "",
6 | "viewport-width": 854,
7 | "viewport-height": 480,
8 | "author": "",
9 | "email": "",
10 | "website": "",
11 | "orientations": "landscape",
12 | "c2version": "244",
13 | "c3version": "r125",
14 | "used-plugins": [
15 | "StraniAnelli_InjectCSS",
16 | "StraniAnelli_HTMLElement",
17 | "Function",
18 | "Browser",
19 | "PlatformInfo",
20 | "StraniAnelli_Showdown"
21 | ],
22 | "used-behaviors": [
23 | "Pin",
24 | "DragnDrop",
25 | "Tween",
26 | "Anchor"
27 | ]
28 | }
--------------------------------------------------------------------------------
/src/scripts/offlineClient.js:
--------------------------------------------------------------------------------
1 | "use strict";{window.OfflineClientInfo=new class{constructor(){if(this._broadcastChannel="undefined"==typeof BroadcastChannel?null:new BroadcastChannel("offline"),this._queuedMessages=[],this._onMessageCallback=null,this._broadcastChannel){var a=this;this._broadcastChannel.onmessage=function(b){a._OnBroadcastChannelMessage(b)}}}_OnBroadcastChannelMessage(a){return this._onMessageCallback?void this._onMessageCallback(a):void this._queuedMessages.push(a)}SetMessageCallback(a){this._onMessageCallback=a;for(let b of this._queuedMessages)this._onMessageCallback(b);this._queuedMessages.length=0}}}
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [el3um4s]
4 | patreon: el3um4s
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: ["https://www.paypal.me/el3um4s"]
13 |
--------------------------------------------------------------------------------
/src/scripts/supportCheck.js:
--------------------------------------------------------------------------------
1 | "use strict";(function(){var a=document.createElement("canvas"),b=!!(a.getContext("webgl")||a.getContext("experimental-webgl")),c=[];if(b||c.push("WebGL"),"undefined"==typeof WebAssembly&&c.push("WebAssembly"),0===c.length)window["C3_IsSupported"]=!0;else{var d=document.createElement("div");d.id="notSupportedWrap",document.body.appendChild(d);var e=document.createElement("h2");e.id="notSupportedTitle",e.textContent="Software update needed",d.appendChild(e);var f=document.createElement("p");f.id="notSupportedMessage",f.innerHTML="This content is not supported because your device's software is out-of-date. Try installing any available software updates. Alternatively try on a different device.
Missing features: "+c.join(", ")+"",d.appendChild(f)}})();
--------------------------------------------------------------------------------
/src/appmanifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Markdown Editor",
3 | "short_name": "Markdown Editor",
4 | "description": "",
5 | "start_url": "index.html",
6 | "display": "fullscreen",
7 | "orientation": "landscape",
8 | "background_color": "#ffffff",
9 | "icons": [
10 | {
11 | "src": "icons/icon-16.png",
12 | "sizes": "16x16",
13 | "type": "image/png"
14 | },
15 | {
16 | "src": "icons/icon-32.png",
17 | "sizes": "32x32",
18 | "type": "image/png"
19 | },
20 | {
21 | "src": "icons/icon-64.png",
22 | "sizes": "64x64",
23 | "type": "image/png"
24 | },
25 | {
26 | "src": "icons/icon-128.png",
27 | "sizes": "128x128",
28 | "type": "image/png"
29 | },
30 | {
31 | "src": "icons/icon-256.png",
32 | "sizes": "256x256",
33 | "type": "image/png"
34 | },
35 | {
36 | "src": "icons/icon-512.png",
37 | "sizes": "512x512",
38 | "type": "image/png"
39 | }
40 | ]
41 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Markdown C3
2 | _A Markdown Editor and Previewer built with Construct 3 and ElectronJs_
3 |
4 | **Link**
5 | * [Releases](https://github.com/el3um4s/markdown-c3/releases)
6 | * [Portable Windows 64bit](https://github.com/el3um4s/markdown-c3/releases/download/v.1.0.0/Markdown.C3.1.0.0.exe)
7 | * [C3P file](https://github.com/el3um4s/markdown-c3/raw/master/src/Markdown%20Editor.c3p)
8 |
9 | 
10 |
11 | **Version** 1.0.0
12 |
13 | **License** MIT © 2018 - Samuele de Tomasi
14 |
15 | **GitHub** el3um4s/markdown-c3
16 |
17 | 
18 |
19 | **Created with:**
20 | * [Construct 3](https://www.construct.net/en)
21 | * [ElectronJs](https://electronjs.org/)
22 | * [HTMLElement](https://el3um4s.github.io/construct-html-element-plugin/)
23 | * [Showdownjs](http://showdownjs.com/)
24 | * Google Font Lato
25 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const electron = require('electron');
2 | const path = require('path');
3 | const url = require('url');
4 | require('electron-debug')();
5 |
6 | const {
7 | app,
8 | BrowserWindow
9 | } = electron;
10 |
11 | let mainWindow;
12 |
13 | // 854 x 480
14 | app.on('ready', () => {
15 | mainWindow = new BrowserWindow({
16 | width: 854,
17 | height: 480,
18 | useContentSize: true,
19 | center:true,
20 | show: false,
21 | backgroundColor: '#420024',
22 | title: "Markdown C3",
23 | icon: path.join(__dirname, '/src/icons/icon-256.png')
24 | });
25 |
26 | mainWindow.loadURL(url.format({
27 | pathname: path.join(__dirname, 'src', 'index.html'),
28 | protocol: 'file:',
29 | slashes: true
30 | }))
31 |
32 |
33 | mainWindow.once('ready-to-show', () => {
34 | mainWindow.show();
35 | })
36 |
37 | mainWindow.on('closed', () => {
38 | mainWindow = null;
39 | })
40 | });
41 |
42 | app.on('window-all-closed', () => {
43 | if (process.platform !== 'darwin') {
44 | app.quit()
45 | }
46 | })
--------------------------------------------------------------------------------
/src/style.css:
--------------------------------------------------------------------------------
1 | html, body {
2 | padding: 0;
3 | margin: 0;
4 | overflow: hidden;
5 |
6 | background: #ffffff;
7 | color: white;
8 | }
9 |
10 | html, body, canvas {
11 | touch-action: none;
12 | touch-action-delay: none;
13 | }
14 |
15 | #notSupportedWrap {
16 | margin: 2em auto 1em auto;
17 | width: 75%;
18 | max-width: 45em;
19 | border: 2px solid #aaa;
20 | border-radius: 1em;
21 | padding: 2em;
22 | background-color: #f0f0f0;
23 | font-family: "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif;
24 | color: black;
25 | }
26 |
27 | #notSupportedTitle {
28 | font-size: 1.8em;
29 | }
30 |
31 | #notSupportedMessage {
32 | font-size: 1.2em;
33 | }
34 |
35 | @font-face {
36 | font-family: 'lato-regular';
37 | src: url('fonts/lato-regular.ttf') format('truetype');
38 | }
39 |
40 | @font-face {
41 | font-family: 'lato-bold';
42 | src: url('fonts/lato-bold.ttf') format('truetype');
43 | }
44 |
45 | @font-face {
46 | font-family: 'lato-italic';
47 | src: url('fonts/lato-italic.ttf') format('truetype');
48 | }
49 |
50 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Samuele de Tomasi
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24 | .grunt
25 |
26 | # Bower dependency directory (https://bower.io/)
27 | bower_components
28 |
29 | # node-waf configuration
30 | .lock-wscript
31 |
32 | # Compiled binary addons (https://nodejs.org/api/addons.html)
33 | build/Release
34 |
35 | # Dependency directories
36 | node_modules/
37 | jspm_packages/
38 | build/
39 |
40 | # TypeScript v1 declaration files
41 | typings/
42 |
43 | # Optional npm cache directory
44 | .npm
45 |
46 | # Optional eslint cache
47 | .eslintcache
48 |
49 | # Optional REPL history
50 | .node_repl_history
51 |
52 | # Output of 'npm pack'
53 | *.tgz
54 |
55 | # Yarn Integrity file
56 | .yarn-integrity
57 |
58 | # dotenv environment variables file
59 | .env
60 |
61 | # next.js build output
62 | .next
63 |
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Markdown Editor
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "markdownc3",
3 | "version": "1.0.0",
4 | "description": "Markdown Editor and Previewer",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "electron .",
9 | "build": "electron-builder",
10 | "pack": "electron-builder --dir",
11 | "dist": "electron-builder",
12 | "dist:32win": "build --win --ia32 ",
13 | "dist:64win": "build --win --x64",
14 | "postinstall": "electron-builder install-app-deps"
15 | },
16 | "repository": {
17 | "type": "git",
18 | "url": "git+https://github.com/el3um4s/markdown-c3.git"
19 | },
20 | "keywords": [
21 | "markdown",
22 | "construct3",
23 | "electronjs"
24 | ],
25 | "author": "Samuele de Tomasi",
26 | "license": "ISC",
27 | "bugs": {
28 | "url": "https://github.com/el3um4s/markdown-c3/issues"
29 | },
30 | "homepage": "https://github.com/el3um4s/markdown-c3#readme",
31 | "dependencies": {
32 | "electron-debug": "^2.0.0",
33 | "npm": ">=6.14.6",
34 | "showdown": "^1.9.1"
35 | },
36 | "devDependencies": {
37 | "electron": "^3.0.10",
38 | "electron-builder": "^20.36.2"
39 | },
40 | "build": {
41 | "productName": "Markdown C3",
42 | "appId": "com.stranianelli.markdown-c3",
43 | "directories": {
44 | "output": "build"
45 | },
46 | "win": {
47 | "target": "portable",
48 | "icon": "src/icons/icon.ico"
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/converter.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | function convert() {
4 | const text = document.getElementById('editor').value;
5 | const converter = new showdown.Converter();
6 | return converter.makeHtml(text);
7 | };
8 |
9 | function handleFiles(file) {
10 | const fileToLoad = document.getElementById("upload-file").files[0];
11 | let fileReader = new FileReader();
12 | fileReader.onload = function(fileLoadedEvent){
13 | const textFromFileLoaded = fileLoadedEvent.target.result;
14 | document.getElementById("editor").value = textFromFileLoaded;
15 | document.getElementById('preview').innerHTML = '';
16 | document.getElementById('upload-file').value = null;
17 | // const text = document.getElementById('editor').value;
18 | /*
19 | const converter = new showdown.Converter();
20 | const html = converter.makeHtml(textFromFileLoaded);
21 | let target = document.getElementById('preview');
22 | target.innerHTML = html;*/
23 |
24 | };
25 |
26 | fileReader.readAsText(fileToLoad, "UTF-8");
27 | }
28 |
29 |
30 | // https://www.javascripture.com/FileReader
31 | // https://stackoverflow.com/questions/31746837/reading-uploaded-text-file-contents-in-html
32 | function loadFileAsText(){
33 | var fileToLoad = document.getElementById("fileToLoad").files[0];
34 |
35 | var fileReader = new FileReader();
36 | fileReader.onload = function(fileLoadedEvent){
37 | var textFromFileLoaded = fileLoadedEvent.target.result;
38 | document.getElementById("inputTextToSave").value = textFromFileLoaded;
39 | };
40 |
41 | fileReader.readAsText(fileToLoad, "UTF-8");
42 | }
--------------------------------------------------------------------------------
/src/markstyle.css:
--------------------------------------------------------------------------------
1 | html, body, canvas {
2 | touch-action: manipulation;
3 | }
4 |
5 | #backgroundpatternd {
6 | background-color: #eeedee;
7 | background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z' fill='%23bbbbbb' fill-opacity='0.4' fill-rule='evenodd'/%3E%3C/svg%3E");
8 | }
9 |
10 | .onSelect {
11 | z-index: 10;
12 | }
13 |
14 | .onDrag {
15 | box-shadow: 0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22) !important;
16 | }
17 |
18 | .resizer-dx, .resizer-sx {
19 | cursor: ew-resize;
20 | z-index: 20;
21 | min-width: 8px;
22 | max-width: 8px;
23 | }
24 |
25 | .resizer-bottom, .resizer-up {
26 | cursor: ns-resize;
27 | z-index: 20;
28 | min-height: 8px;
29 | max-height: 8px;
30 | }
31 |
32 | .resizer-bassodestra, .resizer-altosinistra {
33 | cursor: nwse-resize;
34 | z-index: 25;
35 | min-height: 8px;
36 | max-height: 8px;
37 | min-width: 8px;
38 | max-width: 8px;
39 | }
40 |
41 | .noTextSelectable {
42 | user-select: none;
43 | }
--------------------------------------------------------------------------------
/src/scripts/jobWorker.js:
--------------------------------------------------------------------------------
1 | "use strict";self.dispatchPort=null,self.outputPort=null,self.workerNumber=-1,self.activeJobId=null,self.sentBlobs=new Map,self.JobHandlers={};function FlipImageData(a,b,c){const d=4*b,e=new Uint8Array(d),f=a.buffer;for(let g=0,h=Math.floor(c/2);g{const b=a.data,c=b["type"];return"init"===c?(self.workerNumber=b["number"],self.dispatchPort=b["dispatch-port"],self.dispatchPort.onmessage=OnDispatchWorkerMessage,void(self.outputPort=b["output-port"])):"terminate"===c?void self.close():void console.error("unknown message '"+c+"'")});function SendReady(){self.dispatchPort.postMessage({"type":"ready"}),self.outputPort.postMessage({"type":"ready"})}function SendError(a,b){a||self.outputPort.postMessage({"type":"error","jobId":self.activeJobId,"error":b.toString()}),SendDone()}function SendResult(a,b){if(!a){const a=b.transferables||[];self.outputPort.postMessage({"type":"result","jobId":self.activeJobId,"result":b.result},a)}SendDone()}function SendDone(){self.activeJobId=null,self.dispatchPort.postMessage({"type":"done"})}function SendProgress(a){self.outputPort.postMessage({"type":"progress","jobId":self.activeJobId,"progress":a})}function OnDispatchWorkerMessage(a){const b=a.data,c=b["type"];if("_import_scripts"===c)return void importScripts(...b["scripts"]);if("_send_blob"===c)return void self.sentBlobs.set(b["id"],b["blob"]);if("_testMessageChannel"===c)return void self.outputPort.postMessage({"type":"_testMessageChannelOk"});if("_ready"===c)return void SendReady();const d=b["jobId"],f=b["isBroadcast"],e=b["params"];let g;if(self.activeJobId=d,!self.JobHandlers.hasOwnProperty(c))return void console.error(`no handler for message type '${c}'`);try{g=self.JobHandlers[c](e)}catch(a){return void SendError(f,"Exception in job handler: "+a)}g&&g.then?g.then((a)=>SendResult(f,a)).catch((a)=>SendError(f,"Rejection in job handler: "+a)):SendResult(f,g)}
--------------------------------------------------------------------------------
/src/scripts/dispatchWorker.js:
--------------------------------------------------------------------------------
1 | "use strict";self.inputPort=null,self.jobQueue=[],self.jobWorkers=[],self.sentBlobs=[],self.importedScripts=[],self.lastBroadcasts=new Map;class JobWorker{constructor(a,b){this._port=a,this._number=b,this._isReady=!1,this._isBusy=!1,this._port.onmessage=(a)=>this._OnMessage(a.data)}ImportScripts(a){this._port.postMessage({"type":"_import_scripts","scripts":a})}SendBlob(a,b){this._port.postMessage({"type":"_send_blob","blob":a,"id":b})}SendJob(a){if(this._isBusy||!this._isReady)throw new Error("cannot take job");this._isBusy=!0,this._port.postMessage(a,a["transferables"])}_InitBroadcast(a){this._port.postMessage(a,a["transferables"])}SendReady(){this._port.postMessage({"type":"_ready"})}IsReady(){return this._isReady}_OnReady(){this._isReady=!0,this.MaybeStartNextJob()}IsBusy(){return this._isBusy}GetNumber(){return this._number}_OnMessage(a){const b=a["type"];return"ready"===b?void this._OnReady():"done"===b?void this._OnJobDone():void console.error("unknown message from worker '"+b+"'")}_OnJobDone(){this._isBusy=!1,this.MaybeStartNextJob()}MaybeStartNextJob(){if(!this._isBusy&&this._isReady){const a=this._FindAvailableJob();if(-1!==a){const b=self.jobQueue[a],c=b["isBroadcast"];c?(b["doneFlags"][this._number]=!0,b["doneFlags"].every((a)=>a)&&self.jobQueue.splice(a,1)):self.jobQueue.splice(a,1),this.SendJob(b)}}}_FindAvailableJob(){for(let a=0,b=self.jobQueue.length;a{const b=a.data,c=b["type"];"_init"===c?(self.inputPort=b["in-port"],self.inputPort.onmessage=OnInputPortMessage):"_addJobWorker"===c&&AddJobWorker(b["port"])});function OnInputPortMessage(a){const b=a.data,c=b["type"];if("_cancel"===c)return void CancelJob(b.jobId);if("_import_scripts"===c){const a=b["scripts"];for(const b of self.jobWorkers)b.ImportScripts(a);return void self.importedScripts.push(a)}if("_send_blob"===c){const a=b["blob"],c=b["id"];for(const b of self.jobWorkers)b.SendBlob(a,c);return void self.sentBlobs.push([a,c])}if("_no_more_workers"===c)return self.sentBlobs.length=0,self.importedScripts.length=0,void self.lastBroadcasts.clear();if("_testMessageChannel"===c)return void self.jobWorkers[0].TestMessageChannel();self.jobQueue.push(b),b["isBroadcast"]&&(b["doneFlags"]=Array(self.jobWorkers.length).fill(!1),b["transferables"]=[],self.lastBroadcasts.set(b["type"],b));for(const b of self.jobWorkers)b.MaybeStartNextJob()}
--------------------------------------------------------------------------------
/src/menucss.css:
--------------------------------------------------------------------------------
1 | /*https://codepen.io/JFarrow/pen/fFrpg*/
2 |
3 | .fa-2x {
4 | font-size: 2em;
5 | }
6 |
7 | .fas, .fa, .fab {
8 | position: relative;
9 | display: table-cell;
10 | width: 60px;
11 | height: 36px;
12 | text-align: center;
13 | vertical-align: middle;
14 | font-size:20px;
15 | }
16 |
17 | /*
18 | .fa {
19 | position: relative;
20 | display: table-cell;
21 | width: 60px;
22 | height: 36px;
23 | text-align: center;
24 | vertical-align: middle;
25 | font-size:20px;
26 | }*/
27 |
28 |
29 | .main-menu:hover,nav.main-menu.expanded {
30 | width:250px;
31 | overflow:visible;
32 | }
33 |
34 | .main-menu {
35 | background:#212121;
36 | border-right:1px solid #e5e5e5;
37 | position:absolute;
38 | top:0;
39 | bottom:0;
40 | height:100%;
41 | left:0;
42 | width:60px;
43 | overflow:hidden;
44 | -webkit-transition:width .05s linear;
45 | transition:width .05s linear;
46 | -webkit-transform:translateZ(0) scale(1,1);
47 | z-index:100;
48 | }
49 |
50 | .main-menu>ul {
51 | margin:7px 0;
52 | }
53 |
54 | .main-menu li {
55 | position:relative;
56 | display:block;
57 | width:250px;
58 | }
59 |
60 | .main-menu li>a {
61 | position:relative;
62 | display:table;
63 | border-collapse:collapse;
64 | border-spacing:0;
65 | color:#999;
66 | font-family: arial;
67 | font-size: 14px;
68 | text-decoration:none;
69 | -webkit-transform:translateZ(0) scale(1,1);
70 | -webkit-transition:all .1s linear;
71 | transition:all .1s linear;
72 |
73 | }
74 |
75 | .main-menu .nav-icon {
76 | position:relative;
77 | display:table-cell;
78 | width:60px;
79 | height:36px;
80 | text-align:center;
81 | vertical-align:middle;
82 | font-size:18px;
83 | }
84 |
85 | .main-menu .nav-text {
86 | position:relative;
87 | display:table-cell;
88 | vertical-align:middle;
89 | width:190px;
90 | font-family: 'Titillium Web', sans-serif;
91 | }
92 |
93 | .main-menu>ul.logout {
94 | position:absolute;
95 | left:0;
96 | bottom:0;
97 | }
98 |
99 | .no-touch .scrollable.hover {
100 | overflow-y:hidden;
101 | }
102 |
103 | .no-touch .scrollable.hover:hover {
104 | overflow-y:auto;
105 | overflow:visible;
106 | }
107 |
108 | a:hover,a:focus {
109 | text-decoration:none;
110 | }
111 |
112 | nav {
113 | -webkit-user-select:none;
114 | -moz-user-select:none;
115 | -ms-user-select:none;
116 | -o-user-select:none;
117 | user-select:none;
118 | }
119 |
120 | nav ul,nav li {
121 | outline:0;
122 | margin:0;
123 | padding:0;
124 | }
125 | .main-menu li:hover>a,nav.main-menu li.active>a,.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus,.no-touch .dashboard-page nav.dashboard-menu ul li:hover a,.dashboard-page nav.dashboard-menu ul li.active a {
126 | color:#fff;
127 | background-color:#5fa2db;
128 | }
129 | .area {
130 | float: left;
131 | background: #e2e2e2;
132 | width: 100%;
133 | height: 100%;
134 | }
135 | @font-face {
136 | font-family: 'Titillium Web';
137 | font-style: normal;
138 | font-weight: 300;
139 | src: local('Titillium WebLight'), local('TitilliumWeb-Light'), url(https://themes.googleusercontent.com/static/fonts/titilliumweb/v2/anMUvcNT0H1YN4FII8wpr24bNCNEoFTpS2BTjF6FB5E.woff) format('woff');
140 | }
141 |
--------------------------------------------------------------------------------
/src/sw.js:
--------------------------------------------------------------------------------
1 | "use strict";const OFFLINE_DATA_FILE="offline.json",CACHE_NAME_PREFIX="c3offline",BROADCASTCHANNEL_NAME="offline",CONSOLE_PREFIX="[SW] ",LAZYLOAD_KEYNAME="",broadcastChannel="undefined"==typeof BroadcastChannel?null:new BroadcastChannel("offline");function PostBroadcastMessage(a){broadcastChannel&&setTimeout(()=>broadcastChannel.postMessage(a),3e3)}function Broadcast(a){PostBroadcastMessage({"type":a})}function BroadcastDownloadingUpdate(a){PostBroadcastMessage({"type":"downloading-update","version":a})}function BroadcastUpdateReady(a){PostBroadcastMessage({"type":"update-ready","version":a})}function IsUrlInLazyLoadList(a,b){if(!b)return!1;try{for(const c of b)if(new RegExp(c).test(a))return!0}catch(a){console.error("[SW] Error matching in lazy-load list: ",a)}return!1}function WriteLazyLoadListToStorage(a){return"undefined"==typeof localforage?Promise.resolve():localforage.setItem(LAZYLOAD_KEYNAME,a)}function ReadLazyLoadListFromStorage(){return"undefined"==typeof localforage?Promise.resolve([]):localforage.getItem(LAZYLOAD_KEYNAME)}function GetCacheBaseName(){return"c3offline-"+self.registration.scope}function GetCacheVersionName(a){return GetCacheBaseName()+"-v"+a}async function GetAvailableCacheNames(){const a=await caches.keys(),b=GetCacheBaseName();return a.filter((a)=>a.startsWith(b))}async function IsUpdatePending(){const a=await GetAvailableCacheNames();return 2<=a.length}async function GetMainPageUrl(){const a=await clients.matchAll({includeUncontrolled:!0,type:"window"});for(const b of a){let a=b.url;if(a.startsWith(self.registration.scope)&&(a=a.substring(self.registration.scope.length)),a&&"/"!==a)return a.startsWith("?")&&(a="/"+a),a}return""}function fetchWithBypass(a,b){if("string"==typeof a&&(a=new Request(a)),b){const b=new URL(a.url);return b.search+=Math.floor(1e6*Math.random()),fetch(b,{headers:a.headers,mode:a.mode,credentials:a.credentials,redirect:a.redirect,cache:"no-store"})}return fetch(a)}async function CreateCacheFromFileList(a,b,c){const d=await Promise.all(b.map((a)=>fetchWithBypass(a,c)));let e=!0;for(const f of d)f.ok||(e=!1,console.error("[SW] Error fetching '"+f.url+"' ("+f.status+" "+f.statusText+")"));if(!e)throw new Error("not all resources were fetched successfully");const f=await caches.open(a);try{return await Promise.all(d.map((a,c)=>f.put(b[c],a)))}catch(b){throw console.error("[SW] Error writing cache entries: ",b),caches.delete(a),b}}async function UpdateCheck(a){try{const b=await fetchWithBypass(OFFLINE_DATA_FILE,!0);if(!b.ok)throw new Error("offline.json responded with "+b.status+" "+b.statusText);const c=await b.json(),d=c.version,e=c.fileList,f=c.lazyLoad,g=GetCacheVersionName(d),h=await caches.has(g);if(h){const a=await IsUpdatePending();return void(a?(console.log("[SW] Update pending"),Broadcast("update-pending")):(console.log("[SW] Up to date"),Broadcast("up-to-date")))}const i=await GetMainPageUrl();e.unshift("./"),i&&-1===e.indexOf(i)&&e.unshift(i),console.log("[SW] Caching "+e.length+" files for offline use"),a?Broadcast("downloading"):BroadcastDownloadingUpdate(d),f&&(await WriteLazyLoadListToStorage(f)),await CreateCacheFromFileList(g,e,!a);const j=await IsUpdatePending();j?(console.log("[SW] All resources saved, update ready"),BroadcastUpdateReady(d)):(console.log("[SW] All resources saved, offline support ready"),Broadcast("offline-ready"))}catch(a){console.warn("[SW] Update check failed: ",a)}}self.addEventListener("install",(a)=>{a.waitUntil(UpdateCheck(!0).catch(()=>null))});async function GetCacheNameToUse(a,b){if(1===a.length||!b)return a[0];const c=await clients.matchAll();if(1caches.delete(a))),d}async function HandleFetch(a,b){const c=await GetAvailableCacheNames();if(!c.length)return fetch(a.request);const d=await GetCacheNameToUse(c,b),e=await caches.open(d),f=await e.match(a.request);if(f)return f;const g=await Promise.all([fetch(a.request),ReadLazyLoadListFromStorage()]),h=g[0],i=g[1];if(IsUrlInLazyLoadList(a.request.url,i))try{await e.put(a.request,h.clone())}catch(b){console.warn("[SW] Error caching '"+a.request.url+"': ",b)}return h}self.addEventListener("fetch",(a)=>{if(new URL(a.request.url).origin===location.origin){const b="navigate"===a.request.mode,c=HandleFetch(a,b);b&&a.waitUntil(c.then(()=>UpdateCheck(!1))),a.respondWith(c)}});
--------------------------------------------------------------------------------
/src/scripts/main.js:
--------------------------------------------------------------------------------
1 | "use strict";window.DOMHandler=class{constructor(a,b){this._iRuntime=a,this._componentId=b,this._hasTickCallback=!1,this._tickCallback=()=>this.Tick()}Attach(){}PostToRuntime(a,b,c,d){this._iRuntime.PostToRuntimeComponent(this._componentId,a,b,!!c,d)}PostToRuntimeAsync(a,b,c,d){return this._iRuntime.PostToRuntimeComponentAsync(this._componentId,a,b,!!c,d)}_PostToRuntimeMaybeSync(a,b,c){this._iRuntime.UsesWorker()?this.PostToRuntime(a,b,c):this._iRuntime._GetLocalRuntime()["_OnMessageFromDOM"]({"type":"event","component":this._componentId,"handler":a,"dispatchRuntimeEvent":c,"data":b,"responseId":null})}AddRuntimeMessageHandler(a,b){this._iRuntime.AddRuntimeComponentMessageHandler(this._componentId,a,b)}AddRuntimeMessageHandlers(a){for(const[b,c]of a)this.AddRuntimeMessageHandler(b,c)}GetRuntimeInterface(){return this._iRuntime}GetComponentID(){return this._componentId}_StartTicking(){this._hasTickCallback||(this._iRuntime._AddRAFCallback(this._tickCallback),this._hasTickCallback=!0)}_StopTicking(){this._hasTickCallback&&(this._iRuntime._RemoveRAFCallback(this._tickCallback),this._hasTickCallback=!1)}Tick(){}};
2 |
3 | "use strict";window.DOMElementHandler=class extends DOMHandler{constructor(a,b){super(a,b),this._elementMap=new Map,this._autoAttach=!0,this.AddRuntimeMessageHandler("create",(a)=>this._OnCreate(a)),this.AddRuntimeMessageHandler("destroy",(a)=>this._OnDestroy(a)),this.AddRuntimeMessageHandler("set-visible",(a)=>this._OnSetVisible(a)),this.AddRuntimeMessageHandler("update-position",(a)=>this._OnUpdatePosition(a)),this.AddRuntimeMessageHandler("update-state",(a)=>this._OnUpdateState(a)),this.AddRuntimeMessageHandler("focus",(a)=>this._OnSetFocus(a)),this.AddRuntimeMessageHandler("set-css-style",(a)=>this._OnSetCssStyle(a))}SetAutoAttach(a){this._autoAttach=!!a}AddDOMElementMessageHandler(a,b){this.AddRuntimeMessageHandler(a,(a)=>{const c=a["elementId"],d=this._elementMap.get(c);return b(d,a)})}_OnCreate(a){const b=a["elementId"],c=this.CreateElement(b,a);this._elementMap.set(b,c),this._autoAttach&&document.body.appendChild(c)}CreateElement(){throw new Error("required override")}DestroyElement(){}_OnDestroy(a){const b=a["elementId"],c=this._elementMap.get(b);this.DestroyElement(c),this._autoAttach&&c.parentElement.removeChild(c),this._elementMap.delete(b)}PostToRuntimeElement(a,b,c){c||(c={}),c["elementId"]=b,this.PostToRuntime(a,c)}_PostToRuntimeElementMaybeSync(a,b,c){c||(c={}),c["elementId"]=b,this._PostToRuntimeMaybeSync(a,c)}_OnSetVisible(a){if(this._autoAttach){const b=this._elementMap.get(a["elementId"]);b.style.display=a["isVisible"]?"":"none"}}_OnUpdatePosition(a){if(this._autoAttach){const b=this._elementMap.get(a["elementId"]);b.style.left=a["left"]+"px",b.style.top=a["top"]+"px",b.style.width=a["width"]+"px",b.style.height=a["height"]+"px";const c=a["fontSize"];null!==c&&(b.style.fontSize=c+"em")}}_OnUpdateState(a){const b=this._elementMap.get(a["elementId"]);this.UpdateState(b,a)}UpdateState(){throw new Error("required override")}_OnSetFocus(a){const b=this._elementMap.get(a["elementId"]);a["focus"]?b.focus():b.blur()}_OnSetCssStyle(a){const b=this._elementMap.get(a["elementId"]);b.style[a["prop"]]=a["val"]}GetElementById(a){return this._elementMap.get(a)}};
4 |
5 | "use strict";{function a(a){return new Promise((b,c)=>{const d=document.createElement("script");d.onload=b,d.onerror=c,d.async=!1,d.src=a,document.head.appendChild(d)})}function b(a){return new Promise((b,c)=>{const d=new FileReader;d.onload=(a)=>b(a.target.result),d.onerror=(a)=>c(a),d.readAsText(a)})}function c(a){return new Promise((b,c)=>{const d=new FileReader;d.onload=(a)=>b(a.target.result),d.onerror=(a)=>c(a),d.readAsArrayBuffer(a)})}function d(a){if(!a)return"";const b=a.split(".");if(2>b.length)return"";const c=b[b.length-1].toLowerCase();return k.get(c)||""}const e=/(iphone|ipod|ipad)/i.test(navigator.userAgent);let f=new Audio;const g={"audio/webm; codecs=opus":!!f.canPlayType("audio/webm; codecs=opus"),"audio/ogg; codecs=opus":!!f.canPlayType("audio/ogg; codecs=opus"),"audio/webm; codecs=vorbis":!!f.canPlayType("audio/webm; codecs=vorbis"),"audio/ogg; codecs=vorbis":!!f.canPlayType("audio/ogg; codecs=vorbis"),"audio/mp4":!!f.canPlayType("audio/mp4"),"audio/mpeg":!!f.canPlayType("audio/mpeg")};f=null;const h=[];let i=0;const j=Math.max(navigator.hardwareConcurrency||0,8),k=new Map([["mp4","video/mp4"],["webm","video/webm"],["m4a","audio/mp4"],["mp3","audio/mpeg"],["js","application/javascript"],["wasm","application/wasm"]]),l=[],m=new Map,n=new Map;let o=0;window.RuntimeInterface=class f{constructor(a){this._useWorker=a.useWorker,this._messageChannelPort=null,this._baseUrl="",this._workerScriptBlobURLs={},this._worker=null,this._localRuntime=null,this._domHandlers=[],this._runtimeDomHandler=null,this._canvas=null,this._jobScheduler=null,this._rafId=-1,this._rafFunc=()=>this._OnRAFCallback(),this._rafCallbacks=[],this._exportType=a.exportType,this._transferablesBroken=!1,"html5"===this._exportType&&"file"===location.protocol.substr(0,4)&&alert("Exported games won't work until you upload them. (When running on the file: protocol, browsers block many features from working for security reasons.)"),this.AddRuntimeComponentMessageHandler("runtime","cordova-fetch-local-file",(a)=>this._OnCordovaFetchLocalFile(a)),this.AddRuntimeComponentMessageHandler("runtime","create-job-worker",(a)=>this._OnCreateJobWorker(a)),"cordova"===this._exportType?document.addEventListener("deviceready",()=>this._Init(a)):this._Init(a)}Release(){this._CancelAnimationFrame(),this._messageChannelPort&&(this._messageChannelPort.onmessage=null,this._messageChannelPort=null),this._worker&&(this._worker.terminate(),this._worker=null),this._localRuntime&&(this._localRuntime.Release(),this._localRuntime=null),this._canvas&&(this._canvas.parentElement.removeChild(this._canvas),this._canvas=null)}GetCanvas(){return this._canvas}GetBaseURL(){return this._baseUrl}UsesWorker(){return this._useWorker}GetExportType(){return this._exportType}IsWKWebView(){return"cordova"===this._exportType&&e}IsiPhoneX(){if(!this.IsWKWebView())return!1;const a=window["devicePixelRatio"],b=window["screen"]["width"]*a,c=window["screen"]["height"]*a;return 1125==b&&2436==c}async _Init(a){if(a.baseUrl)this._baseUrl=a.baseUrl;else{this._baseUrl=location.origin+location.pathname;const a=this._baseUrl.lastIndexOf("/");-1!==a&&(this._baseUrl=this._baseUrl.substr(0,a+1))}if(a.workerScripts)for(const[b,c]of Object.entries(a.workerScripts))this._workerScriptBlobURLs[b]=URL.createObjectURL(c);const b=new MessageChannel;this._messageChannelPort=b.port1,this._messageChannelPort.onmessage=(a)=>this["_OnMessageFromRuntime"](a.data),window["c3_addPortMessageHandler"]&&window["c3_addPortMessageHandler"]((a)=>this._OnMessageFromDebugger(a)),this._jobScheduler=new self.JobSchedulerDOM(this),await this._jobScheduler.Init(),this.MaybeForceBodySize(),"object"==typeof window["StatusBar"]&&window["StatusBar"]["hide"](),await this._TestTransferablesWork(),this._useWorker?await this._InitWorker(a,b.port2):await this._InitDOM(a,b.port2)}_GetWorkerURL(a){return this._workerScriptBlobURLs.hasOwnProperty(a)?this._workerScriptBlobURLs[a]:a}async CreateWorker(a,b,c){if(a.startsWith("blob:"))return new Worker(a,c);if(this.IsWKWebView()){const b=await this.CordovaFetchLocalFileAsBlob("scripts/"+a);return new Worker(URL.createObjectURL(b),c)}const d=new URL(a,b),e=location.origin!==d.origin;if(e){const a=await fetch(d);if(!a.ok)throw new Error("failed to fetch worker script");const b=await a.blob();return new Worker(URL.createObjectURL(b),c)}return new Worker(d,c)}MaybeForceBodySize(){if(this.IsiPhoneX()){const a=window.innerWidth>window.innerHeight,b=document["documentElement"].style,c=document["body"].style;a?(c["height"]=b["height"]="375px",c["width"]=b["width"]="812px"):(c["width"]=b["width"]="375px",c["height"]=b["height"]="812px")}}_GetCommonRuntimeOptions(a){return{"baseUrl":this._baseUrl,"windowInnerWidth":window.innerWidth,"windowInnerHeight":window.innerHeight,"devicePixelRatio":window.devicePixelRatio,"isFullscreen":f.IsDocumentFullscreen(),"projectData":a.projectData,"previewImageBlobs":window["cr_previewImageBlobs"],"previewProjectFileBlobs":window["cr_previewProjectFileBlobs"],"shaders":self["C3_Shaders"],"exportType":a.exportType,"isDebug":-1new a(this)),this._FindRuntimeDOMHandler()}async _InitDOM(b,c){this._canvas=document.createElement("canvas"),this._canvas.style.display="none",document.body.appendChild(this._canvas),this._domHandlers=l.map((a)=>new a(this)),this._FindRuntimeDOMHandler();const d=b.engineScripts.map((a)=>new URL(a,this._baseUrl).toString());await Promise.all(d.map((b)=>a(b)));const e=Object.assign(this._GetCommonRuntimeOptions(b),{"isInWorker":!1,"messagePort":c,"canvas":this._canvas});this._localRuntime=self["C3_CreateRuntime"](e),await self["C3_InitRuntime"](this._localRuntime,e)}async _OnCreateJobWorker(){const a=await this._jobScheduler._CreateJobWorker();return{"outputPort":a,"transferables":[a]}}_GetLocalRuntime(){if(this._useWorker)throw new Error("not available in worker mode");return this._localRuntime}PostToRuntimeComponent(a,b,c,d,e){this._messageChannelPort.postMessage({"type":"event","component":a,"handler":b,"dispatchRuntimeEvent":d,"data":c,"responseId":null},this._transferablesBroken?void 0:e)}PostToRuntimeComponentAsync(a,b,c,d,e){const f=o++,g=new Promise((a,b)=>{n.set(f,{resolve:a,reject:b})});return this._messageChannelPort.postMessage({"type":"event","component":a,"handler":b,"dispatchRuntimeEvent":d,"data":c,"responseId":f},this._transferablesBroken?void 0:e),g}["_OnMessageFromRuntime"](a){const b=a["type"];if("event"===b)this._OnEventFromRuntime(a);else if("result"===b)this._OnResultFromRuntime(a);else if("runtime-ready"===b)this._OnRuntimeReady();else throw new Error(`unknown message '${b}'`)}_OnEventFromRuntime(a){const b=a["component"],c=a["handler"],d=a["data"],e=a["responseId"],f=m.get(b);if(!f)return void console.warn(`[DOM] No event handlers for component '${b}'`);const g=f.get(c);if(!g)return void console.warn(`[DOM] No handler '${c}' for component '${b}'`);let h=null;try{h=g(d)}catch(a){return console.error(`Exception in '${b}' handler '${c}':`,a),void(null!==e&&this._PostResultToRuntime(e,!1,a.toString()))}null!==e&&(h&&h.then?h.then((a)=>this._PostResultToRuntime(e,!0,a)).catch((a)=>{console.error(`Rejection from '${b}' handler '${c}':`,a),this._PostResultToRuntime(e,!1,a.toString())}):this._PostResultToRuntime(e,!0,h))}_PostResultToRuntime(a,b,c){let d;c&&c["transferables"]&&(d=c["transferables"]),this._messageChannelPort.postMessage({"type":"result","responseId":a,"isOk":b,"result":c},d)}_OnResultFromRuntime(a){const b=a["responseId"],c=a["isOk"],d=a["result"],e=n.get(b);c?e.resolve(d):e.reject(d),n.delete(b)}AddRuntimeComponentMessageHandler(a,b,c){let d=m.get(a);if(d||(d=new Map,m.set(a,d)),d.has(b))throw new Error(`[DOM] Component '${a}' already has handler '${b}'`);d.set(b,c)}static AddDOMHandlerClass(a){if(l.includes(a))throw new Error("DOM handler already added");l.push(a)}_FindRuntimeDOMHandler(){for(const a of this._domHandlers)if("runtime"===a.GetComponentID())return void(this._runtimeDomHandler=a);throw new Error("cannot find runtime DOM handler")}_OnMessageFromDebugger(a){this.PostToRuntimeComponent("debugger","message",a)}_OnRuntimeReady(){for(const a of this._domHandlers)a.Attach()}static IsDocumentFullscreen(){return!!(document["fullscreenElement"]||document["webkitFullscreenElement"]||document["mozFullScreenElement"])}_AddRAFCallback(a){this._rafCallbacks.push(a),this._RequestAnimationFrame()}_RemoveRAFCallback(a){const b=this._rafCallbacks.indexOf(a);if(-1===b)throw new Error("invalid callback");this._rafCallbacks.splice(b,1),this._rafCallbacks.length||this._CancelAnimationFrame()}_RequestAnimationFrame(){-1===this._rafId&&this._rafCallbacks.length&&(this._rafId=requestAnimationFrame(this._rafFunc))}_CancelAnimationFrame(){-1!==this._rafId&&(cancelAnimationFrame(this._rafId),this._rafId=-1)}_OnRAFCallback(){this._rafId=-1;for(const a of this._rafCallbacks)a();this._RequestAnimationFrame()}TryPlayMedia(a,b){this._runtimeDomHandler.TryPlayMedia(a,b)}RemovePendingPlay(a){this._runtimeDomHandler.RemovePendingPlay(a)}_PlayPendingMedia(){this._runtimeDomHandler._PlayPendingMedia()}SetSilent(a){this._runtimeDomHandler.SetSilent(a)}IsAudioFormatSupported(a){return!!g[a]}async _WasmDecodeWebMOpus(a){const b=await this.PostToRuntimeComponentAsync("runtime","opus-decode",{"arrayBuffer":a},!1,[a]);return new Float32Array(b)}IsAbsoluteURL(a){return /^(?:[a-z]+:)?\/\//.test(a)||"data:"===a.substr(0,5)||"blob:"===a.substr(0,5)}IsRelativeURL(a){return!this.IsAbsoluteURL(a)}async _OnCordovaFetchLocalFile(a){const b=a["filename"];switch(a["as"]){case"text":return await this.CordovaFetchLocalFileAsText(b);case"blob":return await this.CordovaFetchLocalFileAsBlob(b);case"blob-url":return await this.CordovaFetchLocalFileAsURL(b);default:throw new Error("unsupported type");}}CordovaFetchLocalFile(a){const b=window["cordova"]["file"]["applicationDirectory"]+"www/"+a;return new Promise((a,c)=>{window["resolveLocalFileSystemURL"](b,(b)=>{b["file"](a,c)},c)})}async CordovaFetchLocalFileAsText(a){const c=await this.CordovaFetchLocalFile(a);return await b(c)}_CordovaMaybeStartNextArrayBufferRead(){if(h.length&&!(i>=j)){i++;const a=h.shift();this._CordovaDoFetchLocalFileAsAsArrayBuffer(a.filename,a.successCallback,a.errorCallback)}}CordovaFetchLocalFileAsArrayBuffer(a){return new Promise((b,c)=>{h.push({filename:a,successCallback:(a)=>{i--,this._CordovaMaybeStartNextArrayBufferRead(),b(a)},errorCallback:(a)=>{i--,this._CordovaMaybeStartNextArrayBufferRead(),c(a)}}),this._CordovaMaybeStartNextArrayBufferRead()})}async _CordovaDoFetchLocalFileAsAsArrayBuffer(a,b,d){try{const d=await this.CordovaFetchLocalFile(a),e=await c(d);b(e)}catch(a){d(a)}}async CordovaFetchLocalFileAsBlob(a,b){b||(b=d(a));const c=await this.CordovaFetchLocalFileAsArrayBuffer(a);return new Blob([c],{type:b})}async CordovaFetchLocalFileAsURL(a){const b=await this.CordovaFetchLocalFileAsBlob(a);return URL.createObjectURL(b)}_TestTransferablesWork(){let a=null;const b=new Promise((b)=>a=b),c=new ArrayBuffer(1),d=new MessageChannel;return d.port2.onmessage=(b)=>{b.data&&b.data["arrayBuffer"]||(this._transferablesBroken=!0,console.warn("MessageChannel transfers determined to be broken. Disabling transferables.")),a()},d.port1.postMessage({"arrayBuffer":c},[c]),b}}}
6 |
7 | "use strict";{function a(a){return a["sourceCapabilities"]&&a["sourceCapabilities"]["firesTouchEvents"]||a["originalEvent"]&&a["originalEvent"]["sourceCapabilities"]&&a["originalEvent"]["sourceCapabilities"]["firesTouchEvents"]}function b(a){return new Promise((b,c)=>{const d=new Image;d.onload=()=>b(d),d.onerror=(a)=>c(a),d.src=a})}async function c(a){const c=URL.createObjectURL(a);try{return await b(c)}finally{URL.revokeObjectURL(c)}}function d(){return window.parent&&window.parent.document.hasFocus()}self["C3_RasterSvgImage"]=async function(a,b,c){const d=document.createElement("canvas");d.width=b,d.height=c;const e=d.getContext("2d");return e.drawImage(a,0,0,b,c),d};let e=!1;document.addEventListener("pause",()=>e=!0),document.addEventListener("resume",()=>e=!1);const f=class extends DOMHandler{constructor(a){super(a,"runtime"),this._isFirstSizeUpdate=!0,this._targetOrientation="any",this._debugHighlightElem=null,a.AddRuntimeComponentMessageHandler("canvas","update-size",(a)=>this._OnUpdateCanvasSize(a)),a.AddRuntimeComponentMessageHandler("runtime","invoke-download",(a)=>this._OnInvokeDownload(a)),a.AddRuntimeComponentMessageHandler("runtime","raster-svg-image",(a)=>this._OnRasterSvgImage(a)),a.AddRuntimeComponentMessageHandler("runtime","set-target-orientation",(a)=>this._OnSetTargetOrientation(a)),a.AddRuntimeComponentMessageHandler("runtime","register-sw",()=>this._OnRegisterSW()),a.AddRuntimeComponentMessageHandler("runtime","post-to-debugger",(a)=>this._OnPostToDebugger(a)),a.AddRuntimeComponentMessageHandler("runtime","before-start-ticking",()=>this._OnBeforeStartTicking()),a.AddRuntimeComponentMessageHandler("runtime","debug-highlight",(a)=>this._OnDebugHighlight(a));const b=a.GetCanvas();b.addEventListener("contextmenu",(a)=>a.preventDefault()),b.addEventListener("selectstart",(a)=>a.preventDefault()),b.addEventListener("gesturehold",(a)=>a.preventDefault()),b.addEventListener("touchstart",(a)=>a.preventDefault()),window.addEventListener("mousedown",(a)=>{1===a.button&&a.preventDefault()}),window.addEventListener("resize",()=>this._OnWindowResize()),this._mediaPendingPlay=new Set,this._mediaRemovedPendingPlay=new WeakSet,this._isSilent=!1}_OnBeforeStartTicking(){return window.addEventListener("visibilitychange",()=>this._OnVisibilityChange(document.hidden)),document.addEventListener("pause",()=>this._OnVisibilityChange(!0)),document.addEventListener("resume",()=>this._OnVisibilityChange(!1)),{"isSuspended":!!(document.hidden||e)}}Attach(){window.addEventListener("focus",()=>this._PostRuntimeEvent("window-focus")),window.addEventListener("blur",()=>this._PostRuntimeEvent("window-blur",{"parentHasFocus":d()})),window.addEventListener("fullscreenchange",()=>this._OnFullscreenChange()),window.addEventListener("webkitfullscreenchange",()=>this._OnFullscreenChange()),window.addEventListener("mozfullscreenchange",()=>this._OnFullscreenChange()),window.addEventListener("fullscreenerror",(a)=>this._OnFullscreenError(a)),window.addEventListener("webkitfullscreenerror",(a)=>this._OnFullscreenError(a)),window.addEventListener("mozfullscreenerror",(a)=>this._OnFullscreenError(a)),window.addEventListener("keydown",(a)=>this._OnKeyEvent("keydown",a)),window.addEventListener("keyup",(a)=>this._OnKeyEvent("keyup",a)),window.addEventListener("mousemove",(a)=>this._OnMouseEvent("mousemove",a)),window.addEventListener("mousedown",(a)=>this._OnMouseEvent("mousedown",a)),window.addEventListener("mouseup",(a)=>this._OnMouseEvent("mouseup",a)),window.addEventListener("dblclick",(a)=>this._OnMouseEvent("dblclick",a)),window.addEventListener("wheel",(a)=>this._OnMouseWheelEvent("wheel",a)),"undefined"==typeof PointerEvent?(window.addEventListener("touchstart",(a)=>this._OnTouchEvent("pointerdown",a)),window.addEventListener("touchmove",(a)=>this._OnTouchEvent("pointermove",a)),window.addEventListener("touchend",(a)=>this._OnTouchEvent("pointerup",a)),window.addEventListener("touchcancel",(a)=>this._OnTouchEvent("pointercancel",a))):(window.addEventListener("pointerdown",(a)=>this._OnPointerEvent("pointerdown",a)),window.addEventListener("pointermove",(a)=>this._OnPointerEvent("pointermove",a)),window.addEventListener("pointerup",(a)=>this._OnPointerEvent("pointerup",a)),window.addEventListener("pointercancel",(a)=>this._OnPointerEvent("pointercancel",a))),window.addEventListener("deviceorientation",(a)=>this._OnDeviceOrientation(a)),window.addEventListener("devicemotion",(a)=>this._OnDeviceMotion(a));const a=()=>this._PlayPendingMedia();window.addEventListener("pointerup",a,!0),window.addEventListener("touchend",a,!0),window.addEventListener("click",a,!0),window.addEventListener("keydown",a,!0),window.addEventListener("gamepadconnected",a,!0)}_PostRuntimeEvent(a,b){this.PostToRuntime(a,b||null,!0)}_OnWindowResize(){this.PostToRuntime("window-resize",{"innerWidth":window.innerWidth,"innerHeight":window.innerHeight,"devicePixelRatio":window.devicePixelRatio},!0)}_OnSetTargetOrientation(a){this._targetOrientation=a["targetOrientation"]}_TrySetTargetOrientation(){const a=this._targetOrientation;if(screen["orientation"]&&screen["orientation"]["lock"])screen["orientation"]["lock"](a).catch((a)=>console.warn("[Construct 3] Failed to lock orientation: ",a));else try{let b=!1;screen["lockOrientation"]?b=screen["lockOrientation"](a):screen["webkitLockOrientation"]?b=screen["webkitLockOrientation"](a):screen["mozLockOrientation"]?b=screen["mozLockOrientation"](a):screen["msLockOrientation"]&&(b=screen["msLockOrientation"](a)),b||console.warn("[Construct 3] Failed to lock orientation")}catch(a){console.warn("[Construct 3] Failed to lock orientation: ",a)}}_OnFullscreenChange(){const a=RuntimeInterface.IsDocumentFullscreen();a&&"any"!==this._targetOrientation&&this._TrySetTargetOrientation(),this.PostToRuntime("fullscreenchange",{"isFullscreen":a,"innerWidth":window.innerWidth,"innerHeight":window.innerHeight})}_OnFullscreenError(a){console.warn("[Construct 3] Fullscreen request failed: ",a),this.PostToRuntime("fullscreenerror",{"isFullscreen":RuntimeInterface.IsDocumentFullscreen(),"innerWidth":window.innerWidth,"innerHeight":window.innerHeight})}_OnVisibilityChange(a){a?this._iRuntime._CancelAnimationFrame():this._iRuntime._RequestAnimationFrame(),this.PostToRuntime("visibilitychange",{"hidden":a})}_OnKeyEvent(a,b){this._PostToRuntimeMaybeSync(a,{"code":b.code,"key":b.key,"which":b.which,"repeat":b.repeat,"altKey":b.altKey,"ctrlKey":b.ctrlKey,"metaKey":b.metaKey,"shiftKey":b.shiftKey,"timeStamp":b.timeStamp},!0)}_OnMouseEvent(b,c){a(c)||("mousedown"===b&&window!==window.top&&window.focus(),this._PostToRuntimeMaybeSync(b,{"button":c.button,"clientX":c.clientX,"clientY":c.clientY,"timeStamp":c.timeStamp},!0))}_OnMouseWheelEvent(a,b){this.PostToRuntime(a,{"clientX":b.clientX,"clientY":b.clientY,"deltaX":b.deltaX,"deltaY":b.deltaY,"deltaZ":b.deltaZ,"deltaMode":b.deltaMode,"timeStamp":b.timeStamp},!0)}_OnPointerEvent(a,b){"pointerdown"===a&&window!==window.top&&window.focus(),this._PostToRuntimeMaybeSync(a,{"pointerId":b.pointerId,"pointerType":b.pointerType,"clientX":b.clientX,"clientY":b.clientY,"width":b.width||0,"height":b.height||0,"pressure":b.pressure||0,"tangentialPressure":b["tangentialPressure"]||0,"tiltX":b.tiltX||0,"tiltY":b.tiltY||0,"twist":b["twist"]||0,"timeStamp":b.timeStamp},!0)}_OnTouchEvent(a,b){"pointerdown"===a&&window!==window.top&&window.focus();for(let c=0,d=b.changedTouches.length;c{this._mediaRemovedPendingPlay.has(b)||this._mediaPendingPlay.add(b)})}}TryPlayMedia(a,b){if("function"!=typeof a.play)throw new Error("missing play function");if(this._mediaRemovedPendingPlay.delete(a),b)return void this._mediaPendingPlay.add(a);let c;try{c=a.play()}catch(b){return void this._mediaPendingPlay.add(a)}c&&c.catch(()=>{this._mediaRemovedPendingPlay.has(a)||this._mediaPendingPlay.add(a)})}RemovePendingPlay(a){this._mediaPendingPlay.delete(a),this._mediaRemovedPendingPlay.add(a)}SetSilent(a){this._isSilent=!!a}_OnDebugHighlight(a){const b=a["show"];if(!b)return void(this._debugHighlightElem&&(this._debugHighlightElem.style.display="none"));this._debugHighlightElem||(this._debugHighlightElem=document.createElement("div"),this._debugHighlightElem.id="inspectOutline",document.body.appendChild(this._debugHighlightElem));const c=this._debugHighlightElem;c.style.display="",c.style.left=a["left"]-1+"px",c.style.top=a["top"]-1+"px",c.style.width=a["width"]+2+"px",c.style.height=a["height"]+2+"px",c.textContent=a["name"]}_OnRegisterSW(){window["C3_RegisterSW"]&&window["C3_RegisterSW"]()}_OnPostToDebugger(a){window["c3_postToMessagePort"]&&(a["from"]="runtime",window["c3_postToMessagePort"](a))}};RuntimeInterface.AddDOMHandlerClass(f)}
8 |
9 | "use strict";{const a=document.currentScript.src;self.JobSchedulerDOM=class{constructor(b){this._runtimeInterface=b,this._baseUrl=a.substr(0,a.lastIndexOf("/")+1),this._maxNumWorkers=Math.min(navigator.hardwareConcurrency||2,16),this._dispatchWorker=null,this._jobWorkers=[],this._inputPort=null,this._outputPort=null}async Init(){if(this._hasInitialised)throw new Error("already initialised");this._hasInitialised=!0;const a=this._runtimeInterface._GetWorkerURL("dispatchWorker.js");this._dispatchWorker=await this._runtimeInterface.CreateWorker(a,this._baseUrl,{name:"DispatchWorker"});const b=new MessageChannel;this._inputPort=b.port1,this._dispatchWorker.postMessage({"type":"_init","in-port":b.port2},[b.port2]),this._outputPort=await this._CreateJobWorker()}async _CreateJobWorker(){const a=this._jobWorkers.length,b=this._runtimeInterface._GetWorkerURL("jobWorker.js"),c=await this._runtimeInterface.CreateWorker(b,this._baseUrl,{name:"JobWorker"+a}),d=new MessageChannel,e=new MessageChannel;return this._dispatchWorker.postMessage({"type":"_addJobWorker","port":d.port1},[d.port1]),c.postMessage({"type":"init","number":a,"dispatch-port":d.port2,"output-port":e.port2},[d.port2,e.port2]),this._jobWorkers.push(c),e.port1}GetPortData(){return{"inputPort":this._inputPort,"outputPort":this._outputPort,"maxNumWorkers":this._maxNumWorkers}}GetPortTransferables(){return[this._inputPort,this._outputPort]}}}
10 |
11 | "use strict";if(window["C3_IsSupported"]){const a=false,b="undefined"!=typeof OffscreenCanvas;window["c3_runtimeInterface"]=new RuntimeInterface({useWorker:a&&b,workerMainUrl:"workerMain.js",engineScripts:["scripts/c3runtime.js"],exportType:"scirra-arcade"})}"use strict";
12 | {
13 | const a = class extends DOMHandler {
14 | constructor(a) {
15 | super(a, "stranianelli_htmlelement"),
16 | this.AddRuntimeMessageHandler("prova", (a)=>this._prova(a))
17 | }
18 | _prova(a) {
19 | console.log(a);
20 | }
21 | };
22 | RuntimeInterface.AddDOMHandlerClass(a)
23 | }
24 | "use strict";{const a=class extends DOMHandler{constructor(a){super(a,"browser"),this._exportType="",this.AddRuntimeMessageHandler("get-initial-state",(a)=>this._OnGetInitialState(a)),this.AddRuntimeMessageHandler("ready-for-sw-messages",()=>this._OnReadyForSWMessages()),this.AddRuntimeMessageHandler("alert",(a)=>this._OnAlert(a)),this.AddRuntimeMessageHandler("close",()=>this._OnClose()),this.AddRuntimeMessageHandler("set-focus",(a)=>this._OnSetFocus(a)),this.AddRuntimeMessageHandler("vibrate",(a)=>this._OnVibrate(a)),this.AddRuntimeMessageHandler("lock-orientation",(a)=>this._OnLockOrientation(a)),this.AddRuntimeMessageHandler("unlock-orientation",()=>this._OnUnlockOrientation()),this.AddRuntimeMessageHandler("navigate",(a)=>this._OnNavigate(a)),this.AddRuntimeMessageHandler("request-fullscreen",()=>this._OnRequestFullscreen()),this.AddRuntimeMessageHandler("exit-fullscreen",()=>this._OnExitFullscreen()),window.addEventListener("online",()=>this._OnOnlineStateChanged(!0)),window.addEventListener("offline",()=>this._OnOnlineStateChanged(!1)),document.addEventListener("backbutton",()=>this._OnCordovaBackButton()),"undefined"!=typeof Windows&&Windows["UI"]["Core"]["SystemNavigationManager"]["getForCurrentView"]().addEventListener("backrequested",(a)=>this._OnWin10BackRequested(a))}_OnGetInitialState(a){return this._exportType=a["exportType"],{"location":location.toString(),"isOnline":!!navigator.onLine,"referrer":document.referrer,"title":document.title,"isCookieEnabled":!!navigator.cookieEnabled,"screenWidth":screen.width,"screenHeight":screen.height,"windowOuterWidth":window.outerWidth,"windowOuterHeight":window.outerHeight,"isScirraArcade":"undefined"!=typeof window["is_scirra_arcade"]}}_OnReadyForSWMessages(){window["C3_RegisterSW"]&&window["OfflineClientInfo"]&&window["OfflineClientInfo"]["SetMessageCallback"]((a)=>this.PostToRuntime("sw-message",a["data"]))}_OnOnlineStateChanged(a){this.PostToRuntime("online-state",{"isOnline":a})}_OnCordovaBackButton(){this.PostToRuntime("backbutton")}_OnWin10BackRequested(a){a["handled"]=!0,this.PostToRuntime("backbutton")}GetNWjsWindow(){return"nwjs"===this._exportType?nw["Window"]["get"]():null}_OnAlert(a){alert(a["message"])}_OnClose(){navigator["app"]&&navigator["app"]["exitApp"]?navigator["app"]["exitApp"]():navigator["device"]&&navigator["device"]["exitApp"]?navigator["device"]["exitApp"]():window.close()}_OnSetFocus(a){const b=a["isFocus"];if("nwjs"===this._exportType){const a=this.GetNWjsWindow();b?a["focus"]():a["blur"]()}else b?window.focus():window.blur()}_OnVibrate(a){navigator["vibrate"]&&navigator["vibrate"](a["pattern"])}_OnLockOrientation(a){const b=a["orientation"];if(screen["orientation"]&&screen["orientation"]["lock"])screen["orientation"]["lock"](b).catch((a)=>console.warn("[Construct 3] Failed to lock orientation: ",a));else try{let a=!1;screen["lockOrientation"]?a=screen["lockOrientation"](b):screen["webkitLockOrientation"]?a=screen["webkitLockOrientation"](b):screen["mozLockOrientation"]?a=screen["mozLockOrientation"](b):screen["msLockOrientation"]&&(a=screen["msLockOrientation"](b)),a||console.warn("[Construct 3] Failed to lock orientation")}catch(a){console.warn("[Construct 3] Failed to lock orientation: ",a)}}_OnUnlockOrientation(){try{screen["orientation"]&&screen["orientation"]["unlock"]?screen["orientation"]["unlock"]():screen["unlockOrientation"]?screen["unlockOrientation"]():screen["webkitUnlockOrientation"]?screen["webkitUnlockOrientation"]():screen["mozUnlockOrientation"]?screen["mozUnlockOrientation"]():screen["msUnlockOrientation"]&&screen["msUnlockOrientation"]()}catch(a){}}_OnNavigate(a){const b=a["type"];if("back"===b)navigator["app"]&&navigator["app"]["backHistory"]?navigator["app"]["backHistory"]():window.back();else if("forward"===b)window.forward();else if("home"===b)window.home();else if("reload"===b)location.reload();else if("url"===b){const b=a["url"],c=a["target"],d=a["exportType"];"windows-uwp"===d&&"undefined"!=typeof Windows?Windows["System"]["Launcher"]["launchUriAsync"](new Windows["Foundation"]["Uri"](b)):navigator["app"]&&navigator["app"]["loadUrl"]?navigator["app"]["loadUrl"](b,{"openExternal":!0}):"cordova"===d?window.open(b,"_system"):"preview"===d?window.open(b,"_blank"):!this._isScirraArcade&&(2===c?window.top.location=b:1===c?window.parent.location=b:window.location=b)}else if("new-window"===b){const b=a["url"],c=a["tag"],d=a["exportType"];"windows-uwp"===d&&"undefined"!=typeof Windows?Windows["System"]["Launcher"]["launchUriAsync"](new Windows["Foundation"]["Uri"](b)):navigator["app"]&&navigator["app"]["loadUrl"]?navigator["app"]["loadUrl"](b,{"openExternal":!0}):"cordova"===d?window.open(b,"_system"):window.open(b,c)}}_OnRequestFullscreen(){const a=document.documentElement;a["requestFullscreen"]?a["requestFullscreen"]():a["mozRequestFullScreen"]?a["mozRequestFullScreen"]():a["msRequestFullscreen"]?a["msRequestFullscreen"]():a["webkitRequestFullScreen"]&&("undefined"==typeof Element["ALLOW_KEYBOARD_INPUT"]?a["webkitRequestFullScreen"]():a["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]))}_OnExitFullscreen(){document["exitFullscreen"]?document["exitFullscreen"]():document["mozCancelFullScreen"]?document["mozCancelFullScreen"]():document["msExitFullscreen"]?document["msExitFullscreen"]():document["webkitCancelFullScreen"]&&document["webkitCancelFullScreen"]()}};RuntimeInterface.AddDOMHandlerClass(a)}"use strict";{const a=class extends DOMHandler{constructor(a){super(a,"platform-info"),this.AddRuntimeMessageHandler("get-initial-state",()=>this._OnGetInitialState()),window.addEventListener("resize",()=>this._OnResize())}_OnGetInitialState(){return{"screenWidth":screen.width,"screenHeight":screen.height,"windowOuterWidth":window.outerWidth,"windowOuterHeight":window.outerHeight}}_OnResize(){this.PostToRuntime("window-resize",{"windowOuterWidth":window.outerWidth,"windowOuterHeight":window.outerHeight})}};RuntimeInterface.AddDOMHandlerClass(a)}
--------------------------------------------------------------------------------
/src/data.json:
--------------------------------------------------------------------------------
1 | {"project":["Markdown Editor",null,[[0,true,false,false,false,false,false,false,false,false],[1,false,true,false,false,false,false,false,false,true],[3,true,false,false,false,false,false,false,false,false],[4,true,false,false,false,false,false,false,false,false],[8,true,false,false,false,false,false,false,false,false],[9,true,false,false,false,false,false,false,false,false]],[["InjectCSS",0,false,[],0,0,null,null,[],false,false,307712450042625,[],null,["menucss.css\nmarkstyle.css","https://use.fontawesome.com/releases/v5.5.0/css/all.css\nhttps://fonts.googleapis.com/css?family=Titillium+Web:300","converter.js","",false,false,false,false]],["preview",1,false,[[263867434321866,2],[785042420224724,2]],1,0,null,null,[["Pin",2,368126188696563]],false,false,223545613238781,[],null],["editor",1,false,[[318945251937074,2],[895058529110085,2]],1,0,null,null,[["Pin",2,417003925356019]],false,false,379315665423625,[],null],["Function",3,false,[],0,0,null,null,[],false,false,172763551076055,[],null,[]],["Browser",4,false,[],0,0,null,null,[],false,false,662787060195425,[],null,[]],["CreatedWith",1,false,[[921206691251334,2],[402616821581492,2],[271399795865870,2],[332486191708084,2]],0,0,null,null,[],false,false,809925256147814,[],null],["divEditor",1,false,[],2,0,null,null,[["DragDrop",5,914999733418918],["Tween",6,227761053902080]],false,false,538644577466113,[],null],["titleEditor",1,false,[],0,0,null,null,[],false,false,509901999180459,[],null],["divPreview",1,false,[],2,0,null,null,[["DragDrop",5,214056802439630],["Tween",6,366455074170027]],false,false,958528057323824,[],null],["titlePreview",1,false,[],0,0,null,null,[],false,false,695530591836299,[],null],["resizer",1,false,[[261499545436827,2]],1,0,null,null,[["DragDrop",5,715876396963551]],false,false,162872161460963,[],null],["barraMenu",1,false,[],0,0,null,null,[],false,false,714155732742882,[],null],["background",1,false,[],1,0,null,null,[["Anchor",7,740118925598862]],false,false,900136884544268,[],null],["itemMenu",1,false,[[554792414275197,2],[363427625248036,2],[736879988041575,2]],0,0,null,null,[],false,false,434096926873497,[],null],["PlatformInfo",8,false,[],0,0,null,null,[],false,false,997400297525423,[],null,[]],["Showdown",9,false,[],0,0,null,null,[],false,false,857540965958785,[],null,["github"]]],[],[["Markdown",854,480,false,"Markdown",379442058550755,[["Layer 0",0,206465746893004,true,[239,239,239],false,1,1,1,false,false,1,0,0,[[[0,0,0,856,480,0,0,[1,1,1,0.4],0,0,0,0,[]],12,18,[],[[0,0,1,1,true]],["","","","",true,true,true,true,"div","backgroundpatternd","","",false,false,"",false,false,0,"",false,false,false,"",0,0,0,0,0,"position: fixed;\ntop: 0;\nleft: 0;\nwidth: 100vw;\nheight: 100vh;",[0.7529411764705882,0.7529411764705882,0.7529411764705882],2,[0,0,0],true,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[424,64,0,248,328,0,0,[1,1,1,1],0,0,0,0,[]],8,8,[],[[0,true],[true,true]],["","","","",true,false,true,true,"div","card-preview","","",false,false,"text",true,true,5,"4px",true,false,false,"2px",2,0,0,0,0,"box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);",[1,0.3411764705882353,0.13333333333333333],2,[0.9019607843137255,0.2901960784313726,0.09411764705882353],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[456,64,0,96,24,0,0,[1,1,1,1],0,0,0,0,[]],9,7,[],[],["","[4]","","card-preview",false,false,false,true,"div","title-editor","noTextSelectable","",true,false,"{{title}}",false,false,0,"",true,true,false,"4px",0,0,0,0,0,"text-transform: uppercase;\nheight: 24px;\nwidth: 100%;",[1,0.6274509803921569,0.25882352941176473],2,[0,0,0],false,[0,0,0],true,"lato-bold",14,[0.9411764705882353,0.9411764705882353,0.9411764705882353],true,false,0,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[424,88,0,240,296,0,0,[1,1,1,1],0,0,0,0,[]],1,4,[["Preview"],[""]],[[]],["[\"title\", \"text\"]","","","card-preview",false,false,false,true,"div","preview","","",true,true,"{{text}}",true,true,5,"",true,true,false,"8px",2,0,0,0,3,"position: fixed;\ntop: 25px;\nbottom:2px;\nleft: 0px;\nwidth: 100%;\nresize: none;",[0.9411764705882353,0.9411764705882353,0.9411764705882353],1,[0.9019607843137255,0.2901960784313726,0.09411764705882353],false,[0,0,0],true,"lato-regular",12,[0.12941176470588237,0.12941176470588237,0.12941176470588237],false,false,0,0,0,"",true,"",false,"",false,"",false,"",false,"",true,"",true,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[112,88,0,296,256,0,0,[1,1,1,1],0,0,0,0,[]],6,11,[],[[0,true],[true,true]],["","","","",true,false,true,true,"div","card-editor","","",false,false,"text",true,true,5,"4px",true,false,false,"2px",2,0,0,0,0,"box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);",[0.24705882352941178,0.3176470588235294,0.7098039215686275],2,[0.18823529411764706,0.24705882352941178,0.7411764705882353],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[152,88,0,120,24,0,0,[1,1,1,1],0,0,0,0,[]],7,1,[],[],["","[3]","","card-editor",false,false,false,true,"div","title-editor","noTextSelectable","",true,false,"{{title}}",false,false,0,"",true,true,false,"4px",0,0,0,0,0,"text-transform: uppercase;\nheight: 24px;\nwidth: 100%;",[0,0.5019607843137255,1],2,[0,0,0],false,[0,0,0],true,"lato-bold",14,[0.9411764705882353,0.9411764705882353,0.9411764705882353],true,false,0,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[112,112,0,288,224,0,0,[1,1,1,1],0,0,0,0,[]],2,3,[["Editor"],["# ![Construct 3][c3-logo] Markdown Editor\n\nCreated with [**Construct 3**](https://www.construct.net/), [**HTMLElements**](https://www.construct.net/en/make-games/addons/190/html-element) and [showdownjs](http://demo.showdownjs.com/).\n\n\n[c3-logo]:\nhttps://s1.construct.net/images/v558/r/global/construct-3-logo_v43.png"]],[[]],["[\"title\",\"text\"]","","","card-editor",false,false,false,true,"textarea","editor","","",true,false,"{{text}}",true,true,5,"",true,true,false,"8px",2,4,4,0,4,"position: fixed;\ntop: 25px;\nbottom:2px;\nleft: 0px;\nwidth: 100%;\nresize: none;",[0.9411764705882353,0.9411764705882353,0.9411764705882353],1,[0.18823529411764706,0.24705882352941178,0.7411764705882353],false,[0,0,0],true,"lato-regular",12,[0.12941176470588237,0.12941176470588237,0.12941176470588237],false,false,0,0,0,"",true,"",false,"",false,"",false,"",false,"",true,"",true,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",true,"onInput()",false,"",false,"",false,"",false,""]],[[400,88,0,8,256,0,0,[1,1,1,0],0,0,0,0,[]],10,9,[["editor-dx"]],[[1,true]],["","","","",true,false,true,true,"div","editor-dx","resizer-dx","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,1,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[112,336,0,296,8,0,0,[1,1,1,0],0,0,0,0,[]],10,13,[["editor-bottom"]],[[2,true]],["","","","",true,false,true,true,"div","editor-bottom","resizer-bottom","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,1,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[664,64,0,8,328,0,0,[1,1,1,0],0,0,0,0,[]],10,12,[["preview-dx"]],[[1,true]],["","","","",true,false,true,true,"div","preview-dx","resizer-dx","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,1,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[424,384,0,248,8,0,0,[1,1,1,0],0,0,0,0,[]],10,14,[["preview-bottom"]],[[2,true]],["","","","",true,false,true,true,"div","preview-bottom","resizer-bottom","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,1,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[400,336,0,8,8,0,0,[1,1,1,0],0,0,0,0,[]],10,15,[["editor-bassodestra"]],[[0,true]],["","","","",true,false,true,true,"div","editor-bassodestra","resizer-bassodestra","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,0,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",true,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[664,384,0,8,8,0,0,[1,1,1,0],0,0,0,0,[]],10,16,[["preview-bassodestra"]],[[0,true]],["","","","",true,false,true,true,"div","preview-bassodestra","resizer-bassodestra","",false,false,"text",true,false,0,"",false,false,false,"",0,0,0,0,0,"",[1,0,0],2,[0,0,0],false,[0,0,0],true,"Arial",12,[0,0,0],false,false,1,0,0,"",true,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[16,8,0,72,472,0,0,[1,1,1,1],0,0,0,0,[]],11,17,[],[],["","","","",false,false,false,true,"nav","main-menu","main-menu","",true,true,"",false,false,0,"",false,false,false,"",0,0,0,0,0,"",[0.12941176470588237,0.12941176470588237,0.12941176470588237],2,[0,0,0],true,[0,0,0],true,"lato-bold",12,[0,0,0],false,false,1,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[784,-16,0,128,48,0,0.7853981633974483,[1,1,1,1],0,0,0,0,[]],5,10,[["data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCAyNzkuODUxIDI3OS44NTEiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI3OS44NTEgMjc5Ljg1MTsiIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSI1MTJweCI+CjxnPgoJPHBhdGggc3R5bGU9ImZpbGw6I0UyNTc0QzsiIGQ9Ik0yNTUuMzYxLDQxLjgzOWMtNDEuNDQ0LTQxLjQ1My04Mi41MzgtMjMuMzM5LTExNS40MzMsNi4yMyAgIEMxMDcuMDE2LDE4LjUsNjYuMjY0LDAuMDYyLDI0LjQ4Nyw0MS44MzljLTMyLjU3MSwzMi41NTMtMzIuNzI4LDg0Ljg2NiwwLDExNy4yNDRDMTM5LjU3LDI2Mi42MDUsMTM5LjU0MywyNjIuNDIxLDEzOS41NDMsMjYyLjQyMSAgIHMwLjE2NiwwLjM0MSwxMTUuODA5LTEwMy4zMzlDMjg4LjA5OCwxMjYuNzA0LDI4Ny45MzIsNzQuMzkyLDI1NS4zNjEsNDEuODM5eiIvPgoJPHBhdGggc3R5bGU9ImZpbGw6I0NCNEU0NDsiIGQ9Ik0xMzkuOTIsNDguMDZsLTAuMDc5LTAuMDYxdjIxNC4xNjhjMS44NDYtMS41NTgsMTUuNDE5LTEzLjM0NSwxMTUuNTExLTEwMy4wOTQgICBjMzIuNzM3LTMyLjM2OSwzMi41NzktODQuNjgyLDAtMTE3LjIzNUMyMTMuOTA4LDAuMzg2LDE3Mi44MjMsMTguNSwxMzkuOTIsNDguMDZ6Ii8+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPGc+CjwvZz4KPC9zdmc+Cg=="],["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAArCAYAAADhXXHAAAAFx0lEQVRYw72ZW2gcZRSAJ01r0otaRcQXQZA+CFFfSkUoFEXBVhGxqFDwQSh9UHzQClKhREQfpFas7iWbS7XamJnJ/dKdmd0ma257STbZnd2ozZrszGzUXExmJgkxbZJmPP/W3c0mmdtmtwuH+dn9L9+c//znP+cshu3g4x2RH4zy0kk2IV8Mc6IbZDzMyYvwvH1Hku0xEBcryF9FOen1iCA/gN2tT1BR9kQF+a0IL9IRQVyBxRVTwqMxkhPabwSDwT0FgfR4lN2wwJkwLwmmAdWFY3nptKIoxXkDHUnIR8K8zOYRMktYXg7B8/COIOGNi2DLP4lw4mqhQDMiroCWP0Zrmt92jiuFScjCQ262aennWCxWYhiU45RSlhcZM4v4b0wq14fGlGveX5XW3khSULsTvkO/mYOWnLHYuj4wSSrFYX6u2ShgSw+rVDd3KTaS0ZTqFk+yb8A4eD2YxC5N2BAvfaE30eAfM0p9Z1AXUE3Q2CDMobdOVJj/VP3UTyw+j5y51gRoWx2N13MGTUklzNE1PK5nv2vDcfHYFtCLhHfv8PjsuNbg9v6RHUNulg6YU9utifQWWCvJnKsC23MNxqCDdFdA08BwELeAcuIaPCsD3PQjWaBfVrfca8WZudTgKx29Sk9EyGw9bJfhxXFq1UpSU0hsBLVqdFxXKJ5eD8UZkQnxqW1t1UYw7203Ae4KJCfRs1ErSS/Ds9JKuI4hc0rN63C07bPi9HM2nK6GNW5q2nBTpxKITf0e5edf0fQA0DmY8zbidO+lOufjei7xm1rXIQD3quzGLLzw+w6HTmBjr6MesxL0ek6gBN1IkuQ9Ri+bS05niQWnW1PjLThzy4pTX9tqO7TDxpj/Pgz5XBvpOp2bRqnQ9x5Pqdlr3NEGpkFQg6DlJnuD65Bm57+CD2GC1wKygnF+NwZarTILCtpYt9QzzxQsaI45S7BE4Cwm+CRM8CtJ4bxLmKodaQrVXSDMIoz3ncQ431gaciMs2NCfpjVLMB/mHVMIHAbQ7ixA3u8BqcvAEsxSDvb6Qv7yJPAAvP8ywNzeABnDEv7X/tf0+TSsGcedkm8J+kheNZqtTRYTg/enf98IC+7DtGbtBP1iHpO73VgcTjzvX80A+wQ4YKcwlDVshIUDNmHeZumP8m6zif4yAKM3adkPz4YMLEn1mb8MmP6CuS3OdxxkRMUbUI5cLoVap+/oThJR7Q5gGpzvXdDsTLafJV3vmIH8ob1H6YaIjOWkkXB4cr/ptH56+kCEk6OoSBJOzJVpa9lzECAvAOwyXBDtmLWOfhS0qxsboFiXGRjNinVZQepAyaVhs0ys72WTlZx0dWYVyk/28OTiw9o3GmS7qd0A9+XXAkWZ6nB8bvtInhMHon8vPKEHGh6bKwvF5SGVjEBGNQOU/uu+MQCdUQOtaHArQ+OzeqnzSliQrrLc/PEQJx1MzYuKcJGJ+ROoFoC0qDXH0Ng/SlVjZ9xCUG9q2rSjLbjPhjMzasCEe8Bwzg9R/jrUwxag3LSA2kbHoUA/E8xTfXatiwdCxbNaptDWFy1YFQaZ2eb10DmCGOQqOlPbBsbg7Ec1gWHSuwGaHYcw1PbmQLqPwvW7pjUYB5PQt2F9QTa6cevVks8KgnpW3RwI5rwRN6aWsuuXN6Xk2CpIEPWDfOacpmcoLy/fBeZQZ+SCuNz6i3LN95syMDqlCxmAPqhQVwNjjF1A9E+Gyp8oCYRsoM3MzYYgkNdAxTdUtECC2ui7GijKmUub6CbdTDdLwwiYYK4UqgqjXoNgahwOR07/NRRBJvEBpD63Cg6KMzdR7WDHUZu9kX4aagQDhQK1ELTvO8L1ZN7CzHIoMtgI19vgrGN5g8TpG6CEU+hQFyQ2hsNXDIHPq7BYM9zjyzmUm/5FlRyoi71crlfZzufHQnoOWHDXCbhIPkdlIQtJReEFpqG9dEegTVBROKgtdtL1WQXhfunCj8z+XNf7D2pl6JTR7LwbAAAAAElFTkSuQmCC"],["data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTIwMCIKICAgaGVpZ2h0PSIxMjAwIgogICB2aWV3Qm94PSIwIDAgMzE3LjUgMzE3LjUwMDAxIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmc4IgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjMgKDI0MDU1NDYsIDIwMTgtMDMtMTEpIgogICBzb2RpcG9kaTpkb2NuYW1lPSJpY29uLnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczIiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjAuMzUiCiAgICAgaW5rc2NhcGU6Y3g9IjQ3Ljk5ODA3MSIKICAgICBpbmtzY2FwZTpjeT0iMzA2LjI5MDM0IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIHVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpzbmFwLWdsb2JhbD0iZmFsc2UiCiAgICAgZml0LW1hcmdpbi10b3A9IjAiCiAgICAgZml0LW1hcmdpbi1sZWZ0PSIwIgogICAgIGZpdC1tYXJnaW4tcmlnaHQ9IjAiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTUiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxpdmVsbG8gMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjguMDc4NzksMzIuMzU0Mzg3KSI+CiAgICA8ZwogICAgICAgaWQ9ImxvZ28iCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjY1MjE3NDkzLDAsMCwwLjY1MjE3NDkzLC04NTMuMzExNTQsLTIxMS43Mjc1MikiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0Njg4IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDY5MCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ2OTIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0Njk0IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDY5NiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ2OTgiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0NzAwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDcwMiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ3MDQiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0NzA2IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDcwOCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ3MTAiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9Imc0NzEyIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoOC41NTI4Nzc3LDAsMCw4LjU1Mjg3NzcsLTUyMC4xNTA1Nyw0Ni4xNzAyNjkpIiAvPgogICAgPGcKICAgICAgIGlkPSJnNDcxNCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDguNTUyODc3NywwLDAsOC41NTI4Nzc3LC01MjAuMTUwNTcsNDYuMTcwMjY5KSIgLz4KICAgIDxnCiAgICAgICBpZD0iZzQ3MTYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCg4LjU1Mjg3NzcsMCwwLDguNTUyODc3NywtNTIwLjE1MDU3LDQ2LjE3MDI2OSkiIC8+CiAgICA8ZwogICAgICAgaWQ9ImczOTYzIgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzU1LjI5NzYyLC05LjA3MTQyODcpIj4KICAgICAgPGcKICAgICAgICAgc3R5bGU9ImZpbGw6IzBmNzY4YztmaWxsLW9wYWNpdHk6MSIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSIKICAgICAgICAgaWQ9ImczODM4Ij4KCTxwYXRoCiAgIGlkPSJwYXRoMzgzMiIKICAgZD0ibSA2MC43NjEsMTM5Ljg4MyBjIC03LjgxLDAgLTE0LjE0NCwtNi4zMzQgLTE0LjE0NCwtMTQuMTQ0IFYgNjAuNzYxIGMgMCwtNy44MSA2LjMzNCwtMTQuMTQ0IDE0LjE0NCwtMTQuMTQ0IGggNjQuOTc5IGMgNy44MSwwIDE0LjE0NCw2LjMzNCAxNC4xNDQsMTQuMTQ0IDAsNy44MSAtNi4zMzQsMTQuMTQ0IC0xNC4xNDQsMTQuMTQ0IEggNzQuOTA1IHYgNTAuODM1IGMgMCw3LjgxMSAtNi4zMzQsMTQuMTQzIC0xNC4xNDQsMTQuMTQzIHoiCiAgIHN0eWxlPSJmaWxsOiMwZjc2OGM7ZmlsbC1vcGFjaXR5OjEiCiAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CgoJPHBhdGgKICAgaWQ9InBhdGgzODM0IgogICBkPSJNIDQ1MS4yMzksNDY1LjM4MyBIIDM4Ni4yNiBjIC03LjgxLDAgLTE0LjE0NCwtNi4zMzQgLTE0LjE0NCwtMTQuMTQ0IDAsLTcuODEgNi4zMzQsLTE0LjE0NCAxNC4xNDQsLTE0LjE0NCBoIDUwLjgzNSBWIDM4Ni4yNiBjIDAsLTcuODEgNi4zMzQsLTE0LjE0NCAxNC4xNDQsLTE0LjE0NCA3LjgxLDAgMTQuMTQ0LDYuMzM0IDE0LjE0NCwxNC4xNDQgdiA2NC45NzkgYyAwLDcuODExIC02LjMzMywxNC4xNDQgLTE0LjE0NCwxNC4xNDQgeiIKICAgc3R5bGU9ImZpbGw6IzBmNzY4YztmaWxsLW9wYWNpdHk6MSIKICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KCgk8cGF0aAogICBpZD0icGF0aDM4MzYiCiAgIGQ9Ik0gNDk3Ljg1Niw1MTIgSCAxNC4xNDQgQyA2LjMzNCw1MTIgMCw1MDUuNjY3IDAsNDk3Ljg1NiBWIDE0LjE0NCBDIDAsNi4zMzQgNi4zMzQsMCAxNC4xNDQsMCBIIDQ5Ny44NTcgQyA1MDUuNjY3LDAgNTEyLDYuMzM0IDUxMiwxNC4xNDQgViA0OTcuODU3IEMgNTEyLDUwNS42NjcgNTA1LjY2Nyw1MTIgNDk3Ljg1Niw1MTIgWiBNIDI4LjI4Nyw0ODMuNzEzIEggNDgzLjcxMiBWIDI4LjI4NyBIIDI4LjI4NyBaIgogICBzdHlsZT0iZmlsbDojMGY3NjhjO2ZpbGwtb3BhY2l0eToxIgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgoKPC9nPgogICAgICA8cGF0aAogICAgICAgICBpZD0icGF0aDM4NDAiCiAgICAgICAgIGQ9Im0gLTE1Mi45OTM1NywxMDAuMzgzOTEgNC4zMDc5NiwtNDguMjM5NTMyIGMgMC4xNDIsLTEuNTc3NTc5IC0xLjAzOTk0LC0yLjg2ODY2MyAtMi42MjQzNCwtMi44Njg2NjMgSCAtMjk3Ljk0NDEgYyAtMS41ODM3OCwwIC0yLjc2NDQ5LDEuMjkxMDg0IC0yLjYyNDM0LDIuODY4NjYzIGwgMTMuMzU2NywxNDkuODE5NjkyIGMgMC4xNDAxNSwxLjU3NzU4IDEuNTA0NDEsMy4yMTU5MyAzLjAzMTE0LDMuNjQwMDkgbCA1Ni42Nzk5NSwxNS43MzczNCBjIDEuNTI2NzMsMC40MjM1NCA0LjAyNTE4LDAuNDIzNTQgNS41NTE5MSw2LjJlLTQgbCA1Ni44NTE3MiwtMTUuNzYzMzggYyAxLjUyNjczLC0wLjQyMzU0IDIuODkyODUsLTIuMDYxMjcgMy4wMzMsLTMuNjM4ODUgbCA0LjQ2OTgsLTUwLjA0MTYiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNjZWU4ZmE7c3Ryb2tlLXdpZHRoOjAuNjIwMTE3MTkiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICAgIDxnCiAgICAgICAgIHN0eWxlPSJmaWxsOiMwZjc2OGM7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiCiAgICAgICAgIGlkPSJnMzg0NiI+Cgk8cGF0aAogICBpZD0icGF0aDM4NDIiCiAgIGQ9Im0gMjU1Ljg0NCw0MDkuMTM4IGMgLTIuODk3LDAgLTUuNzkzLC0wLjM0NCAtOC4yNjQsLTEuMDMxIGwgLTkxLjQsLTI1LjM3NiBjIC04LjE5MSwtMi4yNzQgLTE0LjQzOCwtOS43NzYgLTE1LjE5MiwtMTguMjQ0IEwgMTE5LjQ0NywxMjIuODkgYyAtMC40NTgsLTUuMTU4IDEuMjY0LC0xMC4yODcgNC43MjcsLTE0LjA3MiAzLjQ2MiwtMy43ODUgOC40MTcsLTUuOTU0IDEzLjU5MywtNS45NTQgaCAyMzYuNDY1IGMgNS4xNzgsMCAxMC4xMzQsMi4xNzEgMTMuNTk4LDUuOTU5IDMuNDYxLDMuNzg2IDUuMTgyLDguOTE2IDQuNzIxLDE0LjA3MyBsIC02Ljk0OSw3Ny43ODkgYyAtMC42OTQsNy43ODIgLTcuNTgxLDEzLjUzMyAtMTUuMzQ2LDEyLjgyOCAtNy43OCwtMC42OTQgLTEzLjUyNiwtNy41NjUgLTEyLjgyOCwtMTUuMzQ2IGwgNS45ODYsLTY3LjAxNyBIIDE0OC41ODUgbCAyMC4xMjQsMjI1LjcgODYuMjY1LDIzLjk1NCBjIDAuNDQ4LDAuMDYyIDEuMywwLjA1OSAxLjc0NSwwIGwgODYuNTQyLC0yMy45OTYgNi43NDksLTc1LjU3IGMgMC42OTQsLTcuNzgyIDcuNTk4LC0xMy41MjMgMTUuMzQ2LC0xMi44MjggNy43OCwwLjY5NCAxMy41MjYsNy41NjUgMTIuODI4LDE1LjM0NiBsIC03LjIwOCw4MC42OTcgYyAtMC43NTgsOC40NjUgLTcuMDA1LDE1Ljk2NCAtMTUuMTkyLDE4LjIzOCBsIC05MS42ODYsMjUuNDIzIGMgLTIuNDcsMC42ODEgLTUuMzYxLDEuMDI0IC04LjI1NCwxLjAyNCB6IG0gLTAuNzMxLC0yOC4yOTUgMC4wMzcsMC4wMSBjIC0wLjAxMSwtMC4wMDQgLTAuMDI0LC0wLjAwNyAtMC4wMzcsLTAuMDEgeiBtIDEuNDYsMC4wMDIgYyAtMC4wMTEsMC4wMDMgLTAuMDIxLDAuMDA2IC0wLjAzLDAuMDA5IHoiCiAgIHN0eWxlPSJmaWxsOiMwZjc2OGM7ZmlsbC1vcGFjaXR5OjEiCiAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CgoJPHBhdGgKICAgaWQ9InBhdGgzODQ0IgogICBkPSJtIDMzMi41OTQsMTcyLjQxNyBjIC0wLjIwNCwyLjI3IC0wLjU1Niw2LjIxIC0wLjc4Miw4Ljc1NSBsIC0wLjU2Nyw2LjMzOSBjIC0wLjIyOSwyLjU0NCAtMC41NTMsNi4xODIgLTAuNzI2LDguMDgzIC0wLjE3MSwxLjkwMiAtMC4zMzQsMy40NiAtMC4zNjMsMy40NiAtMC4wMjgsMCAtMi4xNDMsMCAtNC42OTksMCBoIC02NC44MSBjIC0yLjU1NCwwIC00LjY2NiwwIC00LjY5NCwwIC0wLjAyOCwwIC0yLjE0MSwwIC00LjY5NiwwIGggLTM0LjEzMyBjIC0yLjU1NCwwIC00LjQ1OCwyLjA4MiAtNC4yMzIsNC42MjYgbCAxLjk5MSwyMi4yNTUgYyAwLjIyNiwyLjU0NCAyLjUwMyw0LjYyNiA1LjA1OSw0LjYyNiBoIDMxLjMxNyBjIDIuNTU0LDAgNC42NjksMCA0LjY5NiwwIDAuMDI3LDAgMi4xNCwwIDQuNjk0LDAgaCA1My44MjkgYyAyLjU1NCwwIDYuNTA5LDAgOC43ODYsMCAyLjI3NiwwIDMuOTcsMS44NTcgMy43NjQsNC4xMjcgLTAuMjA2LDIuMjcgLTAuNTYyLDYuMjEgLTAuNzg4LDguNzU1IGwgLTYuNDAzLDcxLjc0OSBjIC0wLjIyOSwyLjU0NCAtMC41MTgsNS43OTYgLTAuNjQyLDcuMjI1IC0wLjEyNywxLjQyOCAtMi4yNDUsMy4xNTUgLTQuNzA3LDMuODM5IGwgLTU0LjAwOSwxNC45NzUgYyAtMi40NjIsMC42ODIgLTQuNTA4LDEuMjQ3IC00LjU0NiwxLjI1NSAtMC4wMzgsMC4wMDggLTIuMDgzLC0wLjU0NSAtNC41NDYsLTEuMjI4IEwgMTk3LjMyLDMyNi4yNTYgYyAtMi40NjIsLTAuNjgzIC00LjY2MiwtMy4zMjQgLTQuODg4LC01Ljg2OCBsIC0zLjQ4MSwtMzkuMDYyIGMgLTAuMjI2LC0yLjU0NCAxLjY3OSwtNC42MjYgNC4yMzMsLTQuNjI2IGggNC45MzUgYyAyLjU1NCwwIDYuNzM1LDAgOS4yOTEsMCBoIDcuMzU4IGMgMi41NTQsMCA0LjgzLDIuMDgyIDUuMDU5LDQuNjI2IGwgMS4zNjUsMTUuMjkxIGMgMC4yMjYsMi41NDQgMi40Myw1LjE3MSA0Ljg5Nyw1LjgzNyBsIDI1LjI5LDYuODMgYyAyLjQ2NSwwLjY2NiA0LjQ5MywxLjIxMiA0LjUwNSwxLjIxMiAwLjAxMSwwIDIuMDM4LC0wLjU0NiA0LjUwNSwtMS4yMTIgbCAyNS4zMzYsLTYuODQ2IGMgMi40NjUsLTAuNjY2IDQuNjcsLTMuMjk0IDQuODk5LC01LjgzNyBsIDIuNzQ3LC0zMC42MzcgYyAwLjIyOSwtMi41NDQgLTEuNjc1LC00LjYyNiAtNC4yMywtNC42MjYgSCAyNjAuNjUgYyAtMi41NTQsMCAtNC42NjYsMCAtNC42OTQsMCAtMC4wMjgsMCAtMi4xNDEsMCAtNC42OTYsMCBoIC01OS40NSBjIC0yLjU1NCwwIC00LjgzLC0yLjA4MyAtNS4wNTYsLTQuNjI2IGwgLTYuNzQxLC03NS41MzggYyAtMC4yMjYsLTIuNTQ0IC0wLjU3OCwtNi40ODMgLTAuNzgyLC04Ljc1NSAtMC4yMDIsLTIuMjcgMS43MjMsLTQuMTI3IDQuMjc3LC00LjEyNyBoIDY3Ljc1MiBjIDIuNTU0LDAgNC42NjksMCA0LjY5NiwwIDAuMDI3LDAgMi4xNCwwIDQuNjk0LDAgaCA2Ny42NyBjIDIuNTUxLC0wLjAwMiA0LjQ3NiwxLjg1NSA0LjI3NCw0LjEyNSB6IgogICBzdHlsZT0iZmlsbDojMGY3NjhjO2ZpbGwtb3BhY2l0eToxIgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgoKPC9nPgogICAgPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg0OCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODUwIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NTIiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg1NCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODU2IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NTgiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg2MCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODYyIgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NjQiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg2NiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODY4IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NzAiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogICAgPGcKICAgICAgIGlkPSJnMzg3MiIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNjIwMTE3MiwwLDAsMC42MjAxMTcyLC0zODMuMzc2NDEsLTIzLjI4Mjk1OCkiPgo8L2c+CiAgICA8ZwogICAgICAgaWQ9ImczODc0IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC42MjAxMTcyLDAsMCwwLjYyMDExNzIsLTM4My4zNzY0MSwtMjMuMjgyOTU4KSI+CjwvZz4KICAgIDxnCiAgICAgICBpZD0iZzM4NzYiCiAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjYyMDExNzIsMCwwLDAuNjIwMTE3MiwtMzgzLjM3NjQxLC0yMy4yODI5NTgpIj4KPC9nPgogIDwvZz4KPC9zdmc+Cg=="],["height:32px; width:32px; float:left; margin:2px;"]],[],["[\"love\",\"c3\",\"plugin\", \"imgS\"]","","","",false,false,true,true,"div","tag-made-with-love-and-c3","noTextSelectable","",true,true,"MADE WITH
\n
\n\n",true,true,5,"4px",true,true,false,"",0,0,0,0,0,"position: fixed;\ntop: -50px;\nright: -110px;\nwidth: 200px;\nheigt: 50px;\npadding: 2px;\nbox-shadow: 2px 2px 2px 1px rgba(128, 128, 128, .4);\nalign:center;\nz-index: 100;",[1,1,0.5019607843137255],1,[0.5019607843137255,0.5019607843137255,0.5019607843137255],true,[0,0,0],true,"Arial",11,[0.5019607843137255,0.5019607843137255,0.5019607843137255],true,false,1,0,0,"",true,"goToHome()",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[24,40,0,56,40,0,0,[1,1,1,1],0,0,0,0,[]],13,19,[["GitHub"],["fab fa-github fa-2x"],["goToHome()"]],[],["[\"text\",\"icon\",\"function\"]","","","main-menu",false,false,false,true,"li","","","",true,true,"
\n\n{{text}}\n",false,false,0,"",false,false,false,"",0,0,0,0,0,"",[0.25098039215686274,0.5019607843137255,0.5019607843137255],2,[0,0,0],true,[0,0,0],true,"Arial",12,[1,1,1],false,false,0,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[24,88,0,56,40,0,0,[1,1,1,1],0,0,0,0,[]],13,22,[["New"],["fas fa-file fa-2x"],["newFile()"]],[],["[\"text\",\"icon\",\"function\"]","","","main-menu",false,false,false,true,"li","","has-subnav","",true,true,"\n\n{{text}}\n",false,false,0,"",false,false,false,"",0,0,0,0,0,"",[0.25098039215686274,0.5019607843137255,0.5019607843137255],2,[0,0,0],true,[0,0,0],true,"Arial",12,[1,1,1],false,false,0,0,0,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,"",false,""]],[[24,136,0,56,40,0,0,[1,1,1,1],0,0,0,0,[]],13,20,[["Open"],["fas fa-folder-open fa-2x"],[""]],[],["[\"text\",\"icon\",\"function\"]","","","main-menu",false,false,false,true,"li","","has-subnav","",true,true,"\n\n\n\n\n