diff --git a/src/dev-center/index.html b/src/dev-center/index.html
index 9ff66be3f..5c0a8219b 100644
--- a/src/dev-center/index.html
+++ b/src/dev-center/index.html
@@ -19,9 +19,6 @@
-
-
-
Drop your app folder and files here to deploy.
HTML, JS, CSS, ...
`; const index_missing_error = `Please upload an 'index.html' file or if you're uploading a directory, make sure it contains an 'index.html' file at its root.`; -const lock_svg = - ''; - +const lock_svg = ''; // authUsername (async () => { - let user = await puter.auth.getUser(); + let user = await puter.auth.getUser(); - if (user?.username) { - authUsername = user.username; - } -})(); + if (user?.username) { + authUsername = user.username; + } +})() // source_path -if (URLParams.has("source_path")) { - source_path = URLParams.get("source_path"); +if (URLParams.has('source_path')) { + source_path = URLParams.get('source_path'); } else { - source_path = null; + source_path = null; } // domain and APIOrigin -if (URLParams.has("puter.domain")) { - domain = URLParams.get("puter.domain"); +if (URLParams.has('puter.domain')) { + domain = URLParams.get('puter.domain') } // static hosting domain -let static_hosting_domain = "puter.site"; -if (domain === "puter.localhost") { - static_hosting_domain = "site.puter.localhost"; +let static_hosting_domain = 'puter.site'; +if(domain === 'puter.localhost'){ + static_hosting_domain = 'site.puter.localhost'; } // add port to static_hosting_domain if provided -if (URLParams.has("puter.port") && URLParams.get("puter.port")) { - static_hosting_domain = - static_hosting_domain + `:` + html_encode(URLParams.get("puter.port")); +if (URLParams.has('puter.port') && URLParams.get('puter.port')) { + static_hosting_domain = static_hosting_domain + `:` + html_encode(URLParams.get('puter.port')); } // protocol -let protocol = "https"; -if ( - URLParams.has("puter.protocol") && - URLParams.get("puter.protocol") === "http" -) - protocol = "http"; +let protocol = 'https'; +if (URLParams.has('puter.protocol') && URLParams.get('puter.protocol') === 'http') + protocol = 'http'; // port -let port = ""; -if (URLParams.has("puter.port") && URLParams.get("puter.port")) { - port = html_encode(URLParams.get("puter.port")); +let port = ''; +if (URLParams.has('puter.port') && URLParams.get('puter.port')) { + port = html_encode(URLParams.get('puter.port')); } -$(document).ready(function() { - // initialize assets directory - initializeAssetsDirectory(); +$(document).ready(function () { + // initialize assets directory + initializeAssetsDirectory(); - $("#loading").show(); + $('#loading').show(); - setTimeout(async function() { - puter.ui.onLaunchedWithItems(async function(items) { - source_path = items[0].path; - // if source_path is provided, this means that the user is creating a new app/updating an existing app - // by deploying an existing Puter folder. So we create the app and deploy it. - if (source_path) { - // todo if there are no apps, go straight to creating a new app - $(".insta-deploy-modal").get(0).showModal(); - // set item name - $(".insta-deploy-item-name").html(html_encode(items[0].name)); - } - }); + setTimeout(async function () { + puter.ui.onLaunchedWithItems(async function (items) { + source_path = items[0].path; + // if source_path is provided, this means that the user is creating a new app/updating an existing app + // by deploying an existing Puter folder. So we create the app and deploy it. + if (source_path) { + // todo if there are no apps, go straight to creating a new app + $('.insta-deploy-modal').get(0).showModal(); + // set item name + $('.insta-deploy-item-name').html(html_encode(items[0].name)); + } + }) - // Get dev profile. This is only for puter.com for now as we don't have dev profiles in self-hosted Puter - if (domain === "puter.com") { - puter.apps.getDeveloperProfile(async function(dev_profile) { - developer = dev_profile; - if ( - dev_profile.approved_for_incentive_program && - !dev_profile.joined_incentive_program - ) { - $("#join-incentive-program").show(); + // Get dev profile. This is only for puter.com for now as we don't have dev profiles in self-hosted Puter + if(domain === 'puter.com'){ + puter.apps.getDeveloperProfile(async function (dev_profile) { + developer = dev_profile; + if (dev_profile.approved_for_incentive_program && !dev_profile.joined_incentive_program) { + $('#join-incentive-program').show(); + } + + // show earn money c2a only if dev is not approved for incentive program or has already joined + if (!dev_profile.approved_for_incentive_program || dev_profile.joined_incentive_program) { + puter.kv.get('earn-money-c2a-closed').then((value) => { + if (value?.result || value === true || value === "true") + return; + + $('#earn-money').get(0).showModal(); + }); + } + + // show payout method tab if dev has joined incentive program + if (dev_profile.joined_incentive_program) { + $('.tab-btn[data-tab="payout-method"]').show(); + $('#payout-method-email').html(dev_profile.paypal); + } + }) } + // Get apps + puter.apps.list().then((resp) => { + apps = resp; - // show earn money c2a only if dev is not approved for incentive program or has already joined - if ( - !dev_profile.approved_for_incentive_program || - dev_profile.joined_incentive_program - ) { - puter.kv.get("earn-money-c2a-closed").then((value) => { - if (value?.result || value === true || value === "true") return; + // hide loading + $('#loading').hide(); - $("#earn-money").get(0).showModal(); - }); - } - - // show payout method tab if dev has joined incentive program - if (dev_profile.joined_incentive_program) { - $('.tab-btn[data-tab="payout-method"]').show(); - $("#payout-method-email").html(dev_profile.paypal); - } - }); - } - // Get apps - puter.apps.list().then((resp) => { - apps = resp; - - // hide loading - $("#loading").hide(); - - // set apps - if (apps.length > 0) { - if (activeTab === "apps") { - $("#no-apps-notice").hide(); - $("#app-list").show(); - } - $(".app-card").remove(); - apps.forEach((app) => { - $("#app-list-table > tbody").append(generate_app_card(app)); - }); - count_apps(); - sort_apps(); - } else { - $("#no-apps-notice").show(); - } - }); - }, 1000); + // set apps + if (apps.length > 0) { + if (activeTab === 'apps') { + $('#no-apps-notice').hide(); + $('#app-list').show(); + } + $('.app-card').remove(); + apps.forEach(app => { + $('#app-list-table > tbody').append(generate_app_card(app)); + }); + count_apps(); + sort_apps(); + } else { + $('#no-apps-notice').show(); + } + }) + }, 1000); }); /** -* Refreshes the list of apps in the UI. -* -* @param {boolean} [show_loading=false] - Whether to show a loading indicator while refreshing. -* -*/ + * Refreshes the list of apps in the UI. + * + * @param {boolean} [show_loading=false] - Whether to show a loading indicator while refreshing. + * + */ function refresh_app_list(show_loading = false) { - if (show_loading) $("#loading").show(); - // get apps - setTimeout( - function() { - // uncheck the select all checkbox - $(".select-all-apps").prop("checked", false); + if (show_loading) + $('#loading').show(); + // get apps + setTimeout(function () { + // uncheck the select all checkbox + $('.select-all-apps').prop('checked', false); - puter.apps.list().then((apps_res) => { - $("#loading").hide(); - apps = apps_res; - if (apps.length > 0) { - if (activeTab === "apps") { - $("#no-apps-notice").hide(); - $("#app-list").show(); - } - $(".app-card").remove(); - apps.forEach((app) => { - $("#app-list-table > tbody").append(generate_app_card(app)); - }); - count_apps(); - sort_apps(); - } else { - $("#no-apps-notice").show(); - $("#app-list").hide(); - } - }); - }, - show_loading ? 1000 : 0 - ); + puter.apps.list().then((apps_res) => { + $('#loading').hide(); + apps = apps_res; + if (apps.length > 0) { + if (activeTab === 'apps') { + $('#no-apps-notice').hide(); + $('#app-list').show(); + } + $('.app-card').remove(); + apps.forEach(app => { + $('#app-list-table > tbody').append(generate_app_card(app)); + }); + count_apps(); + sort_apps(); + } else { + $('#no-apps-notice').show(); + $('#app-list').hide() + } + }) + }, show_loading ? 1000 : 0); } -$(document).on("click", ".tab-btn", function(e) { - $("section:not(.sidebar)").hide(); - $(".tab-btn").removeClass("active"); - $(this).addClass("active"); - $('section[data-tab="' + $(this).attr("data-tab") + '"]').show(); +$(document).on('click', '.tab-btn', function (e) { + $('section:not(.sidebar)').hide(); + $('.tab-btn').removeClass('active'); + $(this).addClass('active'); + $('section[data-tab="' + $(this).attr('data-tab') + '"]').show(); - // --------------------------------------------------------------- - // Apps tab - // --------------------------------------------------------------- - if ($(this).attr("data-tab") === "apps") { - refresh_app_list(); - activeTab = "apps"; - } - // --------------------------------------------------------------- - // Payout Method tab - // --------------------------------------------------------------- - else if ($(this).attr("data-tab") === "payout-method") { - activeTab = "payout-method"; - $("#loading").show(); - setTimeout(function() { - puter.apps.getDeveloperProfile(function(dev_profile) { - // show payout method tab if dev has joined incentive program - if (dev_profile.joined_incentive_program) { - $("#payout-method-email").html(dev_profile.paypal); - } - $("#loading").hide(); - if (activeTab === "payout-method") $("#tab-payout-method").show(); - }); - }, 1000); - } -}); + // --------------------------------------------------------------- + // Apps tab + // --------------------------------------------------------------- + if ($(this).attr('data-tab') === 'apps') { + refresh_app_list(); + activeTab = 'apps'; + } + // --------------------------------------------------------------- + // Payout Method tab + // --------------------------------------------------------------- + else if ($(this).attr('data-tab') === 'payout-method') { + activeTab = 'payout-method'; + $('#loading').show(); + setTimeout(function () { + puter.apps.getDeveloperProfile(function (dev_profile) { + // show payout method tab if dev has joined incentive program + if (dev_profile.joined_incentive_program) { + $('#payout-method-email').html(dev_profile.paypal); + } + $('#loading').hide(); + if (activeTab === 'payout-method') + $('#tab-payout-method').show(); + }) + }, 1000); + } +}) -$(document).on("click", ".create-an-app-btn", async function(e) { - let title = await puter.ui.prompt( - "Please enter a title for your app:", - "My Awesome App" - ); +$(document).on('click', '.create-an-app-btn', async function (e) { + let title = await puter.ui.prompt('Please enter a title for your app:', 'My Awesome App'); - if (title.length > 60) { - puter.ui.alert(`Title cannot be longer than 60.`, [ - { - label: "Ok", - }, - ]); - // todo go back to create an app prompt and prefill the title input with the title the user entered - return; - } else if (title) { - create_app(title); - } -}); + if (title.length > 60) { + puter.ui.alert(`Title cannot be longer than 60.`, [ + { + label: 'Ok', + }, + ]); + // todo go back to create an app prompt and prefill the title input with the title the user entered + return; + } + else if (title) { + create_app(title); + } +}) async function create_app(title, source_path = null, items = null) { - // name - let name = slugify(title, { - lower: true, - strict: true, - }); + // name + let name = slugify(title, { + lower: true, + strict: true, + }); - // icon - let icon = await getBase64ImageFromUrl("./img/app.svg"); + // icon + let icon = await getBase64ImageFromUrl('./img/app.svg'); - // open the 'Creting new app...' modal - let start_ts = Date.now(); - $(".new-app-modal").get(0).showModal(); + // open the 'Creting new app...' modal + let start_ts = Date.now(); + $('.new-app-modal').get(0).showModal(); - //---------------------------------------------------- - // Create app - //---------------------------------------------------- - puter.apps - .create({ - title: title, - name: name, - indexURL: "https://dev-center.puter.com/coming-soon.html", - icon: icon, - description: " ", - maximizeOnStart: false, - background: false, - dedupeName: true, - metadata: { - window_resizable: true, - credentialless: true, - }, - }) - .then(async (app) => { - let app_dir; - // ---------------------------------------------------- - // Create app directory in AppData - // ---------------------------------------------------- - app_dir = await puter.fs.mkdir( - `/${authUsername}/AppData/${dev_center_uid}/${app.uid}`, - { overwrite: true, recursive: true, rename: false } - ); - // ---------------------------------------------------- - // Create a router for the app with a fresh hostname - // ---------------------------------------------------- - let subdomain = name + "-" + Math.random().toString(36).substring(2); - await puter.hosting.create(subdomain, app_dir.path); - - // ---------------------------------------------------- - // Update the app with the new hostname - // ---------------------------------------------------- - puter.apps - .update(app.name, { - title: title, - indexURL: source_path - ? protocol + `://${subdomain}.` + static_hosting_domain - : "https://dev-center.puter.com/coming-soon.html", - icon: icon, - description: " ", - maximizeOnStart: false, - background: false, + //---------------------------------------------------- + // Create app + //---------------------------------------------------- + puter.apps.create({ + title: title, + name: name, + indexURL: 'https://dev-center.puter.com/coming-soon.html', + icon: icon, + description: ' ', + maximizeOnStart: false, + background: false, + dedupeName: true, + metadata: { + window_resizable: true, + credentialless: true, + }, + }) .then(async (app) => { - // refresh app list - puter.apps.list().then(async (resp) => { - apps = resp; - // Close the 'Creting new app...' modal - // but make sure it was shown for at least 2 seconds - setTimeout( - () => { - // open edit app section - edit_app_section(app.name); - // set drop area if source_path was provided or items were dropped - if (source_path || items) { - $(".drop-area").removeClass("drop-area-hover"); - $(".drop-area").addClass("drop-area-ready-to-deploy"); - } - $(".new-app-modal").get(0).close(); - // deploy app if source_path was provided - if (source_path) { - deploy(app, source_path); - } else if (items) { - deploy(app, items); - } - }, - Date.now() - start_ts > 2000 ? 1 : 2000 - (Date.now() - start_ts) + let app_dir; + // ---------------------------------------------------- + // Create app directory in AppData + // ---------------------------------------------------- + app_dir = await puter.fs.mkdir( + `/${authUsername}/AppData/${dev_center_uid}/${app.uid}`, + { overwrite: true, recursive: true, rename: false } ); - }); + // ---------------------------------------------------- + // Create a router for the app with a fresh hostname + // ---------------------------------------------------- + let subdomain = name + '-' + Math.random().toString(36).substring(2) + await puter.hosting.create(subdomain, app_dir.path); + + // ---------------------------------------------------- + // Update the app with the new hostname + // ---------------------------------------------------- + puter.apps.update(app.name, { + title: title, + indexURL: source_path ? protocol + `://${subdomain}.` + static_hosting_domain : 'https://dev-center.puter.com/coming-soon.html', + icon: icon, + description: ' ', + maximizeOnStart: false, + background: false, + }).then(async (app) => { + // refresh app list + puter.apps.list().then(async (resp) => { + apps = resp; + // Close the 'Creting new app...' modal + // but make sure it was shown for at least 2 seconds + setTimeout(() => { + // open edit app section + edit_app_section(app.name); + // set drop area if source_path was provided or items were dropped + if (source_path || items) { + $('.drop-area').removeClass('drop-area-hover'); + $('.drop-area').addClass('drop-area-ready-to-deploy'); + } + $('.new-app-modal').get(0).close(); + // deploy app if source_path was provided + if (source_path) { + deploy(app, source_path); + } else if (items) { + deploy(app, items); + } + }, (Date.now() - start_ts) > 2000 ? 1 : 2000 - (Date.now() - start_ts)); + }) + }).catch(async (err) => { + console.log(err); + }) + // ---------------------------------------------------- + // Create a "shortcut" on the desktop + // ---------------------------------------------------- + puter.fs.upload(new File([], app.title), + `/${authUsername}/Desktop`, + { + name: app.title, + dedupeName: true, + overwrite: false, + appUID: app.uid, + } + ) + }).catch(async (err) => { + $('#create-app-error').show(); + $('#create-app-error').html(err.message); + // scroll to top so that user sees error message + document.body.scrollTop = document.documentElement.scrollTop = 0; }) - .catch(async (err) => { - console.log(err); - }); - // ---------------------------------------------------- - // Create a "shortcut" on the desktop - // ---------------------------------------------------- - puter.fs.upload(new File([], app.title), `/${authUsername}/Desktop`, { - name: app.title, - dedupeName: true, - overwrite: false, - appUID: app.uid, - }); - }) - .catch(async (err) => { - $("#create-app-error").show(); - $("#create-app-error").html(err.message); - // scroll to top so that user sees error message - document.body.scrollTop = document.documentElement.scrollTop = 0; - }); } -$(document).on("click", ".deploy-btn", function(e) { - deploy(currently_editing_app, dropped_items); -}); -$(document).on("click", ".edit-app, .got-to-edit-app", function(e) { - const cur_app_name = $(this).attr("data-app-name"); - edit_app_section(cur_app_name); -}); +$(document).on('click', '.deploy-btn', function (e) { + deploy(currently_editing_app, dropped_items); +}) -$(document).on("click", ".delete-app", async function(e) { - let app_uid = $(this).attr("data-app-uid"); - let app_title = $(this).attr("data-app-title"); - let app_name = $(this).attr("data-app-name"); +$(document).on('click', '.edit-app, .got-to-edit-app', function (e) { + const cur_app_name = $(this).attr('data-app-name') + edit_app_section(cur_app_name); +}) - // get app - const app_data = await puter.apps.get(app_name); +$(document).on('click', '.delete-app', async function (e) { + let app_uid = $(this).attr('data-app-uid'); + let app_title = $(this).attr('data-app-title'); + let app_name = $(this).attr('data-app-name'); - if (app_data.metadata?.locked) { - puter.ui.alert( - `${app_data.title} is locked and cannot be deleted.`, - [ - { - label: "Ok", - }, - ], - { - type: "warning", - } + // get app + const app_data = await puter.apps.get(app_name); + + if(app_data.metadata?.locked){ + puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ + { + label: 'Ok', + }, + ], { + type: 'warning', + }); + return; + } + + // confirm delete + const alert_resp = await puter.ui.alert(`Are you sure you want to premanently delete ${html_encode(app_title)}?`, + [ + { + label: 'Yes, delete permanently', + value: 'delete', + type: 'danger', + }, + { + label: 'Cancel' + }, + ] ); - return; - } - // confirm delete - const alert_resp = await puter.ui.alert( - `Are you sure you want to premanently delete ${html_encode(app_title)}?`, - [ - { - label: "Yes, delete permanently", - value: "delete", - type: "danger", - }, - { - label: "Cancel", - }, - ] - ); + if (alert_resp === 'delete') { + let init_ts = Date.now(); + $('.deleting-app-modal')?.get(0)?.showModal(); + puter.apps.delete(app_name).then(async (app) => { + setTimeout(() => { + $('.deleting-app-modal')?.get(0)?.close(); + $(`.app-card[data-uid="${app_uid}"]`).fadeOut(200, function name(params) { + $(this).remove(); + if ($(`.app-card`).length === 0) { + $('section:not(.sidebar)').hide(); + $('#no-apps-notice').show(); + } else { + $('section:not(.sidebar)').hide(); + $('#app-list').show(); + } + count_apps(); + }); + }, + // make sure the modal was shown for at least 2 seconds + (Date.now() - init_ts) > 2000 ? 1 : 2000 - (Date.now() - init_ts)); - if (alert_resp === "delete") { - let init_ts = Date.now(); - $(".deleting-app-modal")?.get(0)?.showModal(); - puter.apps - .delete(app_name) - .then(async (app) => { - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - $(`.app-card[data-uid="${app_uid}"]`).fadeOut( - 200, - function name(params) { - $(this).remove(); - if ($(`.app-card`).length === 0) { - $("section:not(.sidebar)").hide(); - $("#no-apps-notice").show(); - } else { - $("section:not(.sidebar)").hide(); - $("#app-list").show(); - } - count_apps(); - } - ); - }, - // make sure the modal was shown for at least 2 seconds - Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) - ); + // get app directory + puter.fs.stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + returnSubdomains: true, + }).then(async (stat) => { + // delete subdomain associated with the app dir + puter.hosting.delete(stat.subdomains[0].subdomain) + // delete app directory + puter.fs.delete( + `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + { recursive: true } + ) + }) + }).catch(async (err) => { + setTimeout(() => { - // get app directory - puter.fs - .stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - returnSubdomains: true, - }) - .then(async (stat) => { - // delete subdomain associated with the app dir - puter.hosting.delete(stat.subdomains[0].subdomain); - // delete app directory - puter.fs.delete( - `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - { recursive: true } - ); - }); - }) - .catch(async (err) => { - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - puter.ui.alert(err?.message, [ - { - label: "Ok", - }, - ]); - }, - // make sure the modal was shown for at least 2 seconds - Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) - ); - }); - } -}); + $('.deleting-app-modal')?.get(0)?.close(); + puter.ui.alert(err?.message, [ + { + label: 'Ok', + }, + ]); + }, + // make sure the modal was shown for at least 2 seconds + (Date.now() - init_ts) > 2000 ? 1 : 2000 - (Date.now() - init_ts)); + }) + } +}) // generate app link function applink(app) { - return protocol + `://${domain}${port ? ":" + port : ""}/app/${app.name}`; + return protocol + `://${domain}${ port ? ':' + port : '' }/app/${app.name}`; } /** -* Generates the HTML for the app editing section. -* -* @param {Object} app - The app object containing details of the app to be edited. -* * -* @returns {string} HTML string for the app editing section. -* -* @description -* This function creates the HTML for the app editing interface, including: -* - App icon and title display -* - Options to open, add to desktop, or delete the app -* - Tabs for deployment and settings -* - Form fields for editing various app properties -* - Display of app statistics -* -* The generated HTML includes interactive elements and placeholders for -* dynamic content to be filled or updated by other functions. -* -* @example -* const appEditHTML = generate_edit_app_section(myAppObject); -* $('#edit-app').html(appEditHTML); -*/ + * Generates the HTML for the app editing section. + * + * @param {Object} app - The app object containing details of the app to be edited. + * * + * @returns {string} HTML string for the app editing section. + * + * @description + * This function creates the HTML for the app editing interface, including: + * - App icon and title display + * - Options to open, add to desktop, or delete the app + * - Tabs for deployment and settings + * - Form fields for editing various app properties + * - Display of app statistics + * + * The generated HTML includes interactive elements and placeholders for + * dynamic content to be filled or updated by other functions. + * + * @example + * const appEditHTML = generate_edit_app_section(myAppObject); + * $('#edit-app').html(appEditHTML); + */ function generate_edit_app_section(app) { if(app.result) @@ -591,60 +555,59 @@ function generate_edit_app_section(app) { -A list of file type specifiers. For example if you include .txt your apps could be opened when a user clicks on a TXT file.
A comma-separated list of file type specifiers. For example if you include .txt, your apps could be opened when a user clicks on a TXT file.
When locked, the app cannot be deleted. This is useful to prevent accidental deletion of important apps.
credentialless attribute for the iframe tag.
${items.length} items
Ready to deploy 🚀
Cancel
`; - $(".drop-area").html(drop_area_content); + //----------------------------------------------------------------------------- + // Local items dropped + //----------------------------------------------------------------------------- + if (!e.dataTransfer || !e.dataTransfer.items || e.dataTransfer.items.length === 0) + return; + + // get dropped items + dropped_items = await puter.ui.getEntriesFromDataTransferItems(e.dataTransfer.items); + + // generate a flat array of full paths from the dropped items + let paths = []; + for (let item of dropped_items) { + paths.push('/' + (item.fullPath ?? item.filepath)); + } + + // generate a directory tree from the paths + let tree = generateDirTree(paths); + + dropped_items = setRootDirTree(tree, dropped_items); + + // alert if no index.html in root + if (!hasRootIndexHtml(tree)) { + puter.ui.alert(index_missing_error, [ + { + label: 'Ok', + }, + ]); + $('.drop-area').removeClass('drop-area-ready-to-deploy'); + $('.deploy-btn').addClass('disabled'); + dropped_items = []; + return; + } + + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); + + // generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items + let rootItems = ''; + + if (rootKeys.length === 1) + rootItems = rootKeys[0]; + else if (rootKeys.length === 2) + rootItems = rootKeys[0] + ', ' + rootKeys[1]; + else if (rootKeys.length === 3) + rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and' + rootKeys[1]; + else if (rootKeys.length > 3) + rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and ' + (rootKeys.length - 2) + ' more item' + (rootKeys.length - 2 > 1 ? 's' : ''); + + rootItems = html_encode(rootItems); + $('.drop-area').removeClass('drop-area-hover'); + $('.drop-area').addClass('drop-area-ready-to-deploy'); + drop_area_content = `${rootItems}
Ready to deploy 🚀
Cancel
`; + $('.drop-area').html(drop_area_content); // enable deploy button - $(".deploy-btn").removeClass("disabled"); - } else { - puter.ui.alert( - `You need to have an index.html file in your deployment.`, - [ - { - label: "Ok", - }, - ] - ); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".drop-area").removeClass("drop-area-hover"); - $(".deploy-btn").addClass("disabled"); - dropped_items = []; - } - return; + $('.deploy-btn').removeClass('disabled'); + + return false; } - // ---------------------------------------------------- - // One Puter directory dropped - // ---------------------------------------------------- - else if (items.length === 1 && items[0].isDirectory) { - let children = await puter.fs.readdir(items[0].path); - // check if index.html exists, if found, deploy entire directory - for (let child of children) { - if (child.name === "index.html") { - // deploy(currently_editing_app, items[0].path); - dropped_items = items[0].path; - let rootItems = ""; + }); - if (children.length === 1) rootItems = children[0].name; - else if (children.length === 2) - rootItems = children[0].name + ", " + children[1].name; - else if (children.length === 3) - rootItems = - children[0].name + - ", " + - children[1].name + - ", and" + - children[1].name; - else if (children.length > 3) - rootItems = - children[0].name + - ", " + - children[1].name + - ", and " + - (children.length - 2) + - " more item" + - (children.length - 2 > 1 ? "s" : ""); - - $(".drop-area").removeClass("drop-area-hover"); - $(".drop-area").addClass("drop-area-ready-to-deploy"); - drop_area_content = `${rootItems}
Ready to deploy 🚀
Cancel
`; - $(".drop-area").html(drop_area_content); - - // enable deploy button - $(".deploy-btn").removeClass("disabled"); - return; - } - } - - // no index.html in directory - puter.ui.alert(index_missing_error, [ - { - label: "Ok", - }, - ]); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".deploy-btn").addClass("disabled"); - dropped_items = []; - } - - return false; - } - - //----------------------------------------------------------------------------- - // Local items dropped - //----------------------------------------------------------------------------- - if ( - !e.dataTransfer || - !e.dataTransfer.items || - e.dataTransfer.items.length === 0 - ) - return; - - // get dropped items - dropped_items = await puter.ui.getEntriesFromDataTransferItems( - e.dataTransfer.items - ); - - // generate a flat array of full paths from the dropped items - let paths = []; - for (let item of dropped_items) { - paths.push("/" + (item.fullPath ?? item.filepath)); - } - - // generate a directory tree from the paths - let tree = generateDirTree(paths); - - dropped_items = setRootDirTree(tree, dropped_items); - - // alert if no index.html in root - if (!hasRootIndexHtml(tree)) { - puter.ui.alert(index_missing_error, [ - { - label: "Ok", - }, - ]); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".deploy-btn").addClass("disabled"); - dropped_items = []; - return; - } - - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); - - // generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items - let rootItems = ""; - - if (rootKeys.length === 1) rootItems = rootKeys[0]; - else if (rootKeys.length === 2) - rootItems = rootKeys[0] + ", " + rootKeys[1]; - else if (rootKeys.length === 3) - rootItems = rootKeys[0] + ", " + rootKeys[1] + ", and" + rootKeys[1]; - else if (rootKeys.length > 3) - rootItems = - rootKeys[0] + - ", " + - rootKeys[1] + - ", and " + - (rootKeys.length - 2) + - " more item" + - (rootKeys.length - 2 > 1 ? "s" : ""); - - rootItems = html_encode(rootItems); - $(".drop-area").removeClass("drop-area-hover"); - $(".drop-area").addClass("drop-area-ready-to-deploy"); - drop_area_content = `${rootItems}
Ready to deploy 🚀
Cancel
`; - $(".drop-area").html(drop_area_content); - - // enable deploy button - $(".deploy-btn").removeClass("disabled"); - - return false; - }, - }); - - // Focus on the first input - $("#edit-app-title").focus(); + // Focus on the first input + $('#edit-app-title').focus(); } -$(".jip-submit-btn").on("click", async function(e) { - const first_name = $("#jip-first-name").val(); - const last_name = $("#jip-last-name").val(); - const paypal = $("#jip-paypal").val(); - let error; +$('.jip-submit-btn').on('click', async function (e) { + const first_name = $('#jip-first-name').val(); + const last_name = $('#jip-last-name').val(); + const paypal = $('#jip-paypal').val(); + let error; - if (first_name === "" || last_name === "" || paypal === "") - error = `All fields are required.`; - else if (first_name.length > 100) - error = `First Name cannot be longer than ${100}.`; - else if (last_name.length > 100) - error = `Last Name cannot be longer than ${100}.`; - else if (paypal.length > 100) - error = `Paypal cannot be longer than ${100}.`; - // check if email is valid - else if (!validateEmail(paypal)) - error = `Paypal email must be a valid email address.`; + if (first_name === '' || last_name === '' || paypal === '') + error = `All fields are required.`; + else if (first_name.length > 100) + error = `First Name cannot be longer than ${100}.`; + else if (last_name.length > 100) + error = `Last Name cannot be longer than ${100}.`; + else if (paypal.length > 100) + error = `Paypal cannot be longer than ${100}.`; + // check if email is valid + else if (!validateEmail(paypal)) + error = `Paypal email must be a valid email address.`; - // error? - if (error) { - $("#jip-error").show(); - $("#jip-error").html(error); - document.body.scrollTop = document.documentElement.scrollTop = 0; - return; - } - - // disable submit button - $(".jip-submit-btn").prop("disabled", true); - - $.ajax({ - url: puter.APIOrigin + "/jip", - type: "POST", - async: true, - contentType: "application/json", - data: JSON.stringify({ - first_name: first_name, - last_name: last_name, - paypal: paypal, - }), - headers: { - Authorization: "Bearer " + puter.authToken, - }, - success: function() { - $("#jip-success").show(); - $("#jip-form").hide(); - //enable submit button - $(".jip-submit-btn").prop("disabled", false); - // update dev profile - $("#payout-method-email").html(paypal); - // show payout method tab - $('.tab-btn[data-tab="payout-method"]').show(); - }, - error: function(err) { - $("#jip-error").show(); - $("#jip-error").html(err.message); - // scroll to top so that user sees error message - document.body.scrollTop = document.documentElement.scrollTop = 0; - // enable submit button - $(".jip-submit-btn").prop("disabled", false); - }, - }); -}); - -$(document).on("click", ".edit-app-save-btn", async function(e) { - const title = $("#edit-app-title").val(); - const name = $("#edit-app-name").val(); - const index_url = $("#edit-app-index-url").val(); - const description = $("#edit-app-description").val(); - const uid = $("#edit-app-uid").val(); - const height = $("#edit-app-window-height").val(); - const width = $("#edit-app-window-width").val(); - const top = $("#edit-app-window-top").val(); - const left = $("#edit-app-window-left").val(); - const category = $("#edit-app-category").val(); - - let filetype_associations = $("#edit-app-filetype-associations").val(); - - let icon; - - let error; - - //validation - if (title === "") error = `Title is required.`; - else if (title.length > 60) - error = `Title cannot be longer than ${60}.`; - else if (name === "") error = `Name is required.`; - else if (name.length > 60) - error = `Name cannot be longer than ${60}.`; - else if (index_url === "") error = `Index URL is required.`; - else if (!name.match(/^[a-zA-Z0-9-_-]+$/)) - error = `Name can only contain letters, numbers, dash (-) and underscore (_).`; - else if (!is_valid_url(index_url)) - error = `Index URL must be a valid url.`; - else if ( - !index_url.toLowerCase().startsWith("https://") && - !index_url.toLowerCase().startsWith("http://") - ) - error = `Index URL must start with 'https://' or 'http://'.`; - // height must be a number - else if (isNaN(height)) - error = `Window Height must be a number.`; - // height must be greater than 0 - else if (height <= 0) - error = `Window Height must be greater than 0.`; - // width must be a number - else if (isNaN(width)) - error = `Window Width must be a number.`; - // width must be greater than 0 - else if (width <= 0) - error = `Window Width must be greater than 0.`; - // top must be a number - else if (top && isNaN(top)) - error = `Window Top must be a number.`; - // left must be a number - else if (left && isNaN(left)) - error = `Window Left must be a number.`; - // download icon from URL - else { - let icon_url = $("#edit-app-icon").attr("data-url"); - let icon_base64 = $("#edit-app-icon").attr("data-base64"); - - if (icon_base64) { - icon = icon_base64; - } else if (icon_url) { - icon = await getBase64ImageFromUrl(icon_url); - let app_max_icon_size = 5 * 1024 * 1024; - if (icon.length > app_max_icon_size) - error = `Icon cannot be larger than ${byte_format(app_max_icon_size)}`; - // make sure icon is an image - else if ( - !icon.startsWith("data:image/") && - !icon.startsWith("data:application/octet-stream") - ) - error = `Icon must be an image.`; - } else { - icon = null; - } - } - - - //parse filetype_associations and validations - // Tagify returns a JSON string, so we parse it into an array - filetype_associations = JSON.parse(filetype_associations); - - filetype_associations = filetype_associations.map((type) => { - const fileType = type.value; - - - if ( - !fileType || - fileType === "." || - fileType === "/" - ) { - error = `File Association Type must be valid.`; - return null; // Return null for invalid cases + // error? + if (error) { + $('#jip-error').show(); + $('#jip-error').html(error); + document.body.scrollTop = document.documentElement.scrollTop = 0; + return; } - const lower = fileType.toLocaleLowerCase(); + // disable submit button + $('.jip-submit-btn').prop('disabled', true); - if (fileType.includes("/")) { - return lower; - } else if (fileType.includes(".")) { - return "." + lower.split(".")[1]; - } else { - return "." + lower; + $.ajax({ + url: puter.APIOrigin + "/jip", + type: 'POST', + async: true, + contentType: "application/json", + data: JSON.stringify({ + first_name: first_name, + last_name: last_name, + paypal: paypal, + }), + headers: { + "Authorization": "Bearer " + puter.authToken + }, + success: function () { + $('#jip-success').show(); + $('#jip-form').hide(); + //enable submit button + $('.jip-submit-btn').prop('disabled', false); + // update dev profile + $('#payout-method-email').html(paypal); + // show payout method tab + $('.tab-btn[data-tab="payout-method"]').show(); + }, + error: function (err) { + $('#jip-error').show(); + $('#jip-error').html(err.message); + // scroll to top so that user sees error message + document.body.scrollTop = document.documentElement.scrollTop = 0; + // enable submit button + $('.jip-submit-btn').prop('disabled', false); + } + }) +}) + +$(document).on('click', '.edit-app-save-btn', async function (e) { + const title = $('#edit-app-title').val(); + const name = $('#edit-app-name').val(); + const index_url = $('#edit-app-index-url').val(); + const description = $('#edit-app-description').val(); + const uid = $('#edit-app-uid').val(); + const height = $('#edit-app-window-height').val(); + const width = $('#edit-app-window-width').val(); + const top = $('#edit-app-window-top').val(); + const left = $('#edit-app-window-left').val(); + const category = $('#edit-app-category').val(); + + let filetype_associations = $('#edit-app-filetype-associations').val(); + + let icon; + + let error; + + //validation + if (title === '') + error = `Title is required.`; + else if (title.length > 60) + error = `Title cannot be longer than ${60}.`; + else if (name === '') + error = `Name is required.`; + else if (name.length > 60) + error = `Name cannot be longer than ${60}.`; + else if (index_url === '') + error = `Index URL is required.`; + else if (!name.match(/^[a-zA-Z0-9-_-]+$/)) + error = `Name can only contain letters, numbers, dash (-) and underscore (_).`; + else if (!is_valid_url(index_url)) + error = `Index URL must be a valid url.`; + else if (!index_url.toLowerCase().startsWith('https://') && !index_url.toLowerCase().startsWith('http://')) + error = `Index URL must start with 'https://' or 'http://'.`; + // height must be a number + else if (isNaN(height)) + error = `Window Height must be a number.`; + // height must be greater than 0 + else if (height <= 0) + error = `Window Height must be greater than 0.`; + // width must be a number + else if (isNaN(width)) + error = `Window Width must be a number.`; + // width must be greater than 0 + else if (width <= 0) + error = `Window Width must be greater than 0.`; + // top must be a number + else if (top && isNaN(top)) + error = `Window Top must be a number.`; + // left must be a number + else if (left && isNaN(left)) + error = `Window Left must be a number.`; + + // download icon from URL + else { + let icon_url = $('#edit-app-icon').attr('data-url'); + let icon_base64 = $('#edit-app-icon').attr('data-base64'); + + if(icon_base64){ + icon = icon_base64; + }else if (icon_url) { + icon = await getBase64ImageFromUrl(icon_url); + let app_max_icon_size = 5 * 1024 * 1024; + if (icon.length > app_max_icon_size) + error = `Icon cannot be larger than ${byte_format(app_max_icon_size)}`; + // make sure icon is an image + else if (!icon.startsWith('data:image/') && !icon.startsWith('data:application/octet-stream')) + error = `Icon must be an image.`; + }else{ + icon = null; + } } - }).filter(Boolean); // Remove null or undefined values + // error? + if (error) { + $('#edit-app-error').show(); + $('#edit-app-error').html(error); + document.body.scrollTop = document.documentElement.scrollTop = 0; + return; + } - // error? - if (error) { - $("#edit-app-error").show(); - $("#edit-app-error").html(error); - document.body.scrollTop = document.documentElement.scrollTop = 0; - return; - } + // show working spinner + puter.ui.showSpinner(); - // show working spinner - puter.ui.showSpinner(); + // parse filetype_associations + filetype_associations = filetype_associations.split(',').map(element => element.trim()); + // disable submit button + $('.edit-app-save-btn').prop('disabled', true); + let socialImageUrl = null; + if ($('#edit-app-social-image').attr('data-base64')) { + socialImageUrl = await handleSocialImageUpload(name, $('#edit-app-social-image').attr('data-base64')); + } else if ($('#edit-app-social-image').attr('data-url')) { + socialImageUrl = $('#edit-app-social-image').attr('data-url'); + } + + puter.apps.update(currently_editing_app.name, { + title: title, + name: name, + indexURL: index_url, + icon: icon, + description: description, + maximizeOnStart: $('#edit-app-maximize-on-start').is(":checked"), + background: $('#edit-app-background').is(":checked"), + metadata: { + fullpage_on_landing: $('#edit-app-fullpage-on-landing').is(":checked"), + social_image: socialImageUrl, + category: category || null, + window_size: { + width: width ?? 800, + height: height ?? 600, + }, + window_position: { + top: top, + left: left, + }, + window_resizable: $('#edit-app-window-resizable').is(":checked"), + hide_titlebar: $('#edit-app-hide-titlebar').is(":checked"), + locked: $(`#edit-app-locked`).is(":checked") ?? false, + credentialless: $(`#edit-app-credentialless`).is(":checked") ?? true, - // disable submit button - $(".edit-app-save-btn").prop("disabled", true); - - let socialImageUrl = null; - if ($("#edit-app-social-image").attr("data-base64")) { - socialImageUrl = await handleSocialImageUpload( - name, - $("#edit-app-social-image").attr("data-base64") - ); - } else if ($("#edit-app-social-image").attr("data-url")) { - socialImageUrl = $("#edit-app-social-image").attr("data-url"); - } - - puter.apps - .update(currently_editing_app.name, { - title: title, - name: name, - indexURL: index_url, - icon: icon, - description: description, - maximizeOnStart: $("#edit-app-maximize-on-start").is(":checked"), - background: $("#edit-app-background").is(":checked"), - metadata: { - fullpage_on_landing: $("#edit-app-fullpage-on-landing").is(":checked"), - social_image: socialImageUrl, - category: category || null, - window_size: { - width: width ?? 800, - height: height ?? 600, }, filetypeAssociations: filetype_associations, }).then(async (app) => { @@ -1406,166 +1200,148 @@ $(document).on('click', '.open-app-btn', async function (e) { puter.ui.launchApp($(this).attr('data-app-name')) }) -$(document).on("click", ".open-app-btn", async function(e) { - puter.ui.launchApp($(this).attr("data-app-name")); -}); +$('#earn-money-c2a-close').click(async function (e) { + $('#earn-money').get(0).close(); + puter.kv.set('earn-money-c2a-closed', 'true') +}) -$("#earn-money-c2a-close").click(async function(e) { - $("#earn-money").get(0).close(); - puter.kv.set("earn-money-c2a-closed", "true"); -}); +$('#earn-money::backdrop').click(async function (e) { + alert(); + $('#earn-money').get(0).close(); + puter.kv.set('earn-money-c2a-closed', 'true') +}) -$("#earn-money::backdrop").click(async function(e) { - alert(); - $("#earn-money").get(0).close(); - puter.kv.set("earn-money-c2a-closed", "true"); -}); +$(document).on('click', '.edit-app-open-app-btn', async function (e) { + puter.ui.launchApp($(this).attr('data-app-name')) +}) -$(document).on("click", ".edit-app-open-app-btn", async function(e) { - puter.ui.launchApp($(this).attr("data-app-name")); -}); +$(document).on('click', '.delete-app-settings', async function (e) { + let app_uid = $(this).attr('data-app-uid'); + let app_name = $(this).attr('data-app-name'); + let app_title = $(this).attr('data-app-title'); -$(document).on("click", ".delete-app-settings", async function(e) { - let app_uid = $(this).attr("data-app-uid"); - let app_name = $(this).attr("data-app-name"); - let app_title = $(this).attr("data-app-title"); + // check if app is locked + const app_data = await puter.apps.get(app_name); - // check if app is locked - const app_data = await puter.apps.get(app_name); - - if (app_data.metadata?.locked) { - puter.ui.alert( - `${app_data.title} is locked and cannot be deleted.`, - [ - { - label: "Ok", - }, - ], - { - type: "warning", - } - ); - return; - } - - // confirm delete - const alert_resp = await puter.ui.alert( - `Are you sure you want to premanently delete ${html_encode(app_title)}?`, - [ - { - label: "Yes, delete permanently", - value: "delete", - type: "danger", - }, - { - label: "Cancel", - }, - ] - ); - - if (alert_resp === "delete") { - let init_ts = Date.now(); - $(".deleting-app-modal")?.get(0)?.showModal(); - puter.apps - .delete(app_name) - .then(async (app) => { - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - $(".back-to-main-btn").trigger("click"); - }, - // make sure the modal was shown for at least 2 seconds - Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) - ); - // get app directory - puter.fs - .stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - returnSubdomains: true, - }) - .then(async (stat) => { - // delete subdomain associated with the app dir - puter.hosting.delete(stat.subdomains[0].subdomain); - // delete app directory - puter.fs.delete( - `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - { recursive: true } - ); - }); - }) - .catch(async (err) => { - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - puter.ui.alert(err?.message, [ - { - label: "Ok", - }, - ]); - }, - Date.now() - init_ts > 2000 ? 1 : 2000 - (Date.now() - init_ts) - ); - }); - } -}); - -$(document).on("click", ".edit-app", async function(e) { - $("#edit-app-uid").val($(this).attr("data-app-uid")); -}); - -$(document).on("click", ".back-to-main-btn", function(e) { - $("section:not(.sidebar)").hide(); - $(".tab-btn").removeClass("active"); - $('.tab-btn[data-tab="apps"]').addClass("active"); - - // get apps - $("#loading").show(); - setTimeout(function() { - puter.apps.list().then((apps_res) => { - // uncheck the select all checkbox - $(".select-all-apps").prop("checked", false); - - $("#loading").hide(); - apps = apps_res; - if (apps.length > 0) { - if (activeTab === "apps") { - $("#no-apps-notice").hide(); - $("#app-list").show(); - } - $(".app-card").remove(); - apps.forEach((app) => { - $("#app-list-table > tbody").append(generate_app_card(app)); + if(app_data.metadata?.locked){ + puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ + { + label: 'Ok', + }, + ], { + type: 'warning', }); - count_apps(); - sort_apps(); - } else $("#no-apps-notice").show(); - }); - }, 1000); -}); + return; + } + + // confirm delete + const alert_resp = await puter.ui.alert(`Are you sure you want to premanently delete ${html_encode(app_title)}?`, + [ + { + label: 'Yes, delete permanently', + value: 'delete', + type: 'danger', + }, + { + label: 'Cancel' + }, + ] + ); + + if (alert_resp === 'delete') { + let init_ts = Date.now(); + $('.deleting-app-modal')?.get(0)?.showModal(); + puter.apps.delete(app_name).then(async (app) => { + setTimeout(() => { + $('.deleting-app-modal')?.get(0)?.close(); + $('.back-to-main-btn').trigger('click'); + }, + // make sure the modal was shown for at least 2 seconds + (Date.now() - init_ts) > 2000 ? 1 : 2000 - (Date.now() - init_ts)); + // get app directory + puter.fs.stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + returnSubdomains: true, + }).then(async (stat) => { + // delete subdomain associated with the app dir + puter.hosting.delete(stat.subdomains[0].subdomain) + // delete app directory + puter.fs.delete( + `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + { recursive: true } + ) + }) + }).catch(async (err) => { + setTimeout(() => { + $('.deleting-app-modal')?.get(0)?.close(); + puter.ui.alert(err?.message, [ + { + label: 'Ok', + }, + ]); + }, + (Date.now() - init_ts) > 2000 ? 1 : (2000 - (Date.now() - init_ts))); + }) + } +}) + +$(document).on('click', '.edit-app', async function (e) { + $('#edit-app-uid').val($(this).attr('data-app-uid')); +}) + +$(document).on('click', '.back-to-main-btn', function (e) { + $('section:not(.sidebar)').hide(); + $('.tab-btn').removeClass('active'); + $('.tab-btn[data-tab="apps"]').addClass('active'); + + // get apps + $('#loading').show(); + setTimeout(function () { + puter.apps.list().then((apps_res) => { + // uncheck the select all checkbox + $('.select-all-apps').prop('checked', false); + + $('#loading').hide(); + apps = apps_res; + if (apps.length > 0) { + if (activeTab === 'apps') { + $('#no-apps-notice').hide(); + $('#app-list').show(); + } + $('.app-card').remove(); + apps.forEach(app => { + $('#app-list-table > tbody').append(generate_app_card(app)); + }); + count_apps(); + sort_apps(); + } else + $('#no-apps-notice').show(); + }) + }, 1000); +}) function count_apps() { - let count = 0; - $(".app-card").each(function() { - count++; - }); - $(".app-count").html(count); - return count; + let count = 0; + $('.app-card').each(function () { + count++; + }) + $('.app-count').html(count); + return count; } // https://stackoverflow.com/a/43467144/1764493 function is_valid_url(string) { - let url; + let url; - try { - url = new URL(string); - } catch (_) { - return false; - } + try { + url = new URL(string); + } catch (_) { + return false; + } - return url.protocol === "http:" || url.protocol === "https:"; + return url.protocol === "http:" || url.protocol === "https:"; } - $(document).on('click', '#edit-app-icon-delete', async function (e) { $('#edit-app-icon').css('background-image', ``); $('#edit-app-icon').removeAttr('data-url'); @@ -1576,31 +1352,26 @@ $(document).on('click', '#edit-app-icon-delete', async function (e) { toggleResetButton(); }) +$(document).on('click', '#edit-app-icon', async function (e) { + const res2 = await puter.ui.showOpenFilePicker({ + accept: "image/*", + }); -$(document).on("click", "#edit-app-icon", async function(e) { - const res2 = await puter.ui.showOpenFilePicker({ - accept: "image/*", - }); + const icon = await puter.fs.read(res2.path); + // convert blob to base64 + const reader = new FileReader(); + reader.readAsDataURL(icon); - const icon = await puter.fs.read(res2.path); - // convert blob to base64 - const reader = new FileReader(); - reader.readAsDataURL(icon); + reader.onloadend = function () { + let image = reader.result; + // Get file extension + let fileExtension = res2.name.split('.').pop(); - reader.onloadend = function() { - let image = reader.result; - // Get file extension - let fileExtension = res2.name.split(".").pop(); - - // Get MIME type - let mimeType = getMimeType(fileExtension); - - // Replace MIME type in the data URL - image = image.replace( - "data:application/octet-stream;base64", - `data:${mimeType};base64` - ); + // Get MIME type + let mimeType = getMimeType(fileExtension); + // Replace MIME type in the data URL + image = image.replace('data:application/octet-stream;base64', `data:${mimeType};base64`); $('#edit-app-icon').css('background-image', `url(${image})`); $('#edit-app-icon').attr('data-base64', image); @@ -1611,35 +1382,30 @@ $(document).on("click", "#edit-app-icon", async function(e) { } }) - async function getBase64ImageFromUrl(imageUrl) { - var res = await fetch(imageUrl); - var blob = await res.blob(); + var res = await fetch(imageUrl); + var blob = await res.blob(); - return new Promise((resolve, reject) => { - var reader = new FileReader(); - reader.addEventListener( - "load", - function() { - resolve(reader.result); - }, - false - ); + return new Promise((resolve, reject) => { + var reader = new FileReader(); + reader.addEventListener("load", function () { + resolve(reader.result); + }, false); - reader.onerror = () => { - return reject(this); - }; - reader.readAsDataURL(blob); - }); + reader.onerror = () => { + return reject(this); + }; + reader.readAsDataURL(blob); + }) } /** * Generates HTML for an individual app card in the app list. - * + * * @param {Object} app - The app object containing details of the app. - * * + * * * @returns {string} HTML string representing the app card. - * + * * @description * This function creates an HTML string for an app card, which includes: * - Checkbox for app selection @@ -1648,115 +1414,115 @@ async function getBase64ImageFromUrl(imageUrl) { * - Display of app statistics (user count, open count) * - Creation date * - Incentive program status badge (if applicable) - * + * * The generated HTML is designed to be inserted into the app list table. - * It includes data attributes for various interactive features and + * It includes data attributes for various interactive features and * event handling. - * + * * @example * const appCardHTML = generate_app_card(myAppObject); * $('#app-list-table > tbody').append(appCardHTML); */ function generate_app_card(app) { - let h = ``; - h += `Ready to deploy 🚀
Cancel
`; - $(".drop-area").html(drop_area_content); - - // deploy - deploy({ uid: $(e.target).attr("data-uid") }, source_path ?? dropped_items); - $(".insta-deploy-existing-app-list").html(""); -}); - -$(document).on("click", ".insta-deploy-cancel", function(e) { - $(this).closest("dialog")?.get(0)?.close(); -}); -$(document).on("click", ".insta-deploy-existing-app-back", function(e) { - $(".insta-deploy-existing-app-select")?.get(0)?.close(); - $(".insta-deploy-modal")?.get(0)?.showModal(); - // disable deploy button - $(".insta-deploy-existing-app-deploy-btn").addClass("disabled"); - - // todo disable the 'an existing app' option if there are no existing apps -}); - -$(document).on("click", ".add-app-to-desktop", function(e) { - let app_title = $(this).attr("data-app-title"); - let app_uid = $(this).attr("data-app-uid"); - - puter.fs - .upload(new File([], app_title), `/${authUsername}/Desktop`, { - name: app_title, - dedupeName: true, - overwrite: false, - appUID: app_uid, + ); + } + } + }, 500); }) - .then(async (uploaded) => { - puter.ui.alert( - `${app_title} shortcut has been added to your desktop.`, - [ - { - label: "Ok", - type: "primary", - }, - ], + + // todo reset .insta-deploy-existing-app-list on close +}) + +$(document).on('click', '.insta-deploy-app-selector', function (e) { + $('.insta-deploy-app-selector').removeClass('active'); + $(this).addClass('active'); + + // enable deploy button + $('.insta-deploy-existing-app-deploy-btn').removeClass('disabled'); +}) + +$(document).on('click', '.insta-deploy-existing-app-deploy-btn', function (e) { + $('.insta-deploy-existing-app-deploy-btn').addClass('disabled'); + $('.insta-deploy-existing-app-select')?.get(0)?.close(); + // load the 'App Settings' section + edit_app_section($('.insta-deploy-app-selector.active').attr('data-name')); + + $('.drop-area').removeClass('drop-area-hover'); + $('.drop-area').addClass('drop-area-ready-to-deploy'); + let drop_area_content = `Ready to deploy 🚀
Cancel
`; + $('.drop-area').html(drop_area_content); + + // deploy + deploy({ uid: $(e.target).attr('data-uid') }, source_path ?? dropped_items); + $('.insta-deploy-existing-app-list').html(''); +}) + +$(document).on('click', '.insta-deploy-cancel', function (e) { + $(this).closest('dialog')?.get(0)?.close(); +}) +$(document).on('click', '.insta-deploy-existing-app-back', function (e) { + $('.insta-deploy-existing-app-select')?.get(0)?.close(); + $('.insta-deploy-modal')?.get(0)?.showModal(); + // disable deploy button + $('.insta-deploy-existing-app-deploy-btn').addClass('disabled'); + + // todo disable the 'an existing app' option if there are no existing apps +}) + + +$(document).on('click', '.add-app-to-desktop', function (e) { + let app_title = $(this).attr('data-app-title'); + let app_uid = $(this).attr('data-app-uid'); + + puter.fs.upload( + new File([], app_title), + `/${authUsername}/Desktop`, { - type: "success", - } - ); - }); -}); + name: app_title, + dedupeName: true, + overwrite: false, + appUID: app_uid, + }).then(async (uploaded) => { + puter.ui.alert(`${app_title} shortcut has been added to your desktop.`, [ + { + label: 'Ok', + type: 'primary', + }, + ], { + type: 'success', + }); + }) + +}) function reset_drop_area() { - dropped_items = null; - $(".drop-area").html(drop_area_placeholder); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".deploy-btn").addClass("disabled"); + dropped_items = null; + $('.drop-area').html(drop_area_placeholder); + $('.drop-area').removeClass('drop-area-ready-to-deploy'); + $('.deploy-btn').addClass('disabled'); } -$("body").on("dragover", function(event) { - // skip if the user is dragging something over the drop area - if ($(event.target).hasClass("drop-area")) return; +$('body').on('dragover', function (event) { + // skip if the user is dragging something over the drop area + if ($(event.target).hasClass('drop-area')) + return; - event.preventDefault(); // Prevent the default behavior - event.stopPropagation(); // Stop the event from propagating + event.preventDefault(); // Prevent the default behavior + event.stopPropagation(); // Stop the event from propagating }); // Developers can drop items anywhere on the page to deploy them -$("body").on("drop", async function(event) { - // skip if the user is dragging something over the drop area - if ($(event.target).hasClass("drop-area")) return; +$('body').on('drop', async function (event) { + // skip if the user is dragging something over the drop area + if ($(event.target).hasClass('drop-area')) + return; - // prevent default behavior - event.preventDefault(); - event.stopPropagation(); + // prevent default behavior + event.preventDefault(); + event.stopPropagation(); - // retrieve puter items from the event - if (event.detail?.items?.length > 0) { - dropped_items = event.detail.items; - source_path = dropped_items[0].path; - // by deploying an existing Puter folder. So we create the app and deploy it. - if (source_path) { - // todo if there are no apps, go straight to creating a new app - $(".insta-deploy-modal").get(0).showModal(); - // set item name - $(".insta-deploy-item-name").html(html_encode(dropped_items[0].name)); + // retrieve puter items from the event + if (event.detail?.items?.length > 0) { + dropped_items = event.detail.items; + source_path = dropped_items[0].path; + // by deploying an existing Puter folder. So we create the app and deploy it. + if (source_path) { + // todo if there are no apps, go straight to creating a new app + $('.insta-deploy-modal').get(0).showModal(); + // set item name + $('.insta-deploy-item-name').html(html_encode(dropped_items[0].name)); + } } - } - //----------------------------------------------------------------------------- - // Local items dropped - //----------------------------------------------------------------------------- - const e = event.originalEvent; - if ( - !e.dataTransfer || - !e.dataTransfer.items || - e.dataTransfer.items.length === 0 - ) - return; + //----------------------------------------------------------------------------- + // Local items dropped + //----------------------------------------------------------------------------- + const e = event.originalEvent; + if (!e.dataTransfer || !e.dataTransfer.items || e.dataTransfer.items.length === 0) + return; - // Get dropped items - dropped_items = await puter.ui.getEntriesFromDataTransferItems( - e.dataTransfer.items - ); + // Get dropped items + dropped_items = await puter.ui.getEntriesFromDataTransferItems(e.dataTransfer.items); - // Generate a flat array of full paths from the dropped items - let paths = []; - for (let item of dropped_items) { - paths.push("/" + (item.fullPath ?? item.filepath)); - } + // Generate a flat array of full paths from the dropped items + let paths = []; + for (let item of dropped_items) { + paths.push('/' + (item.fullPath ?? item.filepath)); + } - // Generate a directory tree from the paths - let tree = generateDirTree(paths); + // Generate a directory tree from the paths + let tree = generateDirTree(paths); - dropped_items = setRootDirTree(tree, dropped_items); + dropped_items = setRootDirTree(tree, dropped_items); - // Alert if no index.html in root - if (!hasRootIndexHtml(tree)) { - puter.ui.alert(index_missing_error, [ - { - label: "Ok", - }, - ]); - $(".drop-area").removeClass("drop-area-ready-to-deploy"); - $(".deploy-btn").addClass("disabled"); - dropped_items = []; - return; - } + // Alert if no index.html in root + if (!hasRootIndexHtml(tree)) { + puter.ui.alert(index_missing_error, [ + { + label: 'Ok', + }, + ]); + $('.drop-area').removeClass('drop-area-ready-to-deploy'); + $('.deploy-btn').addClass('disabled'); + dropped_items = []; + return; + } - // Get all keys (directories and files) in the root - const rootKeys = Object.keys(tree); + // Get all keys (directories and files) in the root + const rootKeys = Object.keys(tree); - // Generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items - let rootItems = ""; + // Generate a list of items in the root in the form of a string (e.g. /index.html, /css/style.css) with maximum of 3 items + let rootItems = ''; - if (rootKeys.length === 1) rootItems = rootKeys[0]; - else if (rootKeys.length === 2) rootItems = rootKeys[0] + ", " + rootKeys[1]; - else if (rootKeys.length === 3) - rootItems = rootKeys[0] + ", " + rootKeys[1] + ", and" + rootKeys[1]; - else if (rootKeys.length > 3) - rootItems = - rootKeys[0] + - ", " + - rootKeys[1] + - ", and " + - (rootKeys.length - 2) + - " more item" + - (rootKeys.length - 2 > 1 ? "s" : ""); + if (rootKeys.length === 1) + rootItems = rootKeys[0]; + else if (rootKeys.length === 2) + rootItems = rootKeys[0] + ', ' + rootKeys[1]; + else if (rootKeys.length === 3) + rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and' + rootKeys[1]; + else if (rootKeys.length > 3) + rootItems = rootKeys[0] + ', ' + rootKeys[1] + ', and ' + (rootKeys.length - 2) + ' more item' + (rootKeys.length - 2 > 1 ? 's' : ''); - // Show insta-deploy modal - $(".insta-deploy-modal").get(0)?.showModal(); + // Show insta-deploy modal + $('.insta-deploy-modal').get(0)?.showModal(); - // Set item name - $(".insta-deploy-item-name").html(html_encode(rootItems)); + // Set item name + $('.insta-deploy-item-name').html(html_encode(rootItems)); }); -$(".insta-deploy-existing-app-select").on("close", function(e) { - $(".insta-deploy-existing-app-list").html(""); -}); +$('.insta-deploy-existing-app-select').on('close', function (e) { + $('.insta-deploy-existing-app-list').html(''); +}) -$(".refresh-app-list").on("click", function(e) { - $(".loading-modal").get(0)?.showModal(); +$('.refresh-app-list').on('click', function (e) { + $('.loading-modal').get(0)?.showModal(); - puter.apps.list().then((resp) => { - setTimeout(() => { - apps = resp; + puter.apps.list().then((resp) => { + setTimeout(() => { + apps = resp; - $(".app-card").remove(); - apps.forEach((app) => { - $("#app-list-table > tbody").append(generate_app_card(app)); - }); + $('.app-card').remove(); + apps.forEach(app => { + $('#app-list-table > tbody').append(generate_app_card(app)); + }); - count_apps(); + count_apps(); - // preserve search query - if (search_query) { - // show apps that match search_query and hide apps that don't - apps.forEach((app) => { - if (app.title.toLowerCase().includes(search_query.toLowerCase())) { - $(`.app-card[data-name="${app.name}"]`).show(); - } else { - $(`.app-card[data-name="${app.name}"]`).hide(); - } - }); - } + // preserve search query + if (search_query) { + // show apps that match search_query and hide apps that don't + apps.forEach((app) => { + if (app.title.toLowerCase().includes(search_query.toLowerCase())) { + $(`.app-card[data-name="${app.name}"]`).show(); + } else { + $(`.app-card[data-name="${app.name}"]`).hide(); + } + }) + } - // preserve sort - sort_apps(); + // preserve sort + sort_apps(); - $(".loading-modal").get(0).close(); - }, 1000); - }); -}); + $('.loading-modal').get(0).close(); + }, 1000); + }) +}) -$(document).on("click", ".search", function(e) { - e.stopPropagation(); - e.preventDefault(); - // don't let click bubble up to window - e.stopImmediatePropagation(); -}); +$(document).on('click', '.search', function (e) { + e.stopPropagation(); + e.preventDefault(); + // don't let click bubble up to window + e.stopImmediatePropagation(); +}) -$(document).on( - "input change keyup keypress keydown paste cut", - ".search", - function(e) { +$(document).on('input change keyup keypress keydown paste cut', '.search', function (e) { // search apps for query search_query = $(this).val().toLowerCase(); - if (search_query === "") { - // hide 'clear search' button - $(".search-clear").hide(); - // show all apps again - $(`.app-card`).show(); + if (search_query === '') { + // hide 'clear search' button + $('.search-clear').hide(); + // show all apps again + $(`.app-card`).show(); } else { - // show 'clear search' button - $(".search-clear").show(); - // show apps that match search_query and hide apps that don't - apps.forEach((app) => { - if ( - app.title.toLowerCase().includes(search_query.toLowerCase()) || - app.name.toLowerCase().includes(search_query.toLowerCase()) || - app.description.toLowerCase().includes(search_query.toLowerCase()) || - app.uid.toLowerCase().includes(search_query.toLowerCase()) - ) { - $(`.app-card[data-name="${app.name}"]`).show(); - } else { - $(`.app-card[data-name="${app.name}"]`).hide(); - } - }); - } - } -); - -$(document).on("click", ".search-clear", function(e) { - $(".search").val(""); - $(".search").trigger("change"); - $(".search").focus(); - search_query = ""; -}); - -$(document).on("change", ".app-checkbox", function(e) { - // determine if select-all checkbox should be checked, indeterminate, or unchecked - if ($(".app-checkbox:checked").length === $(".app-checkbox").length) { - $(".select-all-apps").prop("indeterminate", false); - $(".select-all-apps").prop("checked", true); - } else if ($(".app-checkbox:checked").length > 0) { - $(".select-all-apps").prop("indeterminate", true); - $(".select-all-apps").prop("checked", false); - } else { - $(".select-all-apps").prop("indeterminate", false); - $(".select-all-apps").prop("checked", false); - } - - // activate row - if ($(this).is(":checked")) $(this).closest("tr").addClass("active"); - else $(this).closest("tr").removeClass("active"); - - // enable delete button if at least one checkbox is checked - if ($(".app-checkbox:checked").length > 0) - $(".delete-apps-btn").removeClass("disabled"); - else $(".delete-apps-btn").addClass("disabled"); -}); - -$(document).on("click", ".delete-apps-btn", async function(e) { - // show confirmation alert - let resp = await puter.ui.alert( - `Are you sure you want to delete the selected apps?`, - [ - { - label: "Delete", - type: "danger", - value: "delete", - }, - { - label: "Cancel", - }, - ], - { - type: "warning", - } - ); - - if (resp === "delete") { - // disable delete button - // $('.delete-apps-btn').addClass('disabled'); - - // show 'deleting' modal - $(".deleting-app-modal")?.get(0)?.showModal(); - - let start_ts = Date.now(); - const apps = $(".app-checkbox:checked").toArray(); - - // delete all checked apps - for (let app of apps) { - // get app uid - const app_uid = $(app).attr("data-app-uid"); - const app_name = $(app).attr("data-app-name"); - - // get app - const app_data = await puter.apps.get(app_name); - - if (app_data.metadata?.locked) { - if (apps.length === 1) { - puter.ui.alert( - `${app_data.title} is locked and cannot be deleted.`, - [ - { - label: "Ok", - }, - ], + // show 'clear search' button + $('.search-clear').show(); + // show apps that match search_query and hide apps that don't + apps.forEach((app) => { + if ( + app.title.toLowerCase().includes(search_query.toLowerCase()) + || app.name.toLowerCase().includes(search_query.toLowerCase()) + || app.description.toLowerCase().includes(search_query.toLowerCase()) + || app.uid.toLowerCase().includes(search_query.toLowerCase()) + ) { - type: "warning", + $(`.app-card[data-name="${app.name}"]`).show(); + } else { + $(`.app-card[data-name="${app.name}"]`).hide(); } - ); + }) + } +}) - break; - } +$(document).on('click', '.search-clear', function (e) { + $('.search').val(''); + $('.search').trigger('change'); + $('.search').focus(); + search_query = ''; +}) - let resp = await puter.ui.alert( - `${app_data.title} is locked and cannot be deleted.`, - [ - { - label: "Skip and Continue", - value: "Continue", - type: "primary", - }, - { - label: "Cancel", - }, - ], - { - type: "warning", - } - ); - - if (resp === "Cancel") break; - else if (resp === "Continue") continue; - else continue; - } - - // delete app - await puter.apps.delete(app_name); - - // remove app card - $(`.app-card[data-uid="${app_uid}"]`).fadeOut(200, function name(params) { - $(this).remove(); - if ($(`.app-card`).length === 0) { - $("section:not(.sidebar)").hide(); - $("#no-apps-notice").show(); - } else { - $("section:not(.sidebar)").hide(); - $("#app-list").show(); - } - count_apps(); - }); - - try { - // get app directory - const stat = await puter.fs.stat({ - path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - returnSubdomains: true, - }); - // delete subdomain associated with the app directory - if (stat?.subdomains[0]?.subdomain) { - await puter.hosting.delete(stat.subdomains[0].subdomain); - } - // delete app directory - await puter.fs.delete( - `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, - { recursive: true } - ); - count_apps(); - } catch (err) { - console.log(err); - } +$(document).on('change', '.app-checkbox', function (e) { + // determine if select-all checkbox should be checked, indeterminate, or unchecked + if ($('.app-checkbox:checked').length === $('.app-checkbox').length) { + $('.select-all-apps').prop('indeterminate', false); + $('.select-all-apps').prop('checked', true); + } else if ($('.app-checkbox:checked').length > 0) { + $('.select-all-apps').prop('indeterminate', true); + $('.select-all-apps').prop('checked', false); + } + else { + $('.select-all-apps').prop('indeterminate', false); + $('.select-all-apps').prop('checked', false); } - // close 'deleting' modal - setTimeout( - () => { - $(".deleting-app-modal")?.get(0)?.close(); - if ($(".app-checkbox:checked").length === 0) { - // disable delete button - $(".delete-apps-btn").addClass("disabled"); - // reset the 'select all' checkbox - $(".select-all-apps").prop("indeterminate", false); - $(".select-all-apps").prop("checked", false); - } - }, - start_ts - Date.now() > 500 ? 0 : 500 - ); - } -}); + // activate row + if ($(this).is(':checked')) + $(this).closest('tr').addClass('active'); + else + $(this).closest('tr').removeClass('active'); -$(document).on("change", ".select-all-apps", function(e) { - if ($(this).is(":checked")) { - $(".app-checkbox").prop("checked", true); - $(".app-card").addClass("active"); - $(".delete-apps-btn").removeClass("disabled"); - } else { - $(".app-checkbox").prop("checked", false); - $(".app-card").removeClass("active"); - $(".delete-apps-btn").addClass("disabled"); - } -}); + // enable delete button if at least one checkbox is checked + if ($('.app-checkbox:checked').length > 0) + $('.delete-apps-btn').removeClass('disabled'); + else + $('.delete-apps-btn').addClass('disabled'); + +}) + +$(document).on('click', '.delete-apps-btn', async function (e) { + // show confirmation alert + let resp = await puter.ui.alert(`Are you sure you want to delete the selected apps?`, [ + { + label: 'Delete', + type: 'danger', + value: 'delete', + }, + { + label: 'Cancel', + }, + ], { + type: 'warning', + }); + + if (resp === 'delete') { + // disable delete button + // $('.delete-apps-btn').addClass('disabled'); + + // show 'deleting' modal + $('.deleting-app-modal')?.get(0)?.showModal(); + + let start_ts = Date.now(); + const apps = $('.app-checkbox:checked').toArray(); + + // delete all checked apps + for (let app of apps) { + // get app uid + const app_uid = $(app).attr('data-app-uid'); + const app_name = $(app).attr('data-app-name'); + + // get app + const app_data = await puter.apps.get(app_name); + + if(app_data.metadata?.locked){ + if(apps.length === 1){ + puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ + { + label: 'Ok', + }, + ], { + type: 'warning', + }); + + break; + } + + let resp = await puter.ui.alert(`${app_data.title} is locked and cannot be deleted.`, [ + { + label: 'Skip and Continue', + value: 'Continue', + type: 'primary' + }, + { + label: 'Cancel', + }, + ], { + type: 'warning', + }); + + if(resp === 'Cancel') + break; + else if(resp === 'Continue') + continue; + else + continue; + } + + // delete app + await puter.apps.delete(app_name) + + // remove app card + $(`.app-card[data-uid="${app_uid}"]`).fadeOut(200, function name(params) { + $(this).remove(); + if ($(`.app-card`).length === 0) { + $('section:not(.sidebar)').hide(); + $('#no-apps-notice').show(); + } else { + $('section:not(.sidebar)').hide(); + $('#app-list').show(); + } + count_apps(); + }); + + try{ + // get app directory + const stat = await puter.fs.stat({ + path: `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + returnSubdomains: true + }); + // delete subdomain associated with the app directory + if(stat?.subdomains[0]?.subdomain){ + await puter.hosting.delete(stat.subdomains[0].subdomain) + } + // delete app directory + await puter.fs.delete( + `/${authUsername}/AppData/${dev_center_uid}/${app_uid}`, + { recursive: true } + ) + count_apps(); + } catch(err) { + console.log(err); + } + } + + // close 'deleting' modal + setTimeout(() => { + $('.deleting-app-modal')?.get(0)?.close(); + if($('.app-checkbox:checked').length === 0){ + // disable delete button + $('.delete-apps-btn').addClass('disabled'); + // reset the 'select all' checkbox + $('.select-all-apps').prop('indeterminate', false); + $('.select-all-apps').prop('checked', false); + } + }, (start_ts - Date.now()) > 500 ? 0 : 500); + } +}) + +$(document).on('change', '.select-all-apps', function (e) { + if ($(this).is(':checked')) { + $('.app-checkbox').prop('checked', true); + $('.app-card').addClass('active'); + $('.delete-apps-btn').removeClass('disabled'); + } else { + $('.app-checkbox').prop('checked', false); + $('.app-card').removeClass('active'); + $('.delete-apps-btn').addClass('disabled'); + } +}) /** * Get the MIME type for a given file extension. @@ -2676,131 +2402,105 @@ $(document).on("change", ".select-all-apps", function(e) { * @returns {string} The corresponding MIME type, or 'application/octet-stream' if not found. */ function getMimeType(extension) { - const mimeTypes = { - jpg: "image/jpeg", - jpeg: "image/jpeg", - png: "image/png", - gif: "image/gif", - bmp: "image/bmp", - webp: "image/webp", - svg: "image/svg+xml", - tiff: "image/tiff", - ico: "image/x-icon", - }; + const mimeTypes = { + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + png: 'image/png', + gif: 'image/gif', + bmp: 'image/bmp', + webp: 'image/webp', + svg: 'image/svg+xml', + tiff: 'image/tiff', + ico: 'image/x-icon' + }; - // Remove leading dot if present and convert to lowercase - const cleanExtension = extension.replace(/^\./, "").toLowerCase(); + // Remove leading dot if present and convert to lowercase + const cleanExtension = extension.replace(/^\./, '').toLowerCase(); - // Return the MIME type if found, otherwise return 'application/octet-stream' - return mimeTypes[cleanExtension] || "application/octet-stream"; + // Return the MIME type if found, otherwise return 'application/octet-stream' + return mimeTypes[cleanExtension] || 'application/octet-stream'; } // if edit-app-maximize-on-start is checked, disable window size and position fields -$(document).on("change", "#edit-app-maximize-on-start", function(e) { - if ($(this).is(":checked")) { - $("#edit-app-window-width, #edit-app-window-height").prop("disabled", true); - $("#edit-app-window-top, #edit-app-window-left").prop("disabled", true); - } else { - $("#edit-app-window-width, #edit-app-window-height").prop( - "disabled", - false - ); - $("#edit-app-window-top, #edit-app-window-left").prop("disabled", false); - } -}); +$(document).on('change', '#edit-app-maximize-on-start', function (e) { + if ($(this).is(':checked')) { + $('#edit-app-window-width, #edit-app-window-height').prop('disabled', true); + $('#edit-app-window-top, #edit-app-window-left').prop('disabled', true); + } else { + $('#edit-app-window-width, #edit-app-window-height').prop('disabled', false); + $('#edit-app-window-top, #edit-app-window-left').prop('disabled', false); + } +}) -$(document).on("change", "#edit-app-background", function(e) { - if ($("#edit-app-background").is(":checked")) { - disable_window_settings(); - } else { - enable_window_settings(); - } -}); +$(document).on('change', '#edit-app-background', function (e) { + if($('#edit-app-background').is(":checked")){ + disable_window_settings() + }else{ + enable_window_settings() + } +}) -function disable_window_settings() { - $("#edit-app-maximize-on-start").prop("disabled", true); - $("#edit-app-fullpage-on-landing").prop("disabled", true); - $("#edit-app-window-width, #edit-app-window-height").prop("disabled", true); - $("#edit-app-window-top, #edit-app-window-left").prop("disabled", true); - $("#edit-app-window-resizable").prop("disabled", true); - $("#edit-app-hide-titlebar").prop("disabled", true); +function disable_window_settings(){ + $('#edit-app-maximize-on-start').prop('disabled', true); + $('#edit-app-fullpage-on-landing').prop('disabled', true); + $('#edit-app-window-width, #edit-app-window-height').prop('disabled', true); + $('#edit-app-window-top, #edit-app-window-left').prop('disabled', true); + $('#edit-app-window-resizable').prop('disabled', true); + $('#edit-app-hide-titlebar').prop('disabled', true); } -function enable_window_settings() { - $("#edit-app-maximize-on-start").prop("disabled", false); - $("#edit-app-fullpage-on-landing").prop("disabled", false); - $("#edit-app-window-width, #edit-app-window-height").prop("disabled", false); - $("#edit-app-window-top, #edit-app-window-left").prop("disabled", false); - $("#edit-app-window-resizable").prop("disabled", false); - $("#edit-app-hide-titlebar").prop("disabled", false); +function enable_window_settings(){ + $('#edit-app-maximize-on-start').prop('disabled', false); + $('#edit-app-fullpage-on-landing').prop('disabled', false); + $('#edit-app-window-width, #edit-app-window-height').prop('disabled', false); + $('#edit-app-window-top, #edit-app-window-left').prop('disabled', false); + $('#edit-app-window-resizable').prop('disabled', false); + $('#edit-app-hide-titlebar').prop('disabled', false); } -$(document).on("click", ".reset-deploy", function(e) { - reset_drop_area(); -}); +$(document).on('click', '.reset-deploy', function (e) { + reset_drop_area(); +}) -$(document).on("click", ".sidebar-toggle", function(e) { - $(".sidebar").toggleClass("open"); - $("body").toggleClass("sidebar-open"); -}); +$(document).on('click', '.sidebar-toggle', function (e) { + $('.sidebar').toggleClass('open'); + $('body').toggleClass('sidebar-open'); +}) async function initializeAssetsDirectory() { - try { - // Check if assets_url exists - const existingURL = await puter.kv.get("assets_url"); - if (!existingURL) { - // Create assets directory - const assetsDir = await puter.fs.mkdir( - `/${authUsername}/AppData/${dev_center_uid}/assets`, - { overwrite: false } - ); - - // Publish the directory - const hostname = `assets-${Math.random().toString(36).substring(2)}`; - const route = await puter.hosting.create(hostname, assetsDir.path); - - // Store the URL - await puter.kv.set("assets_url", `https://${hostname}.puter.site`); + try { + // Check if assets_url exists + const existingURL = await puter.kv.get('assets_url'); + if (!existingURL) { + // Create assets directory + const assetsDir = await puter.fs.mkdir( + `/${authUsername}/AppData/${dev_center_uid}/assets`, + { overwrite: false } + ); + + // Publish the directory + const hostname = `assets-${Math.random().toString(36).substring(2)}`; + const route = await puter.hosting.create(hostname, assetsDir.path); + + // Store the URL + await puter.kv.set('assets_url', `https://${hostname}.puter.site`); + } + } catch (err) { + console.error('Error initializing assets directory:', err); } - } catch (err) { - console.error("Error initializing assets directory:", err); - } } function generateSocialImageSection(app) { - return ` + return ` - + `; } -$(document).on("click", "#edit-app-social-image", async function(e) { - const res = await puter.ui.showOpenFilePicker({ - accept: "image/*", - }); - - const socialImage = await puter.fs.read(res.path); - // Convert blob to base64 for preview - const reader = new FileReader(); - reader.readAsDataURL(socialImage); - - reader.onloadend = function() { - let image = reader.result; - // Get file extension - let fileExtension = res.name.split(".").pop(); - // Get MIME type - let mimeType = getMimeType(fileExtension); - // Replace MIME type in the data URL - image = image.replace( - "data:application/octet-stream;base64", - `data:image/${mimeType};base64` - ); - $(document).on('click', '#edit-app-social-image', async function(e) { const res = await puter.ui.showOpenFilePicker({ @@ -2828,40 +2528,39 @@ $(document).on('click', '#edit-app-social-image', async function(e) { toggleSaveButton(); toggleResetButton(); } - }); -$(document).on("click", "#edit-app-social-image-delete", async function(e) { - $("#edit-app-social-image").css("background-image", ""); - $("#edit-app-social-image").removeAttr("data-url"); - $("#edit-app-social-image").removeAttr("data-base64"); - $("#edit-app-social-image-delete").hide(); +$(document).on('click', '#edit-app-social-image-delete', async function(e) { + $('#edit-app-social-image').css('background-image', ''); + $('#edit-app-social-image').removeAttr('data-url'); + $('#edit-app-social-image').removeAttr('data-base64'); + $('#edit-app-social-image-delete').hide(); }); async function handleSocialImageUpload(app_name, socialImageData) { - if (!socialImageData) return null; + if (!socialImageData) return null; - try { - const assets_url = await puter.kv.get("assets_url"); - if (!assets_url) throw new Error("Assets URL not found"); + try { + const assets_url = await puter.kv.get('assets_url'); + if (!assets_url) throw new Error('Assets URL not found'); - // Convert base64 to blob - const base64Response = await fetch(socialImageData); - const blob = await base64Response.blob(); + // Convert base64 to blob + const base64Response = await fetch(socialImageData); + const blob = await base64Response.blob(); - // Get assets directory path - const assetsDir = `/${authUsername}/AppData/${dev_center_uid}/assets`; + // Get assets directory path + const assetsDir = `/${authUsername}/AppData/${dev_center_uid}/assets`; + + // Upload new image + await puter.fs.upload( + new File([blob], `${app_name}.png`, { type: 'image/png' }), + assetsDir, + { overwrite: true } + ); - // Upload new image - await puter.fs.upload( - new File([blob], `${app_name}.png`, { type: "image/png" }), - assetsDir, - { overwrite: true } - ); - - return `${assets_url}/${app_name}.png`; - } catch (err) { - console.error("Error uploading social image:", err); - throw err; - } + return `${assets_url}/${app_name}.png`; + } catch (err) { + console.error('Error uploading social image:', err); + throw err; + } } diff --git a/src/dev-center/js/html-entities.js b/src/dev-center/js/html-entities.js index 150e74d0b..c233cb01e 100644 --- a/src/dev-center/js/html-entities.js +++ b/src/dev-center/js/html-entities.js @@ -1,4611 +1 @@ -(() => { - "use strict"; - var r, - e = { - 563: function (r, e, a) { - var t = - (this && this.__assign) || - function () { - return (t = - Object.assign || - function (r) { - for (var e, a = 1, t = arguments.length; a < t; a++) - for (var o in (e = arguments[a])) - Object.prototype.hasOwnProperty.call(e, o) && (r[o] = e[o]); - return r; - }).apply(this, arguments); - }; - Object.defineProperty(e, "__esModule", { value: !0 }); - var o = a(81), - c = a(687), - l = a(967), - s = t(t({}, o.namedReferences), { all: o.namedReferences.html5 }), - i = { - specialChars: /[<>'"&]/g, - nonAscii: - /(?:[<>'"&\u0080-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - nonAsciiPrintable: - /(?:[<>'"&\x01-\x08\x11-\x15\x17-\x1F\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - extensive: - /(?:[\x01-\x0c\x0e-\x1f\x21-\x2c\x2e-\x2f\x3a-\x40\x5b-\x60\x7b-\x7d\x7f-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, - }, - n = { mode: "specialChars", level: "all", numeric: "decimal" }; - e.encode = function (r, e) { - var a = - void 0 === (u = (c = void 0 === e ? n : e).mode) - ? "specialChars" - : u, - t = void 0 === (m = c.numeric) ? "decimal" : m, - o = c.level; - if (!r) return ""; - var c, - u, - p = i[a], - d = s[void 0 === o ? "all" : o].characters, - g = "hexadecimal" === t; - if (((p.lastIndex = 0), (c = p.exec(r)))) { - u = ""; - var m = 0; - do { - m !== c.index && (u += r.substring(m, c.index)); - var f = d[(o = c[0])]; - if (!f) { - var h = o.length > 1 ? l.getCodePoint(o, 0) : o.charCodeAt(0); - f = (g ? "" + h.toString(16) : "" + h) + ";"; - } - (u += f), (m = c.index + o.length); - } while ((c = p.exec(r))); - m !== r.length && (u += r.substring(m)); - } else u = r; - return u; - }; - var u = { scope: "body", level: "all" }, - p = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);/g, - d = /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+)[;=]?/g, - g = { - xml: { strict: p, attribute: d, body: o.bodyRegExps.xml }, - html4: { strict: p, attribute: d, body: o.bodyRegExps.html4 }, - html5: { strict: p, attribute: d, body: o.bodyRegExps.html5 }, - }, - m = t(t({}, g), { all: g.html5 }), - f = String.fromCharCode, - h = f(65533), - b = { level: "all" }; - (e.decodeEntity = function (r, e) { - var a = void 0 === (t = (void 0 === e ? b : e).level) ? "all" : t; - if (!r) return ""; - var t = r, - o = (r[r.length - 1], s[a].entities[r]); - if (o) t = o; - else if ("&" === r[0] && "#" === r[1]) { - var i = r[2], - n = - "x" == i || "X" == i - ? parseInt(r.substr(3), 16) - : parseInt(r.substr(2)); - t = - n >= 1114111 - ? h - : n > 65535 - ? l.fromCodePoint(n) - : f(c.numericUnicodeMap[n] || n); - } - return t; - }), - (e.decode = function (r, e) { - var a = void 0 === e ? u : e, - t = a.level, - o = void 0 === t ? "all" : t, - i = a.scope, - n = void 0 === i ? ("xml" === o ? "strict" : "body") : i; - if (!r) return ""; - var p = m[o][n], - d = s[o].entities, - g = "attribute" === n, - b = "strict" === n; - p.lastIndex = 0; - var v, - q = p.exec(r); - if (q) { - v = ""; - var y = 0; - do { - y !== q.index && (v += r.substring(y, q.index)); - var w = q[0], - x = w, - A = w[w.length - 1]; - if (g && "=" === A) x = w; - else if (b && ";" !== A) x = w; - else { - var E = d[w]; - if (E) x = E; - else if ("&" === w[0] && "#" === w[1]) { - var D = w[2], - k = - "x" == D || "X" == D - ? parseInt(w.substr(3), 16) - : parseInt(w.substr(2)); - x = - k >= 1114111 - ? h - : k > 65535 - ? l.fromCodePoint(k) - : f(c.numericUnicodeMap[k] || k); - } - } - (v += x), (y = q.index + w.length); - } while ((q = p.exec(r))); - y !== r.length && (v += r.substring(y)); - } else v = r; - return v; - }); - }, - 81: (r, e) => { - Object.defineProperty(e, "__esModule", { value: !0 }), - (e.bodyRegExps = { - xml: /&(?:#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g, - html4: - /&(?:nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|yuml|quot|amp|lt|gt|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g, - html5: - /&(?:AElig|AMP|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|GT|Iacute|Icirc|Igrave|Iuml|LT|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|QUOT|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|amp|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|gt|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|lt|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|quot|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml|#\d+|#[xX][\da-fA-F]+|[0-9a-zA-Z]+);?/g, - }), - (e.namedReferences = { - xml: { - entities: { - "<": "<", - ">": ">", - """: '"', - "'": "'", - "&": "&", - }, - characters: { - "<": "<", - ">": ">", - '"': """, - "'": "'", - "&": "&", - }, - }, - html4: { - entities: { - "'": "'", - " ": " ", - " ": " ", - "¡": "¡", - "¡": "¡", - "¢": "¢", - "¢": "¢", - "£": "£", - "£": "£", - "¤": "¤", - "¤": "¤", - "¥": "¥", - "¥": "¥", - "¦": "¦", - "¦": "¦", - "§": "§", - "§": "§", - "¨": "¨", - "¨": "¨", - "©": "©", - "©": "©", - "ª": "ª", - "ª": "ª", - "«": "«", - "«": "«", - "¬": "¬", - "¬": "¬", - "­": "", - "": "", - "®": "®", - "®": "®", - "¯": "¯", - "¯": "¯", - "°": "°", - "°": "°", - "±": "±", - "±": "±", - "²": "²", - "²": "²", - "³": "³", - "³": "³", - "´": "´", - "´": "´", - "µ": "µ", - "µ": "µ", - "¶": "¶", - "¶": "¶", - "·": "·", - "·": "·", - "¸": "¸", - "¸": "¸", - "¹": "¹", - "¹": "¹", - "º": "º", - "º": "º", - "»": "»", - "»": "»", - "¼": "¼", - "¼": "¼", - "½": "½", - "½": "½", - "¾": "¾", - "¾": "¾", - "¿": "¿", - "¿": "¿", - "À": "À", - "À": "À", - "Á": "Á", - "Á": "Á", - "Â": "Â", - "Â": "Â", - "Ã": "Ã", - "Ã": "Ã", - "Ä": "Ä", - "Ä": "Ä", - "Å": "Å", - "Å": "Å", - "Æ": "Æ", - "Æ": "Æ", - "Ç": "Ç", - "Ç": "Ç", - "È": "È", - "È": "È", - "É": "É", - "É": "É", - "Ê": "Ê", - "Ê": "Ê", - "Ë": "Ë", - "Ë": "Ë", - "Ì": "Ì", - "Ì": "Ì", - "Í": "Í", - "Í": "Í", - "Î": "Î", - "Î": "Î", - "Ï": "Ï", - "Ï": "Ï", - "Ð": "Ð", - "Ð": "Ð", - "Ñ": "Ñ", - "Ñ": "Ñ", - "Ò": "Ò", - "Ò": "Ò", - "Ó": "Ó", - "Ó": "Ó", - "Ô": "Ô", - "Ô": "Ô", - "Õ": "Õ", - "Õ": "Õ", - "Ö": "Ö", - "Ö": "Ö", - "×": "×", - "×": "×", - "Ø": "Ø", - "Ø": "Ø", - "Ù": "Ù", - "Ù": "Ù", - "Ú": "Ú", - "Ú": "Ú", - "Û": "Û", - "Û": "Û", - "Ü": "Ü", - "Ü": "Ü", - "Ý": "Ý", - "Ý": "Ý", - "Þ": "Þ", - "Þ": "Þ", - "ß": "ß", - "ß": "ß", - "à": "à", - "à": "à", - "á": "á", - "á": "á", - "â": "â", - "â": "â", - "ã": "ã", - "ã": "ã", - "ä": "ä", - "ä": "ä", - "å": "å", - "å": "å", - "æ": "æ", - "æ": "æ", - "ç": "ç", - "ç": "ç", - "è": "è", - "è": "è", - "é": "é", - "é": "é", - "ê": "ê", - "ê": "ê", - "ë": "ë", - "ë": "ë", - "ì": "ì", - "ì": "ì", - "í": "í", - "í": "í", - "î": "î", - "î": "î", - "ï": "ï", - "ï": "ï", - "ð": "ð", - "ð": "ð", - "ñ": "ñ", - "ñ": "ñ", - "ò": "ò", - "ò": "ò", - "ó": "ó", - "ó": "ó", - "ô": "ô", - "ô": "ô", - "õ": "õ", - "õ": "õ", - "ö": "ö", - "ö": "ö", - "÷": "÷", - "÷": "÷", - "ø": "ø", - "ø": "ø", - "ù": "ù", - "ù": "ù", - "ú": "ú", - "ú": "ú", - "û": "û", - "û": "û", - "ü": "ü", - "ü": "ü", - "ý": "ý", - "ý": "ý", - "þ": "þ", - "þ": "þ", - "ÿ": "ÿ", - "ÿ": "ÿ", - """: '"', - """: '"', - "&": "&", - "&": "&", - "<": "<", - "<": "<", - ">": ">", - ">": ">", - "Œ": "Œ", - "œ": "œ", - "Š": "Š", - "š": "š", - "Ÿ": "Ÿ", - "ˆ": "ˆ", - "˜": "˜", - " ": " ", - " ": " ", - " ": " ", - "": "", - "": "", - "": "", - "": "", - "–": "–", - "—": "—", - "‘": "‘", - "’": "’", - "‚": "‚", - "“": "“", - "”": "”", - "„": "„", - "†": "†", - "‡": "‡", - "‰": "‰", - "‹": "‹", - "›": "›", - "€": "€", - "ƒ": "ƒ", - "Α": "Α", - "Β": "Β", - "Γ": "Γ", - "Δ": "Δ", - "Ε": "Ε", - "Ζ": "Ζ", - "Η": "Η", - "Θ": "Θ", - "Ι": "Ι", - "Κ": "Κ", - "Λ": "Λ", - "Μ": "Μ", - "Ν": "Ν", - "Ξ": "Ξ", - "Ο": "Ο", - "Π": "Π", - "Ρ": "Ρ", - "Σ": "Σ", - "Τ": "Τ", - "Υ": "Υ", - "Φ": "Φ", - "Χ": "Χ", - "Ψ": "Ψ", - "Ω": "Ω", - "α": "α", - "β": "β", - "γ": "γ", - "δ": "δ", - "ε": "ε", - "ζ": "ζ", - "η": "η", - "θ": "θ", - "ι": "ι", - "κ": "κ", - "λ": "λ", - "μ": "μ", - "ν": "ν", - "ξ": "ξ", - "ο": "ο", - "π": "π", - "ρ": "ρ", - "ς": "ς", - "σ": "σ", - "τ": "τ", - "υ": "υ", - "φ": "φ", - "χ": "χ", - "ψ": "ψ", - "ω": "ω", - "ϑ": "ϑ", - "ϒ": "ϒ", - "ϖ": "ϖ", - "•": "•", - "…": "…", - "′": "′", - "″": "″", - "‾": "‾", - "⁄": "⁄", - "℘": "℘", - "ℑ": "ℑ", - "ℜ": "ℜ", - "™": "™", - "ℵ": "ℵ", - "←": "←", - "↑": "↑", - "→": "→", - "↓": "↓", - "↔": "↔", - "↵": "↵", - "⇐": "⇐", - "⇑": "⇑", - "⇒": "⇒", - "⇓": "⇓", - "⇔": "⇔", - "∀": "∀", - "∂": "∂", - "∃": "∃", - "∅": "∅", - "∇": "∇", - "∈": "∈", - "∉": "∉", - "∋": "∋", - "∏": "∏", - "∑": "∑", - "−": "−", - "∗": "∗", - "√": "√", - "∝": "∝", - "∞": "∞", - "∠": "∠", - "∧": "∧", - "∨": "∨", - "∩": "∩", - "∪": "∪", - "∫": "∫", - "∴": "∴", - "∼": "∼", - "≅": "≅", - "≈": "≈", - "≠": "≠", - "≡": "≡", - "≤": "≤", - "≥": "≥", - "⊂": "⊂", - "⊃": "⊃", - "⊄": "⊄", - "⊆": "⊆", - "⊇": "⊇", - "⊕": "⊕", - "⊗": "⊗", - "⊥": "⊥", - "⋅": "⋅", - "⌈": "⌈", - "⌉": "⌉", - "⌊": "⌊", - "⌋": "⌋", - "〈": "〈", - "〉": "〉", - "◊": "◊", - "♠": "♠", - "♣": "♣", - "♥": "♥", - "♦": "♦", - }, - characters: { - "'": "'", - " ": " ", - "¡": "¡", - "¢": "¢", - "£": "£", - "¤": "¤", - "¥": "¥", - "¦": "¦", - "§": "§", - "¨": "¨", - "©": "©", - ª: "ª", - "«": "«", - "¬": "¬", - "": "", - "®": "®", - "¯": "¯", - "°": "°", - "±": "±", - "²": "²", - "³": "³", - "´": "´", - µ: "µ", - "¶": "¶", - "·": "·", - "¸": "¸", - "¹": "¹", - º: "º", - "»": "»", - "¼": "¼", - "½": "½", - "¾": "¾", - "¿": "¿", - À: "À", - Á: "Á", - Â: "Â", - Ã: "Ã", - Ä: "Ä", - Å: "Å", - Æ: "Æ", - Ç: "Ç", - È: "È", - É: "É", - Ê: "Ê", - Ë: "Ë", - Ì: "Ì", - Í: "Í", - Î: "Î", - Ï: "Ï", - Ð: "Ð", - Ñ: "Ñ", - Ò: "Ò", - Ó: "Ó", - Ô: "Ô", - Õ: "Õ", - Ö: "Ö", - "×": "×", - Ø: "Ø", - Ù: "Ù", - Ú: "Ú", - Û: "Û", - Ü: "Ü", - Ý: "Ý", - Þ: "Þ", - ß: "ß", - à: "à", - á: "á", - â: "â", - ã: "ã", - ä: "ä", - å: "å", - æ: "æ", - ç: "ç", - è: "è", - é: "é", - ê: "ê", - ë: "ë", - ì: "ì", - í: "í", - î: "î", - ï: "ï", - ð: "ð", - ñ: "ñ", - ò: "ò", - ó: "ó", - ô: "ô", - õ: "õ", - ö: "ö", - "÷": "÷", - ø: "ø", - ù: "ù", - ú: "ú", - û: "û", - ü: "ü", - ý: "ý", - þ: "þ", - ÿ: "ÿ", - '"': """, - "&": "&", - "<": "<", - ">": ">", - Œ: "Œ", - œ: "œ", - Š: "Š", - š: "š", - Ÿ: "Ÿ", - ˆ: "ˆ", - "˜": "˜", - " ": " ", - " ": " ", - " ": " ", - "": "", - "": "", - "": "", - "": "", - "–": "–", - "—": "—", - "‘": "‘", - "’": "’", - "‚": "‚", - "“": "“", - "”": "”", - "„": "„", - "†": "†", - "‡": "‡", - "‰": "‰", - "‹": "‹", - "›": "›", - "€": "€", - ƒ: "ƒ", - Α: "Α", - Β: "Β", - Γ: "Γ", - Δ: "Δ", - Ε: "Ε", - Ζ: "Ζ", - Η: "Η", - Θ: "Θ", - Ι: "Ι", - Κ: "Κ", - Λ: "Λ", - Μ: "Μ", - Ν: "Ν", - Ξ: "Ξ", - Ο: "Ο", - Π: "Π", - Ρ: "Ρ", - Σ: "Σ", - Τ: "Τ", - Υ: "Υ", - Φ: "Φ", - Χ: "Χ", - Ψ: "Ψ", - Ω: "Ω", - α: "α", - β: "β", - γ: "γ", - δ: "δ", - ε: "ε", - ζ: "ζ", - η: "η", - θ: "θ", - ι: "ι", - κ: "κ", - λ: "λ", - μ: "μ", - ν: "ν", - ξ: "ξ", - ο: "ο", - π: "π", - ρ: "ρ", - ς: "ς", - σ: "σ", - τ: "τ", - υ: "υ", - φ: "φ", - χ: "χ", - ψ: "ψ", - ω: "ω", - ϑ: "ϑ", - ϒ: "ϒ", - ϖ: "ϖ", - "•": "•", - "…": "…", - "′": "′", - "″": "″", - "‾": "‾", - "⁄": "⁄", - ℘: "℘", - ℑ: "ℑ", - ℜ: "ℜ", - "™": "™", - ℵ: "ℵ", - "←": "←", - "↑": "↑", - "→": "→", - "↓": "↓", - "↔": "↔", - "↵": "↵", - "⇐": "⇐", - "⇑": "⇑", - "⇒": "⇒", - "⇓": "⇓", - "⇔": "⇔", - "∀": "∀", - "∂": "∂", - "∃": "∃", - "∅": "∅", - "∇": "∇", - "∈": "∈", - "∉": "∉", - "∋": "∋", - "∏": "∏", - "∑": "∑", - "−": "−", - "∗": "∗", - "√": "√", - "∝": "∝", - "∞": "∞", - "∠": "∠", - "∧": "∧", - "∨": "∨", - "∩": "∩", - "∪": "∪", - "∫": "∫", - "∴": "∴", - "∼": "∼", - "≅": "≅", - "≈": "≈", - "≠": "≠", - "≡": "≡", - "≤": "≤", - "≥": "≥", - "⊂": "⊂", - "⊃": "⊃", - "⊄": "⊄", - "⊆": "⊆", - "⊇": "⊇", - "⊕": "⊕", - "⊗": "⊗", - "⊥": "⊥", - "⋅": "⋅", - "⌈": "⌈", - "⌉": "⌉", - "⌊": "⌊", - "⌋": "⌋", - "〈": "〈", - "〉": "〉", - "◊": "◊", - "♠": "♠", - "♣": "♣", - "♥": "♥", - "♦": "♦", - }, - }, - html5: { - entities: { - "Æ": "Æ", - "Æ": "Æ", - "&": "&", - "&": "&", - "Á": "Á", - "Á": "Á", - "Ă": "Ă", - "Â": "Â", - "Â": "Â", - "А": "А", - "𝔄": "𝔄", - "À": "À", - "À": "À", - "Α": "Α", - "Ā": "Ā", - "⩓": "⩓", - "Ą": "Ą", - "𝔸": "𝔸", - "⁡": "", - "Å": "Å", - "Å": "Å", - "𝒜": "𝒜", - "≔": "≔", - "Ã": "Ã", - "Ã": "Ã", - "Ä": "Ä", - "Ä": "Ä", - "∖": "∖", - "⫧": "⫧", - "⌆": "⌆", - "Б": "Б", - "∵": "∵", - "ℬ": "ℬ", - "Β": "Β", - "𝔅": "𝔅", - "𝔹": "𝔹", - "˘": "˘", - "ℬ": "ℬ", - "≎": "≎", - "Ч": "Ч", - "©": "©", - "©": "©", - "Ć": "Ć", - "⋒": "⋒", - "ⅅ": "ⅅ", - "ℭ": "ℭ", - "Č": "Č", - "Ç": "Ç", - "Ç": "Ç", - "Ĉ": "Ĉ", - "∰": "∰", - "Ċ": "Ċ", - "¸": "¸", - "·": "·", - "ℭ": "ℭ", - "Χ": "Χ", - "⊙": "⊙", - "⊖": "⊖", - "⊕": "⊕", - "⊗": "⊗", - "∲": "∲", - "”": "”", - "’": "’", - "∷": "∷", - "⩴": "⩴", - "≡": "≡", - "∯": "∯", - "∮": "∮", - "ℂ": "ℂ", - "∐": "∐", - "∳": "∳", - "⨯": "⨯", - "𝒞": "𝒞", - "⋓": "⋓", - "≍": "≍", - "ⅅ": "ⅅ", - "⤑": "⤑", - "Ђ": "Ђ", - "Ѕ": "Ѕ", - "Џ": "Џ", - "‡": "‡", - "↡": "↡", - "⫤": "⫤", - "Ď": "Ď", - "Д": "Д", - "∇": "∇", - "Δ": "Δ", - "𝔇": "𝔇", - "´": "´", - "˙": "˙", - "˝": "˝", - "`": "`", - "˜": "˜", - "⋄": "⋄", - "ⅆ": "ⅆ", - "𝔻": "𝔻", - "¨": "¨", - "⃜": "⃜", - "≐": "≐", - "∯": "∯", - "¨": "¨", - "⇓": "⇓", - "⇐": "⇐", - "⇔": "⇔", - "⫤": "⫤", - "⟸": "⟸", - "⟺": "⟺", - "⟹": "⟹", - "⇒": "⇒", - "⊨": "⊨", - "⇑": "⇑", - "⇕": "⇕", - "∥": "∥", - "↓": "↓", - "⤓": "⤓", - "⇵": "⇵", - "̑": "̑", - "⥐": "⥐", - "⥞": "⥞", - "↽": "↽", - "⥖": "⥖", - "⥟": "⥟", - "⇁": "⇁", - "⥗": "⥗", - "⊤": "⊤", - "↧": "↧", - "⇓": "⇓", - "𝒟": "𝒟", - "Đ": "Đ", - "Ŋ": "Ŋ", - "Ð": "Ð", - "Ð": "Ð", - "É": "É", - "É": "É", - "Ě": "Ě", - "Ê": "Ê", - "Ê": "Ê", - "Э": "Э", - "Ė": "Ė", - "𝔈": "𝔈", - "È": "È", - "È": "È", - "∈": "∈", - "Ē": "Ē", - "◻": "◻", - "▫": "▫", - "Ę": "Ę", - "𝔼": "𝔼", - "Ε": "Ε", - "⩵": "⩵", - "≂": "≂", - "⇌": "⇌", - "ℰ": "ℰ", - "⩳": "⩳", - "Η": "Η", - "Ë": "Ë", - "Ë": "Ë", - "∃": "∃", - "ⅇ": "ⅇ", - "Ф": "Ф", - "𝔉": "𝔉", - "◼": "◼", - "▪": "▪", - "𝔽": "𝔽", - "∀": "∀", - "ℱ": "ℱ", - "ℱ": "ℱ", - "Ѓ": "Ѓ", - ">": ">", - ">": ">", - "Γ": "Γ", - "Ϝ": "Ϝ", - "Ğ": "Ğ", - "Ģ": "Ģ", - "Ĝ": "Ĝ", - "Г": "Г", - "Ġ": "Ġ", - "𝔊": "𝔊", - "⋙": "⋙", - "𝔾": "𝔾", - "≥": "≥", - "⋛": "⋛", - "≧": "≧", - "⪢": "⪢", - "≷": "≷", - "⩾": "⩾", - "≳": "≳", - "𝒢": "𝒢", - "≫": "≫", - "Ъ": "Ъ", - "ˇ": "ˇ", - "^": "^", - "Ĥ": "Ĥ", - "ℌ": "ℌ", - "ℋ": "ℋ", - "ℍ": "ℍ", - "─": "─", - "ℋ": "ℋ", - "Ħ": "Ħ", - "≎": "≎", - "≏": "≏", - "Е": "Е", - "IJ": "IJ", - "Ё": "Ё", - "Í": "Í", - "Í": "Í", - "Î": "Î", - "Î": "Î", - "И": "И", - "İ": "İ", - "ℑ": "ℑ", - "Ì": "Ì", - "Ì": "Ì", - "ℑ": "ℑ", - "Ī": "Ī", - "ⅈ": "ⅈ", - "⇒": "⇒", - "∬": "∬", - "∫": "∫", - "⋂": "⋂", - "⁣": "", - "⁢": "", - "Į": "Į", - "𝕀": "𝕀", - "Ι": "Ι", - "ℐ": "ℐ", - "Ĩ": "Ĩ", - "І": "І", - "Ï": "Ï", - "Ï": "Ï", - "Ĵ": "Ĵ", - "Й": "Й", - "𝔍": "𝔍", - "𝕁": "𝕁", - "𝒥": "𝒥", - "Ј": "Ј", - "Є": "Є", - "Х": "Х", - "Ќ": "Ќ", - "Κ": "Κ", - "Ķ": "Ķ", - "К": "К", - "𝔎": "𝔎", - "𝕂": "𝕂", - "𝒦": "𝒦", - "Љ": "Љ", - "<": "<", - "<": "<", - "Ĺ": "Ĺ", - "Λ": "Λ", - "⟪": "⟪", - "ℒ": "ℒ", - "↞": "↞", - "Ľ": "Ľ", - "Ļ": "Ļ", - "Л": "Л", - "⟨": "⟨", - "←": "←", - "⇤": "⇤", - "⇆": "⇆", - "⌈": "⌈", - "⟦": "⟦", - "⥡": "⥡", - "⇃": "⇃", - "⥙": "⥙", - "⌊": "⌊", - "↔": "↔", - "⥎": "⥎", - "⊣": "⊣", - "↤": "↤", - "⥚": "⥚", - "⊲": "⊲", - "⧏": "⧏", - "⊴": "⊴", - "⥑": "⥑", - "⥠": "⥠", - "↿": "↿", - "⥘": "⥘", - "↼": "↼", - "⥒": "⥒", - "⇐": "⇐", - "⇔": "⇔", - "⋚": "⋚", - "≦": "≦", - "≶": "≶", - "⪡": "⪡", - "⩽": "⩽", - "≲": "≲", - "𝔏": "𝔏", - "⋘": "⋘", - "⇚": "⇚", - "Ŀ": "Ŀ", - "⟵": "⟵", - "⟷": "⟷", - "⟶": "⟶", - "⟸": "⟸", - "⟺": "⟺", - "⟹": "⟹", - "𝕃": "𝕃", - "↙": "↙", - "↘": "↘", - "ℒ": "ℒ", - "↰": "↰", - "Ł": "Ł", - "≪": "≪", - "⤅": "⤅", - "М": "М", - " ": " ", - "ℳ": "ℳ", - "𝔐": "𝔐", - "∓": "∓", - "𝕄": "𝕄", - "ℳ": "ℳ", - "Μ": "Μ", - "Њ": "Њ", - "Ń": "Ń", - "Ň": "Ň", - "Ņ": "Ņ", - "Н": "Н", - "​": "", - "​": "", - "​": "", - "​": "", - "≫": "≫", - "≪": "≪", - "
": "\n", - "𝔑": "𝔑", - "⁠": "", - " ": " ", - "ℕ": "ℕ", - "⫬": "⫬", - "≢": "≢", - "≭": "≭", - "∦": "∦", - "∉": "∉", - "≠": "≠", - "≂̸": "≂̸", - "∄": "∄", - "≯": "≯", - "≱": "≱", - "≧̸": "≧̸", - "≫̸": "≫̸", - "≹": "≹", - "⩾̸": "⩾̸", - "≵": "≵", - "≎̸": "≎̸", - "≏̸": "≏̸", - "⋪": "⋪", - "⧏̸": "⧏̸", - "⋬": "⋬", - "≮": "≮", - "≰": "≰", - "≸": "≸", - "≪̸": "≪̸", - "⩽̸": "⩽̸", - "≴": "≴", - "⪢̸": "⪢̸", - "⪡̸": "⪡̸", - "⊀": "⊀", - "⪯̸": "⪯̸", - "⋠": "⋠", - "∌": "∌", - "⋫": "⋫", - "⧐̸": "⧐̸", - "⋭": "⋭", - "⊏̸": "⊏̸", - "⋢": "⋢", - "⊐̸": "⊐̸", - "⋣": "⋣", - "⊂⃒": "⊂⃒", - "⊈": "⊈", - "⊁": "⊁", - "⪰̸": "⪰̸", - "⋡": "⋡", - "≿̸": "≿̸", - "⊃⃒": "⊃⃒", - "⊉": "⊉", - "≁": "≁", - "≄": "≄", - "≇": "≇", - "≉": "≉", - "∤": "∤", - "𝒩": "𝒩", - "Ñ": "Ñ", - "Ñ": "Ñ", - "Ν": "Ν", - "Œ": "Œ", - "Ó": "Ó", - "Ó": "Ó", - "Ô": "Ô", - "Ô": "Ô", - "О": "О", - "Ő": "Ő", - "𝔒": "𝔒", - "Ò": "Ò", - "Ò": "Ò", - "Ō": "Ō", - "Ω": "Ω", - "Ο": "Ο", - "𝕆": "𝕆", - "“": "“", - "‘": "‘", - "⩔": "⩔", - "𝒪": "𝒪", - "Ø": "Ø", - "Ø": "Ø", - "Õ": "Õ", - "Õ": "Õ", - "⨷": "⨷", - "Ö": "Ö", - "Ö": "Ö", - "‾": "‾", - "⏞": "⏞", - "⎴": "⎴", - "⏜": "⏜", - "∂": "∂", - "П": "П", - "𝔓": "𝔓", - "Φ": "Φ", - "Π": "Π", - "±": "±", - "ℌ": "ℌ", - "ℙ": "ℙ", - "⪻": "⪻", - "≺": "≺", - "⪯": "⪯", - "≼": "≼", - "≾": "≾", - "″": "″", - "∏": "∏", - "∷": "∷", - "∝": "∝", - "𝒫": "𝒫", - "Ψ": "Ψ", - """: '"', - """: '"', - "𝔔": "𝔔", - "ℚ": "ℚ", - "𝒬": "𝒬", - "⤐": "⤐", - "®": "®", - "®": "®", - "Ŕ": "Ŕ", - "⟫": "⟫", - "↠": "↠", - "⤖": "⤖", - "Ř": "Ř", - "Ŗ": "Ŗ", - "Р": "Р", - "ℜ": "ℜ", - "∋": "∋", - "⇋": "⇋", - "⥯": "⥯", - "ℜ": "ℜ", - "Ρ": "Ρ", - "⟩": "⟩", - "→": "→", - "⇥": "⇥", - "⇄": "⇄", - "⌉": "⌉", - "⟧": "⟧", - "⥝": "⥝", - "⇂": "⇂", - "⥕": "⥕", - "⌋": "⌋", - "⊢": "⊢", - "↦": "↦", - "⥛": "⥛", - "⊳": "⊳", - "⧐": "⧐", - "⊵": "⊵", - "⥏": "⥏", - "⥜": "⥜", - "↾": "↾", - "⥔": "⥔", - "⇀": "⇀", - "⥓": "⥓", - "⇒": "⇒", - "ℝ": "ℝ", - "⥰": "⥰", - "⇛": "⇛", - "ℛ": "ℛ", - "↱": "↱", - "⧴": "⧴", - "Щ": "Щ", - "Ш": "Ш", - "Ь": "Ь", - "Ś": "Ś", - "⪼": "⪼", - "Š": "Š", - "Ş": "Ş", - "Ŝ": "Ŝ", - "С": "С", - "𝔖": "𝔖", - "↓": "↓", - "←": "←", - "→": "→", - "↑": "↑", - "Σ": "Σ", - "∘": "∘", - "𝕊": "𝕊", - "√": "√", - "□": "□", - "⊓": "⊓", - "⊏": "⊏", - "⊑": "⊑", - "⊐": "⊐", - "⊒": "⊒", - "⊔": "⊔", - "𝒮": "𝒮", - "⋆": "⋆", - "⋐": "⋐", - "⋐": "⋐", - "⊆": "⊆", - "≻": "≻", - "⪰": "⪰", - "≽": "≽", - "≿": "≿", - "∋": "∋", - "∑": "∑", - "⋑": "⋑", - "⊃": "⊃", - "⊇": "⊇", - "⋑": "⋑", - "Þ": "Þ", - "Þ": "Þ", - "™": "™", - "Ћ": "Ћ", - "Ц": "Ц", - "	": "\t", - "Τ": "Τ", - "Ť": "Ť", - "Ţ": "Ţ", - "Т": "Т", - "𝔗": "𝔗", - "∴": "∴", - "Θ": "Θ", - "  ": " ", - " ": " ", - "∼": "∼", - "≃": "≃", - "≅": "≅", - "≈": "≈", - "𝕋": "𝕋", - "⃛": "⃛", - "𝒯": "𝒯", - "Ŧ": "Ŧ", - "Ú": "Ú", - "Ú": "Ú", - "↟": "↟", - "⥉": "⥉", - "Ў": "Ў", - "Ŭ": "Ŭ", - "Û": "Û", - "Û": "Û", - "У": "У", - "Ű": "Ű", - "𝔘": "𝔘", - "Ù": "Ù", - "Ù": "Ù", - "Ū": "Ū", - "_": "_", - "⏟": "⏟", - "⎵": "⎵", - "⏝": "⏝", - "⋃": "⋃", - "⊎": "⊎", - "Ų": "Ų", - "𝕌": "𝕌", - "↑": "↑", - "⤒": "⤒", - "⇅": "⇅", - "↕": "↕", - "⥮": "⥮", - "⊥": "⊥", - "↥": "↥", - "⇑": "⇑", - "⇕": "⇕", - "↖": "↖", - "↗": "↗", - "ϒ": "ϒ", - "Υ": "Υ", - "Ů": "Ů", - "𝒰": "𝒰", - "Ũ": "Ũ", - "Ü": "Ü", - "Ü": "Ü", - "⊫": "⊫", - "⫫": "⫫", - "В": "В", - "⊩": "⊩", - "⫦": "⫦", - "⋁": "⋁", - "‖": "‖", - "‖": "‖", - "∣": "∣", - "|": "|", - "❘": "❘", - "≀": "≀", - " ": " ", - "𝔙": "𝔙", - "𝕍": "𝕍", - "𝒱": "𝒱", - "⊪": "⊪", - "Ŵ": "Ŵ", - "⋀": "⋀", - "𝔚": "𝔚", - "𝕎": "𝕎", - "𝒲": "𝒲", - "𝔛": "𝔛", - "Ξ": "Ξ", - "𝕏": "𝕏", - "𝒳": "𝒳", - "Я": "Я", - "Ї": "Ї", - "Ю": "Ю", - "Ý": "Ý", - "Ý": "Ý", - "Ŷ": "Ŷ", - "Ы": "Ы", - "𝔜": "𝔜", - "𝕐": "𝕐", - "𝒴": "𝒴", - "Ÿ": "Ÿ", - "Ж": "Ж", - "Ź": "Ź", - "Ž": "Ž", - "З": "З", - "Ż": "Ż", - "​": "", - "Ζ": "Ζ", - "ℨ": "ℨ", - "ℤ": "ℤ", - "𝒵": "𝒵", - "á": "á", - "á": "á", - "ă": "ă", - "∾": "∾", - "∾̳": "∾̳", - "∿": "∿", - "â": "â", - "â": "â", - "´": "´", - "´": "´", - "а": "а", - "æ": "æ", - "æ": "æ", - "⁡": "", - "𝔞": "𝔞", - "à": "à", - "à": "à", - "ℵ": "ℵ", - "ℵ": "ℵ", - "α": "α", - "ā": "ā", - "⨿": "⨿", - "&": "&", - "&": "&", - "∧": "∧", - "⩕": "⩕", - "⩜": "⩜", - "⩘": "⩘", - "⩚": "⩚", - "∠": "∠", - "⦤": "⦤", - "∠": "∠", - "∡": "∡", - "⦨": "⦨", - "⦩": "⦩", - "⦪": "⦪", - "⦫": "⦫", - "⦬": "⦬", - "⦭": "⦭", - "⦮": "⦮", - "⦯": "⦯", - "∟": "∟", - "⊾": "⊾", - "⦝": "⦝", - "∢": "∢", - "Å": "Å", - "⍼": "⍼", - "ą": "ą", - "𝕒": "𝕒", - "≈": "≈", - "⩰": "⩰", - "⩯": "⩯", - "≊": "≊", - "≋": "≋", - "'": "'", - "≈": "≈", - "≊": "≊", - "å": "å", - "å": "å", - "𝒶": "𝒶", - "*": "*", - "≈": "≈", - "≍": "≍", - "ã": "ã", - "ã": "ã", - "ä": "ä", - "ä": "ä", - "∳": "∳", - "⨑": "⨑", - "⫭": "⫭", - "≌": "≌", - "϶": "϶", - "‵": "‵", - "∽": "∽", - "⋍": "⋍", - "⊽": "⊽", - "⌅": "⌅", - "⌅": "⌅", - "⎵": "⎵", - "⎶": "⎶", - "≌": "≌", - "б": "б", - "„": "„", - "∵": "∵", - "∵": "∵", - "⦰": "⦰", - "϶": "϶", - "ℬ": "ℬ", - "β": "β", - "ℶ": "ℶ", - "≬": "≬", - "𝔟": "𝔟", - "⋂": "⋂", - "◯": "◯", - "⋃": "⋃", - "⨀": "⨀", - "⨁": "⨁", - "⨂": "⨂", - "⨆": "⨆", - "★": "★", - "▽": "▽", - "△": "△", - "⨄": "⨄", - "⋁": "⋁", - "⋀": "⋀", - "⤍": "⤍", - "⧫": "⧫", - "▪": "▪", - "▴": "▴", - "▾": "▾", - "◂": "◂", - "▸": "▸", - "␣": "␣", - "▒": "▒", - "░": "░", - "▓": "▓", - "█": "█", - "=⃥": "=⃥", - "≡⃥": "≡⃥", - "⌐": "⌐", - "𝕓": "𝕓", - "⊥": "⊥", - "⊥": "⊥", - "⋈": "⋈", - "╗": "╗", - "╔": "╔", - "╖": "╖", - "╓": "╓", - "═": "═", - "╦": "╦", - "╩": "╩", - "╤": "╤", - "╧": "╧", - "╝": "╝", - "╚": "╚", - "╜": "╜", - "╙": "╙", - "║": "║", - "╬": "╬", - "╣": "╣", - "╠": "╠", - "╫": "╫", - "╢": "╢", - "╟": "╟", - "⧉": "⧉", - "╕": "╕", - "╒": "╒", - "┐": "┐", - "┌": "┌", - "─": "─", - "╥": "╥", - "╨": "╨", - "┬": "┬", - "┴": "┴", - "⊟": "⊟", - "⊞": "⊞", - "⊠": "⊠", - "╛": "╛", - "╘": "╘", - "┘": "┘", - "└": "└", - "│": "│", - "╪": "╪", - "╡": "╡", - "╞": "╞", - "┼": "┼", - "┤": "┤", - "├": "├", - "‵": "‵", - "˘": "˘", - "¦": "¦", - "¦": "¦", - "𝒷": "𝒷", - "⁏": "⁏", - "∽": "∽", - "⋍": "⋍", - "\": "\\", - "⧅": "⧅", - "⟈": "⟈", - "•": "•", - "•": "•", - "≎": "≎", - "⪮": "⪮", - "≏": "≏", - "≏": "≏", - "ć": "ć", - "∩": "∩", - "⩄": "⩄", - "⩉": "⩉", - "⩋": "⩋", - "⩇": "⩇", - "⩀": "⩀", - "∩︀": "∩︀", - "⁁": "⁁", - "ˇ": "ˇ", - "⩍": "⩍", - "č": "č", - "ç": "ç", - "ç": "ç", - "ĉ": "ĉ", - "⩌": "⩌", - "⩐": "⩐", - "ċ": "ċ", - "¸": "¸", - "¸": "¸", - "⦲": "⦲", - "¢": "¢", - "¢": "¢", - "·": "·", - "𝔠": "𝔠", - "ч": "ч", - "✓": "✓", - "✓": "✓", - "χ": "χ", - "○": "○", - "⧃": "⧃", - "ˆ": "ˆ", - "≗": "≗", - "↺": "↺", - "↻": "↻", - "®": "®", - "Ⓢ": "Ⓢ", - "⊛": "⊛", - "⊚": "⊚", - "⊝": "⊝", - "≗": "≗", - "⨐": "⨐", - "⫯": "⫯", - "⧂": "⧂", - "♣": "♣", - "♣": "♣", - ":": ":", - "≔": "≔", - "≔": "≔", - ",": ",", - "@": "@", - "∁": "∁", - "∘": "∘", - "∁": "∁", - "ℂ": "ℂ", - "≅": "≅", - "⩭": "⩭", - "∮": "∮", - "𝕔": "𝕔", - "∐": "∐", - "©": "©", - "©": "©", - "℗": "℗", - "↵": "↵", - "✗": "✗", - "𝒸": "𝒸", - "⫏": "⫏", - "⫑": "⫑", - "⫐": "⫐", - "⫒": "⫒", - "⋯": "⋯", - "⤸": "⤸", - "⤵": "⤵", - "⋞": "⋞", - "⋟": "⋟", - "↶": "↶", - "⤽": "⤽", - "∪": "∪", - "⩈": "⩈", - "⩆": "⩆", - "⩊": "⩊", - "⊍": "⊍", - "⩅": "⩅", - "∪︀": "∪︀", - "↷": "↷", - "⤼": "⤼", - "⋞": "⋞", - "⋟": "⋟", - "⋎": "⋎", - "⋏": "⋏", - "¤": "¤", - "¤": "¤", - "↶": "↶", - "↷": "↷", - "⋎": "⋎", - "⋏": "⋏", - "∲": "∲", - "∱": "∱", - "⌭": "⌭", - "⇓": "⇓", - "⥥": "⥥", - "†": "†", - "ℸ": "ℸ", - "↓": "↓", - "‐": "‐", - "⊣": "⊣", - "⤏": "⤏", - "˝": "˝", - "ď": "ď", - "д": "д", - "ⅆ": "ⅆ", - "‡": "‡", - "⇊": "⇊", - "⩷": "⩷", - "°": "°", - "°": "°", - "δ": "δ", - "⦱": "⦱", - "⥿": "⥿", - "𝔡": "𝔡", - "⇃": "⇃", - "⇂": "⇂", - "⋄": "⋄", - "⋄": "⋄", - "♦": "♦", - "♦": "♦", - "¨": "¨", - "ϝ": "ϝ", - "⋲": "⋲", - "÷": "÷", - "÷": "÷", - "÷": "÷", - "⋇": "⋇", - "⋇": "⋇", - "ђ": "ђ", - "⌞": "⌞", - "⌍": "⌍", - "$": "$", - "𝕕": "𝕕", - "˙": "˙", - "≐": "≐", - "≑": "≑", - "∸": "∸", - "∔": "∔", - "⊡": "⊡", - "⌆": "⌆", - "↓": "↓", - "⇊": "⇊", - "⇃": "⇃", - "⇂": "⇂", - "⤐": "⤐", - "⌟": "⌟", - "⌌": "⌌", - "𝒹": "𝒹", - "ѕ": "ѕ", - "⧶": "⧶", - "đ": "đ", - "⋱": "⋱", - "▿": "▿", - "▾": "▾", - "⇵": "⇵", - "⥯": "⥯", - "⦦": "⦦", - "џ": "џ", - "⟿": "⟿", - "⩷": "⩷", - "≑": "≑", - "é": "é", - "é": "é", - "⩮": "⩮", - "ě": "ě", - "≖": "≖", - "ê": "ê", - "ê": "ê", - "≕": "≕", - "э": "э", - "ė": "ė", - "ⅇ": "ⅇ", - "≒": "≒", - "𝔢": "𝔢", - "⪚": "⪚", - "è": "è", - "è": "è", - "⪖": "⪖", - "⪘": "⪘", - "⪙": "⪙", - "⏧": "⏧", - "ℓ": "ℓ", - "⪕": "⪕", - "⪗": "⪗", - "ē": "ē", - "∅": "∅", - "∅": "∅", - "∅": "∅", - " ": " ", - " ": " ", - " ": " ", - "ŋ": "ŋ", - " ": " ", - "ę": "ę", - "𝕖": "𝕖", - "⋕": "⋕", - "⧣": "⧣", - "⩱": "⩱", - "ε": "ε", - "ε": "ε", - "ϵ": "ϵ", - "≖": "≖", - "≕": "≕", - "≂": "≂", - "⪖": "⪖", - "⪕": "⪕", - "=": "=", - "≟": "≟", - "≡": "≡", - "⩸": "⩸", - "⧥": "⧥", - "≓": "≓", - "⥱": "⥱", - "ℯ": "ℯ", - "≐": "≐", - "≂": "≂", - "η": "η", - "ð": "ð", - "ð": "ð", - "ë": "ë", - "ë": "ë", - "€": "€", - "!": "!", - "∃": "∃", - "ℰ": "ℰ", - "ⅇ": "ⅇ", - "≒": "≒", - "ф": "ф", - "♀": "♀", - "ffi": "ffi", - "ff": "ff", - "ffl": "ffl", - "𝔣": "𝔣", - "fi": "fi", - "fj": "fj", - "♭": "♭", - "fl": "fl", - "▱": "▱", - "ƒ": "ƒ", - "𝕗": "𝕗", - "∀": "∀", - "⋔": "⋔", - "⫙": "⫙", - "⨍": "⨍", - "½": "½", - "½": "½", - "⅓": "⅓", - "¼": "¼", - "¼": "¼", - "⅕": "⅕", - "⅙": "⅙", - "⅛": "⅛", - "⅔": "⅔", - "⅖": "⅖", - "¾": "¾", - "¾": "¾", - "⅗": "⅗", - "⅜": "⅜", - "⅘": "⅘", - "⅚": "⅚", - "⅝": "⅝", - "⅞": "⅞", - "⁄": "⁄", - "⌢": "⌢", - "𝒻": "𝒻", - "≧": "≧", - "⪌": "⪌", - "ǵ": "ǵ", - "γ": "γ", - "ϝ": "ϝ", - "⪆": "⪆", - "ğ": "ğ", - "ĝ": "ĝ", - "г": "г", - "ġ": "ġ", - "≥": "≥", - "⋛": "⋛", - "≥": "≥", - "≧": "≧", - "⩾": "⩾", - "⩾": "⩾", - "⪩": "⪩", - "⪀": "⪀", - "⪂": "⪂", - "⪄": "⪄", - "⋛︀": "⋛︀", - "⪔": "⪔", - "𝔤": "𝔤", - "≫": "≫", - "⋙": "⋙", - "ℷ": "ℷ", - "ѓ": "ѓ", - "≷": "≷", - "⪒": "⪒", - "⪥": "⪥", - "⪤": "⪤", - "≩": "≩", - "⪊": "⪊", - "⪊": "⪊", - "⪈": "⪈", - "⪈": "⪈", - "≩": "≩", - "⋧": "⋧", - "𝕘": "𝕘", - "`": "`", - "ℊ": "ℊ", - "≳": "≳", - "⪎": "⪎", - "⪐": "⪐", - ">": ">", - ">": ">", - "⪧": "⪧", - "⩺": "⩺", - "⋗": "⋗", - "⦕": "⦕", - "⩼": "⩼", - "⪆": "⪆", - "⥸": "⥸", - "⋗": "⋗", - "⋛": "⋛", - "⪌": "⪌", - "≷": "≷", - "≳": "≳", - "≩︀": "≩︀", - "≩︀": "≩︀", - "⇔": "⇔", - " ": " ", - "½": "½", - "ℋ": "ℋ", - "ъ": "ъ", - "↔": "↔", - "⥈": "⥈", - "↭": "↭", - "ℏ": "ℏ", - "ĥ": "ĥ", - "♥": "♥", - "♥": "♥", - "…": "…", - "⊹": "⊹", - "𝔥": "𝔥", - "⤥": "⤥", - "⤦": "⤦", - "⇿": "⇿", - "∻": "∻", - "↩": "↩", - "↪": "↪", - "𝕙": "𝕙", - "―": "―", - "𝒽": "𝒽", - "ℏ": "ℏ", - "ħ": "ħ", - "⁃": "⁃", - "‐": "‐", - "í": "í", - "í": "í", - "⁣": "", - "î": "î", - "î": "î", - "и": "и", - "е": "е", - "¡": "¡", - "¡": "¡", - "⇔": "⇔", - "𝔦": "𝔦", - "ì": "ì", - "ì": "ì", - "ⅈ": "ⅈ", - "⨌": "⨌", - "∭": "∭", - "⧜": "⧜", - "℩": "℩", - "ij": "ij", - "ī": "ī", - "ℑ": "ℑ", - "ℐ": "ℐ", - "ℑ": "ℑ", - "ı": "ı", - "⊷": "⊷", - "Ƶ": "Ƶ", - "∈": "∈", - "℅": "℅", - "∞": "∞", - "⧝": "⧝", - "ı": "ı", - "∫": "∫", - "⊺": "⊺", - "ℤ": "ℤ", - "⊺": "⊺", - "⨗": "⨗", - "⨼": "⨼", - "ё": "ё", - "į": "į", - "𝕚": "𝕚", - "ι": "ι", - "⨼": "⨼", - "¿": "¿", - "¿": "¿", - "𝒾": "𝒾", - "∈": "∈", - "⋹": "⋹", - "⋵": "⋵", - "⋴": "⋴", - "⋳": "⋳", - "∈": "∈", - "⁢": "", - "ĩ": "ĩ", - "і": "і", - "ï": "ï", - "ï": "ï", - "ĵ": "ĵ", - "й": "й", - "𝔧": "𝔧", - "ȷ": "ȷ", - "𝕛": "𝕛", - "𝒿": "𝒿", - "ј": "ј", - "є": "є", - "κ": "κ", - "ϰ": "ϰ", - "ķ": "ķ", - "к": "к", - "𝔨": "𝔨", - "ĸ": "ĸ", - "х": "х", - "ќ": "ќ", - "𝕜": "𝕜", - "𝓀": "𝓀", - "⇚": "⇚", - "⇐": "⇐", - "⤛": "⤛", - "⤎": "⤎", - "≦": "≦", - "⪋": "⪋", - "⥢": "⥢", - "ĺ": "ĺ", - "⦴": "⦴", - "ℒ": "ℒ", - "λ": "λ", - "〈": "⟨", - "⦑": "⦑", - "⟨": "⟨", - "⪅": "⪅", - "«": "«", - "«": "«", - "←": "←", - "⇤": "⇤", - "⤟": "⤟", - "⤝": "⤝", - "↩": "↩", - "↫": "↫", - "⤹": "⤹", - "⥳": "⥳", - "↢": "↢", - "⪫": "⪫", - "⤙": "⤙", - "⪭": "⪭", - "⪭︀": "⪭︀", - "⤌": "⤌", - "❲": "❲", - "{": "{", - "[": "[", - "⦋": "⦋", - "⦏": "⦏", - "⦍": "⦍", - "ľ": "ľ", - "ļ": "ļ", - "⌈": "⌈", - "{": "{", - "л": "л", - "⤶": "⤶", - "“": "“", - "„": "„", - "⥧": "⥧", - "⥋": "⥋", - "↲": "↲", - "≤": "≤", - "←": "←", - "↢": "↢", - "↽": "↽", - "↼": "↼", - "⇇": "⇇", - "↔": "↔", - "⇆": "⇆", - "⇋": "⇋", - "↭": "↭", - "⋋": "⋋", - "⋚": "⋚", - "≤": "≤", - "≦": "≦", - "⩽": "⩽", - "⩽": "⩽", - "⪨": "⪨", - "⩿": "⩿", - "⪁": "⪁", - "⪃": "⪃", - "⋚︀": "⋚︀", - "⪓": "⪓", - "⪅": "⪅", - "⋖": "⋖", - "⋚": "⋚", - "⪋": "⪋", - "≶": "≶", - "≲": "≲", - "⥼": "⥼", - "⌊": "⌊", - "𝔩": "𝔩", - "≶": "≶", - "⪑": "⪑", - "↽": "↽", - "↼": "↼", - "⥪": "⥪", - "▄": "▄", - "љ": "љ", - "≪": "≪", - "⇇": "⇇", - "⌞": "⌞", - "⥫": "⥫", - "◺": "◺", - "ŀ": "ŀ", - "⎰": "⎰", - "⎰": "⎰", - "≨": "≨", - "⪉": "⪉", - "⪉": "⪉", - "⪇": "⪇", - "⪇": "⪇", - "≨": "≨", - "⋦": "⋦", - "⟬": "⟬", - "⇽": "⇽", - "⟦": "⟦", - "⟵": "⟵", - "⟷": "⟷", - "⟼": "⟼", - "⟶": "⟶", - "↫": "↫", - "↬": "↬", - "⦅": "⦅", - "𝕝": "𝕝", - "⨭": "⨭", - "⨴": "⨴", - "∗": "∗", - "_": "_", - "◊": "◊", - "◊": "◊", - "⧫": "⧫", - "(": "(", - "⦓": "⦓", - "⇆": "⇆", - "⌟": "⌟", - "⇋": "⇋", - "⥭": "⥭", - "": "", - "⊿": "⊿", - "‹": "‹", - "𝓁": "𝓁", - "↰": "↰", - "≲": "≲", - "⪍": "⪍", - "⪏": "⪏", - "[": "[", - "‘": "‘", - "‚": "‚", - "ł": "ł", - "<": "<", - "<": "<", - "⪦": "⪦", - "⩹": "⩹", - "⋖": "⋖", - "⋋": "⋋", - "⋉": "⋉", - "⥶": "⥶", - "⩻": "⩻", - "⦖": "⦖", - "◃": "◃", - "⊴": "⊴", - "◂": "◂", - "⥊": "⥊", - "⥦": "⥦", - "≨︀": "≨︀", - "≨︀": "≨︀", - "∺": "∺", - "¯": "¯", - "¯": "¯", - "♂": "♂", - "✠": "✠", - "✠": "✠", - "↦": "↦", - "↦": "↦", - "↧": "↧", - "↤": "↤", - "↥": "↥", - "▮": "▮", - "⨩": "⨩", - "м": "м", - "—": "—", - "∡": "∡", - "𝔪": "𝔪", - "℧": "℧", - "µ": "µ", - "µ": "µ", - "∣": "∣", - "*": "*", - "⫰": "⫰", - "·": "·", - "·": "·", - "−": "−", - "⊟": "⊟", - "∸": "∸", - "⨪": "⨪", - "⫛": "⫛", - "…": "…", - "∓": "∓", - "⊧": "⊧", - "𝕞": "𝕞", - "∓": "∓", - "𝓂": "𝓂", - "∾": "∾", - "μ": "μ", - "⊸": "⊸", - "⊸": "⊸", - "⋙̸": "⋙̸", - "≫⃒": "≫⃒", - "≫̸": "≫̸", - "⇍": "⇍", - "⇎": "⇎", - "⋘̸": "⋘̸", - "≪⃒": "≪⃒", - "≪̸": "≪̸", - "⇏": "⇏", - "⊯": "⊯", - "⊮": "⊮", - "∇": "∇", - "ń": "ń", - "∠⃒": "∠⃒", - "≉": "≉", - "⩰̸": "⩰̸", - "≋̸": "≋̸", - "ʼn": "ʼn", - "≉": "≉", - "♮": "♮", - "♮": "♮", - "ℕ": "ℕ", - " ": " ", - " ": " ", - "≎̸": "≎̸", - "≏̸": "≏̸", - "⩃": "⩃", - "ň": "ň", - "ņ": "ņ", - "≇": "≇", - "⩭̸": "⩭̸", - "⩂": "⩂", - "н": "н", - "–": "–", - "≠": "≠", - "⇗": "⇗", - "⤤": "⤤", - "↗": "↗", - "↗": "↗", - "≐̸": "≐̸", - "≢": "≢", - "⤨": "⤨", - "≂̸": "≂̸", - "∄": "∄", - "∄": "∄", - "𝔫": "𝔫", - "≧̸": "≧̸", - "≱": "≱", - "≱": "≱", - "≧̸": "≧̸", - "⩾̸": "⩾̸", - "⩾̸": "⩾̸", - "≵": "≵", - "≯": "≯", - "≯": "≯", - "⇎": "⇎", - "↮": "↮", - "⫲": "⫲", - "∋": "∋", - "⋼": "⋼", - "⋺": "⋺", - "∋": "∋", - "њ": "њ", - "⇍": "⇍", - "≦̸": "≦̸", - "↚": "↚", - "‥": "‥", - "≰": "≰", - "↚": "↚", - "↮": "↮", - "≰": "≰", - "≦̸": "≦̸", - "⩽̸": "⩽̸", - "⩽̸": "⩽̸", - "≮": "≮", - "≴": "≴", - "≮": "≮", - "⋪": "⋪", - "⋬": "⋬", - "∤": "∤", - "𝕟": "𝕟", - "¬": "¬", - "¬": "¬", - "∉": "∉", - "⋹̸": "⋹̸", - "⋵̸": "⋵̸", - "∉": "∉", - "⋷": "⋷", - "⋶": "⋶", - "∌": "∌", - "∌": "∌", - "⋾": "⋾", - "⋽": "⋽", - "∦": "∦", - "∦": "∦", - "⫽⃥": "⫽⃥", - "∂̸": "∂̸", - "⨔": "⨔", - "⊀": "⊀", - "⋠": "⋠", - "⪯̸": "⪯̸", - "⊀": "⊀", - "⪯̸": "⪯̸", - "⇏": "⇏", - "↛": "↛", - "⤳̸": "⤳̸", - "↝̸": "↝̸", - "↛": "↛", - "⋫": "⋫", - "⋭": "⋭", - "⊁": "⊁", - "⋡": "⋡", - "⪰̸": "⪰̸", - "𝓃": "𝓃", - "∤": "∤", - "∦": "∦", - "≁": "≁", - "≄": "≄", - "≄": "≄", - "∤": "∤", - "∦": "∦", - "⋢": "⋢", - "⋣": "⋣", - "⊄": "⊄", - "⫅̸": "⫅̸", - "⊈": "⊈", - "⊂⃒": "⊂⃒", - "⊈": "⊈", - "⫅̸": "⫅̸", - "⊁": "⊁", - "⪰̸": "⪰̸", - "⊅": "⊅", - "⫆̸": "⫆̸", - "⊉": "⊉", - "⊃⃒": "⊃⃒", - "⊉": "⊉", - "⫆̸": "⫆̸", - "≹": "≹", - "ñ": "ñ", - "ñ": "ñ", - "≸": "≸", - "⋪": "⋪", - "⋬": "⋬", - "⋫": "⋫", - "⋭": "⋭", - "ν": "ν", - "#": "#", - "№": "№", - " ": " ", - "⊭": "⊭", - "⤄": "⤄", - "≍⃒": "≍⃒", - "⊬": "⊬", - "≥⃒": "≥⃒", - ">⃒": ">⃒", - "⧞": "⧞", - "⤂": "⤂", - "≤⃒": "≤⃒", - "<⃒": "<⃒", - "⊴⃒": "⊴⃒", - "⤃": "⤃", - "⊵⃒": "⊵⃒", - "∼⃒": "∼⃒", - "⇖": "⇖", - "⤣": "⤣", - "↖": "↖", - "↖": "↖", - "⤧": "⤧", - "Ⓢ": "Ⓢ", - "ó": "ó", - "ó": "ó", - "⊛": "⊛", - "⊚": "⊚", - "ô": "ô", - "ô": "ô", - "о": "о", - "⊝": "⊝", - "ő": "ő", - "⨸": "⨸", - "⊙": "⊙", - "⦼": "⦼", - "œ": "œ", - "⦿": "⦿", - "𝔬": "𝔬", - "˛": "˛", - "ò": "ò", - "ò": "ò", - "⧁": "⧁", - "⦵": "⦵", - "Ω": "Ω", - "∮": "∮", - "↺": "↺", - "⦾": "⦾", - "⦻": "⦻", - "‾": "‾", - "⧀": "⧀", - "ō": "ō", - "ω": "ω", - "ο": "ο", - "⦶": "⦶", - "⊖": "⊖", - "𝕠": "𝕠", - "⦷": "⦷", - "⦹": "⦹", - "⊕": "⊕", - "∨": "∨", - "↻": "↻", - "⩝": "⩝", - "ℴ": "ℴ", - "ℴ": "ℴ", - "ª": "ª", - "ª": "ª", - "º": "º", - "º": "º", - "⊶": "⊶", - "⩖": "⩖", - "⩗": "⩗", - "⩛": "⩛", - "ℴ": "ℴ", - "ø": "ø", - "ø": "ø", - "⊘": "⊘", - "õ": "õ", - "õ": "õ", - "⊗": "⊗", - "⨶": "⨶", - "ö": "ö", - "ö": "ö", - "⌽": "⌽", - "∥": "∥", - "¶": "¶", - "¶": "¶", - "∥": "∥", - "⫳": "⫳", - "⫽": "⫽", - "∂": "∂", - "п": "п", - "%": "%", - ".": ".", - "‰": "‰", - "⊥": "⊥", - "‱": "‱", - "𝔭": "𝔭", - "φ": "φ", - "ϕ": "ϕ", - "ℳ": "ℳ", - "☎": "☎", - "π": "π", - "⋔": "⋔", - "ϖ": "ϖ", - "ℏ": "ℏ", - "ℎ": "ℎ", - "ℏ": "ℏ", - "+": "+", - "⨣": "⨣", - "⊞": "⊞", - "⨢": "⨢", - "∔": "∔", - "⨥": "⨥", - "⩲": "⩲", - "±": "±", - "±": "±", - "⨦": "⨦", - "⨧": "⨧", - "±": "±", - "⨕": "⨕", - "𝕡": "𝕡", - "£": "£", - "£": "£", - "≺": "≺", - "⪳": "⪳", - "⪷": "⪷", - "≼": "≼", - "⪯": "⪯", - "≺": "≺", - "⪷": "⪷", - "≼": "≼", - "⪯": "⪯", - "⪹": "⪹", - "⪵": "⪵", - "⋨": "⋨", - "≾": "≾", - "′": "′", - "ℙ": "ℙ", - "⪵": "⪵", - "⪹": "⪹", - "⋨": "⋨", - "∏": "∏", - "⌮": "⌮", - "⌒": "⌒", - "⌓": "⌓", - "∝": "∝", - "∝": "∝", - "≾": "≾", - "⊰": "⊰", - "𝓅": "𝓅", - "ψ": "ψ", - " ": " ", - "𝔮": "𝔮", - "⨌": "⨌", - "𝕢": "𝕢", - "⁗": "⁗", - "𝓆": "𝓆", - "ℍ": "ℍ", - "⨖": "⨖", - "?": "?", - "≟": "≟", - """: '"', - """: '"', - "⇛": "⇛", - "⇒": "⇒", - "⤜": "⤜", - "⤏": "⤏", - "⥤": "⥤", - "∽̱": "∽̱", - "ŕ": "ŕ", - "√": "√", - "⦳": "⦳", - "〉": "⟩", - "⦒": "⦒", - "⦥": "⦥", - "⟩": "⟩", - "»": "»", - "»": "»", - "→": "→", - "⥵": "⥵", - "⇥": "⇥", - "⤠": "⤠", - "⤳": "⤳", - "⤞": "⤞", - "↪": "↪", - "↬": "↬", - "⥅": "⥅", - "⥴": "⥴", - "↣": "↣", - "↝": "↝", - "⤚": "⤚", - "∶": "∶", - "ℚ": "ℚ", - "⤍": "⤍", - "❳": "❳", - "}": "}", - "]": "]", - "⦌": "⦌", - "⦎": "⦎", - "⦐": "⦐", - "ř": "ř", - "ŗ": "ŗ", - "⌉": "⌉", - "}": "}", - "р": "р", - "⤷": "⤷", - "⥩": "⥩", - "”": "”", - "”": "”", - "↳": "↳", - "ℜ": "ℜ", - "ℛ": "ℛ", - "ℜ": "ℜ", - "ℝ": "ℝ", - "▭": "▭", - "®": "®", - "®": "®", - "⥽": "⥽", - "⌋": "⌋", - "𝔯": "𝔯", - "⇁": "⇁", - "⇀": "⇀", - "⥬": "⥬", - "ρ": "ρ", - "ϱ": "ϱ", - "→": "→", - "↣": "↣", - "⇁": "⇁", - "⇀": "⇀", - "⇄": "⇄", - "⇌": "⇌", - "⇉": "⇉", - "↝": "↝", - "⋌": "⋌", - "˚": "˚", - "≓": "≓", - "⇄": "⇄", - "⇌": "⇌", - "": "", - "⎱": "⎱", - "⎱": "⎱", - "⫮": "⫮", - "⟭": "⟭", - "⇾": "⇾", - "⟧": "⟧", - "⦆": "⦆", - "𝕣": "𝕣", - "⨮": "⨮", - "⨵": "⨵", - ")": ")", - "⦔": "⦔", - "⨒": "⨒", - "⇉": "⇉", - "›": "›", - "𝓇": "𝓇", - "↱": "↱", - "]": "]", - "’": "’", - "’": "’", - "⋌": "⋌", - "⋊": "⋊", - "▹": "▹", - "⊵": "⊵", - "▸": "▸", - "⧎": "⧎", - "⥨": "⥨", - "℞": "℞", - "ś": "ś", - "‚": "‚", - "≻": "≻", - "⪴": "⪴", - "⪸": "⪸", - "š": "š", - "≽": "≽", - "⪰": "⪰", - "ş": "ş", - "ŝ": "ŝ", - "⪶": "⪶", - "⪺": "⪺", - "⋩": "⋩", - "⨓": "⨓", - "≿": "≿", - "с": "с", - "⋅": "⋅", - "⊡": "⊡", - "⩦": "⩦", - "⇘": "⇘", - "⤥": "⤥", - "↘": "↘", - "↘": "↘", - "§": "§", - "§": "§", - ";": ";", - "⤩": "⤩", - "∖": "∖", - "∖": "∖", - "✶": "✶", - "𝔰": "𝔰", - "⌢": "⌢", - "♯": "♯", - "щ": "щ", - "ш": "ш", - "∣": "∣", - "∥": "∥", - "­": "", - "": "", - "σ": "σ", - "ς": "ς", - "ς": "ς", - "∼": "∼", - "⩪": "⩪", - "≃": "≃", - "≃": "≃", - "⪞": "⪞", - "⪠": "⪠", - "⪝": "⪝", - "⪟": "⪟", - "≆": "≆", - "⨤": "⨤", - "⥲": "⥲", - "←": "←", - "∖": "∖", - "⨳": "⨳", - "⧤": "⧤", - "∣": "∣", - "⌣": "⌣", - "⪪": "⪪", - "⪬": "⪬", - "⪬︀": "⪬︀", - "ь": "ь", - "/": "/", - "⧄": "⧄", - "⌿": "⌿", - "𝕤": "𝕤", - "♠": "♠", - "♠": "♠", - "∥": "∥", - "⊓": "⊓", - "⊓︀": "⊓︀", - "⊔": "⊔", - "⊔︀": "⊔︀", - "⊏": "⊏", - "⊑": "⊑", - "⊏": "⊏", - "⊑": "⊑", - "⊐": "⊐", - "⊒": "⊒", - "⊐": "⊐", - "⊒": "⊒", - "□": "□", - "□": "□", - "▪": "▪", - "▪": "▪", - "→": "→", - "𝓈": "𝓈", - "∖": "∖", - "⌣": "⌣", - "⋆": "⋆", - "☆": "☆", - "★": "★", - "ϵ": "ϵ", - "ϕ": "ϕ", - "¯": "¯", - "⊂": "⊂", - "⫅": "⫅", - "⪽": "⪽", - "⊆": "⊆", - "⫃": "⫃", - "⫁": "⫁", - "⫋": "⫋", - "⊊": "⊊", - "⪿": "⪿", - "⥹": "⥹", - "⊂": "⊂", - "⊆": "⊆", - "⫅": "⫅", - "⊊": "⊊", - "⫋": "⫋", - "⫇": "⫇", - "⫕": "⫕", - "⫓": "⫓", - "≻": "≻", - "⪸": "⪸", - "≽": "≽", - "⪰": "⪰", - "⪺": "⪺", - "⪶": "⪶", - "⋩": "⋩", - "≿": "≿", - "∑": "∑", - "♪": "♪", - "¹": "¹", - "¹": "¹", - "²": "²", - "²": "²", - "³": "³", - "³": "³", - "⊃": "⊃", - "⫆": "⫆", - "⪾": "⪾", - "⫘": "⫘", - "⊇": "⊇", - "⫄": "⫄", - "⟉": "⟉", - "⫗": "⫗", - "⥻": "⥻", - "⫂": "⫂", - "⫌": "⫌", - "⊋": "⊋", - "⫀": "⫀", - "⊃": "⊃", - "⊇": "⊇", - "⫆": "⫆", - "⊋": "⊋", - "⫌": "⫌", - "⫈": "⫈", - "⫔": "⫔", - "⫖": "⫖", - "⇙": "⇙", - "⤦": "⤦", - "↙": "↙", - "↙": "↙", - "⤪": "⤪", - "ß": "ß", - "ß": "ß", - "⌖": "⌖", - "τ": "τ", - "⎴": "⎴", - "ť": "ť", - "ţ": "ţ", - "т": "т", - "⃛": "⃛", - "⌕": "⌕", - "𝔱": "𝔱", - "∴": "∴", - "∴": "∴", - "θ": "θ", - "ϑ": "ϑ", - "ϑ": "ϑ", - "≈": "≈", - "∼": "∼", - " ": " ", - "≈": "≈", - "∼": "∼", - "þ": "þ", - "þ": "þ", - "˜": "˜", - "×": "×", - "×": "×", - "⊠": "⊠", - "⨱": "⨱", - "⨰": "⨰", - "∭": "∭", - "⤨": "⤨", - "⊤": "⊤", - "⌶": "⌶", - "⫱": "⫱", - "𝕥": "𝕥", - "⫚": "⫚", - "⤩": "⤩", - "‴": "‴", - "™": "™", - "▵": "▵", - "▿": "▿", - "◃": "◃", - "⊴": "⊴", - "≜": "≜", - "▹": "▹", - "⊵": "⊵", - "◬": "◬", - "≜": "≜", - "⨺": "⨺", - "⨹": "⨹", - "⧍": "⧍", - "⨻": "⨻", - "⏢": "⏢", - "𝓉": "𝓉", - "ц": "ц", - "ћ": "ћ", - "ŧ": "ŧ", - "≬": "≬", - "↞": "↞", - "↠": "↠", - "⇑": "⇑", - "⥣": "⥣", - "ú": "ú", - "ú": "ú", - "↑": "↑", - "ў": "ў", - "ŭ": "ŭ", - "û": "û", - "û": "û", - "у": "у", - "⇅": "⇅", - "ű": "ű", - "⥮": "⥮", - "⥾": "⥾", - "𝔲": "𝔲", - "ù": "ù", - "ù": "ù", - "↿": "↿", - "↾": "↾", - "▀": "▀", - "⌜": "⌜", - "⌜": "⌜", - "⌏": "⌏", - "◸": "◸", - "ū": "ū", - "¨": "¨", - "¨": "¨", - "ų": "ų", - "𝕦": "𝕦", - "↑": "↑", - "↕": "↕", - "↿": "↿", - "↾": "↾", - "⊎": "⊎", - "υ": "υ", - "ϒ": "ϒ", - "υ": "υ", - "⇈": "⇈", - "⌝": "⌝", - "⌝": "⌝", - "⌎": "⌎", - "ů": "ů", - "◹": "◹", - "𝓊": "𝓊", - "⋰": "⋰", - "ũ": "ũ", - "▵": "▵", - "▴": "▴", - "⇈": "⇈", - "ü": "ü", - "ü": "ü", - "⦧": "⦧", - "⇕": "⇕", - "⫨": "⫨", - "⫩": "⫩", - "⊨": "⊨", - "⦜": "⦜", - "ϵ": "ϵ", - "ϰ": "ϰ", - "∅": "∅", - "ϕ": "ϕ", - "ϖ": "ϖ", - "∝": "∝", - "↕": "↕", - "ϱ": "ϱ", - "ς": "ς", - "⊊︀": "⊊︀", - "⫋︀": "⫋︀", - "⊋︀": "⊋︀", - "⫌︀": "⫌︀", - "ϑ": "ϑ", - "⊲": "⊲", - "⊳": "⊳", - "в": "в", - "⊢": "⊢", - "∨": "∨", - "⊻": "⊻", - "≚": "≚", - "⋮": "⋮", - "|": "|", - "|": "|", - "𝔳": "𝔳", - "⊲": "⊲", - "⊂⃒": "⊂⃒", - "⊃⃒": "⊃⃒", - "𝕧": "𝕧", - "∝": "∝", - "⊳": "⊳", - "𝓋": "𝓋", - "⫋︀": "⫋︀", - "⊊︀": "⊊︀", - "⫌︀": "⫌︀", - "⊋︀": "⊋︀", - "⦚": "⦚", - "ŵ": "ŵ", - "⩟": "⩟", - "∧": "∧", - "≙": "≙", - "℘": "℘", - "𝔴": "𝔴", - "𝕨": "𝕨", - "℘": "℘", - "≀": "≀", - "≀": "≀", - "𝓌": "𝓌", - "⋂": "⋂", - "◯": "◯", - "⋃": "⋃", - "▽": "▽", - "𝔵": "𝔵", - "⟺": "⟺", - "⟷": "⟷", - "ξ": "ξ", - "⟸": "⟸", - "⟵": "⟵", - "⟼": "⟼", - "⋻": "⋻", - "⨀": "⨀", - "𝕩": "𝕩", - "⨁": "⨁", - "⨂": "⨂", - "⟹": "⟹", - "⟶": "⟶", - "𝓍": "𝓍", - "⨆": "⨆", - "⨄": "⨄", - "△": "△", - "⋁": "⋁", - "⋀": "⋀", - "ý": "ý", - "ý": "ý", - "я": "я", - "ŷ": "ŷ", - "ы": "ы", - "¥": "¥", - "¥": "¥", - "𝔶": "𝔶", - "ї": "ї", - "𝕪": "𝕪", - "𝓎": "𝓎", - "ю": "ю", - "ÿ": "ÿ", - "ÿ": "ÿ", - "ź": "ź", - "ž": "ž", - "з": "з", - "ż": "ż", - "ℨ": "ℨ", - "ζ": "ζ", - "𝔷": "𝔷", - "ж": "ж", - "⇝": "⇝", - "𝕫": "𝕫", - "𝓏": "𝓏", - "": "", - "": "", - }, - characters: { - Æ: "Æ", - "&": "&", - Á: "Á", - Ă: "Ă", - Â: "Â", - А: "А", - 𝔄: "𝔄", - À: "À", - Α: "Α", - Ā: "Ā", - "⩓": "⩓", - Ą: "Ą", - 𝔸: "𝔸", - "": "⁡", - Å: "Å", - 𝒜: "𝒜", - "≔": "≔", - Ã: "Ã", - Ä: "Ä", - "∖": "∖", - "⫧": "⫧", - "⌆": "⌆", - Б: "Б", - "∵": "∵", - ℬ: "ℬ", - Β: "Β", - 𝔅: "𝔅", - 𝔹: "𝔹", - "˘": "˘", - "≎": "≎", - Ч: "Ч", - "©": "©", - Ć: "Ć", - "⋒": "⋒", - ⅅ: "ⅅ", - ℭ: "ℭ", - Č: "Č", - Ç: "Ç", - Ĉ: "Ĉ", - "∰": "∰", - Ċ: "Ċ", - "¸": "¸", - "·": "·", - Χ: "Χ", - "⊙": "⊙", - "⊖": "⊖", - "⊕": "⊕", - "⊗": "⊗", - "∲": "∲", - "”": "”", - "’": "’", - "∷": "∷", - "⩴": "⩴", - "≡": "≡", - "∯": "∯", - "∮": "∮", - ℂ: "ℂ", - "∐": "∐", - "∳": "∳", - "⨯": "⨯", - 𝒞: "𝒞", - "⋓": "⋓", - "≍": "≍", - "⤑": "⤑", - Ђ: "Ђ", - Ѕ: "Ѕ", - Џ: "Џ", - "‡": "‡", - "↡": "↡", - "⫤": "⫤", - Ď: "Ď", - Д: "Д", - "∇": "∇", - Δ: "Δ", - 𝔇: "𝔇", - "´": "´", - "˙": "˙", - "˝": "˝", - "`": "`", - "˜": "˜", - "⋄": "⋄", - ⅆ: "ⅆ", - 𝔻: "𝔻", - "¨": "¨", - "⃜": "⃜", - "≐": "≐", - "⇓": "⇓", - "⇐": "⇐", - "⇔": "⇔", - "⟸": "⟸", - "⟺": "⟺", - "⟹": "⟹", - "⇒": "⇒", - "⊨": "⊨", - "⇑": "⇑", - "⇕": "⇕", - "∥": "∥", - "↓": "↓", - "⤓": "⤓", - "⇵": "⇵", - "̑": "̑", - "⥐": "⥐", - "⥞": "⥞", - "↽": "↽", - "⥖": "⥖", - "⥟": "⥟", - "⇁": "⇁", - "⥗": "⥗", - "⊤": "⊤", - "↧": "↧", - 𝒟: "𝒟", - Đ: "Đ", - Ŋ: "Ŋ", - Ð: "Ð", - É: "É", - Ě: "Ě", - Ê: "Ê", - Э: "Э", - Ė: "Ė", - 𝔈: "𝔈", - È: "È", - "∈": "∈", - Ē: "Ē", - "◻": "◻", - "▫": "▫", - Ę: "Ę", - 𝔼: "𝔼", - Ε: "Ε", - "⩵": "⩵", - "≂": "≂", - "⇌": "⇌", - ℰ: "ℰ", - "⩳": "⩳", - Η: "Η", - Ë: "Ë", - "∃": "∃", - ⅇ: "ⅇ", - Ф: "Ф", - 𝔉: "𝔉", - "◼": "◼", - "▪": "▪", - 𝔽: "𝔽", - "∀": "∀", - ℱ: "ℱ", - Ѓ: "Ѓ", - ">": ">", - Γ: "Γ", - Ϝ: "Ϝ", - Ğ: "Ğ", - Ģ: "Ģ", - Ĝ: "Ĝ", - Г: "Г", - Ġ: "Ġ", - 𝔊: "𝔊", - "⋙": "⋙", - 𝔾: "𝔾", - "≥": "≥", - "⋛": "⋛", - "≧": "≧", - "⪢": "⪢", - "≷": "≷", - "⩾": "⩾", - "≳": "≳", - 𝒢: "𝒢", - "≫": "≫", - Ъ: "Ъ", - ˇ: "ˇ", - "^": "^", - Ĥ: "Ĥ", - ℌ: "ℌ", - ℋ: "ℋ", - ℍ: "ℍ", - "─": "─", - Ħ: "Ħ", - "≏": "≏", - Е: "Е", - IJ: "IJ", - Ё: "Ё", - Í: "Í", - Î: "Î", - И: "И", - İ: "İ", - ℑ: "ℑ", - Ì: "Ì", - Ī: "Ī", - ⅈ: "ⅈ", - "∬": "∬", - "∫": "∫", - "⋂": "⋂", - "": "⁣", - "": "⁢", - Į: "Į", - 𝕀: "𝕀", - Ι: "Ι", - ℐ: "ℐ", - Ĩ: "Ĩ", - І: "І", - Ï: "Ï", - Ĵ: "Ĵ", - Й: "Й", - 𝔍: "𝔍", - 𝕁: "𝕁", - 𝒥: "𝒥", - Ј: "Ј", - Є: "Є", - Х: "Х", - Ќ: "Ќ", - Κ: "Κ", - Ķ: "Ķ", - К: "К", - 𝔎: "𝔎", - 𝕂: "𝕂", - 𝒦: "𝒦", - Љ: "Љ", - "<": "<", - Ĺ: "Ĺ", - Λ: "Λ", - "⟪": "⟪", - ℒ: "ℒ", - "↞": "↞", - Ľ: "Ľ", - Ļ: "Ļ", - Л: "Л", - "⟨": "⟨", - "←": "←", - "⇤": "⇤", - "⇆": "⇆", - "⌈": "⌈", - "⟦": "⟦", - "⥡": "⥡", - "⇃": "⇃", - "⥙": "⥙", - "⌊": "⌊", - "↔": "↔", - "⥎": "⥎", - "⊣": "⊣", - "↤": "↤", - "⥚": "⥚", - "⊲": "⊲", - "⧏": "⧏", - "⊴": "⊴", - "⥑": "⥑", - "⥠": "⥠", - "↿": "↿", - "⥘": "⥘", - "↼": "↼", - "⥒": "⥒", - "⋚": "⋚", - "≦": "≦", - "≶": "≶", - "⪡": "⪡", - "⩽": "⩽", - "≲": "≲", - 𝔏: "𝔏", - "⋘": "⋘", - "⇚": "⇚", - Ŀ: "Ŀ", - "⟵": "⟵", - "⟷": "⟷", - "⟶": "⟶", - 𝕃: "𝕃", - "↙": "↙", - "↘": "↘", - "↰": "↰", - Ł: "Ł", - "≪": "≪", - "⤅": "⤅", - М: "М", - " ": " ", - ℳ: "ℳ", - 𝔐: "𝔐", - "∓": "∓", - 𝕄: "𝕄", - Μ: "Μ", - Њ: "Њ", - Ń: "Ń", - Ň: "Ň", - Ņ: "Ņ", - Н: "Н", - "": "​", - "\n": "
", - 𝔑: "𝔑", - "": "⁠", - " ": " ", - ℕ: "ℕ", - "⫬": "⫬", - "≢": "≢", - "≭": "≭", - "∦": "∦", - "∉": "∉", - "≠": "≠", - "≂̸": "≂̸", - "∄": "∄", - "≯": "≯", - "≱": "≱", - "≧̸": "≧̸", - "≫̸": "≫̸", - "≹": "≹", - "⩾̸": "⩾̸", - "≵": "≵", - "≎̸": "≎̸", - "≏̸": "≏̸", - "⋪": "⋪", - "⧏̸": "⧏̸", - "⋬": "⋬", - "≮": "≮", - "≰": "≰", - "≸": "≸", - "≪̸": "≪̸", - "⩽̸": "⩽̸", - "≴": "≴", - "⪢̸": "⪢̸", - "⪡̸": "⪡̸", - "⊀": "⊀", - "⪯̸": "⪯̸", - "⋠": "⋠", - "∌": "∌", - "⋫": "⋫", - "⧐̸": "⧐̸", - "⋭": "⋭", - "⊏̸": "⊏̸", - "⋢": "⋢", - "⊐̸": "⊐̸", - "⋣": "⋣", - "⊂⃒": "⊂⃒", - "⊈": "⊈", - "⊁": "⊁", - "⪰̸": "⪰̸", - "⋡": "⋡", - "≿̸": "≿̸", - "⊃⃒": "⊃⃒", - "⊉": "⊉", - "≁": "≁", - "≄": "≄", - "≇": "≇", - "≉": "≉", - "∤": "∤", - 𝒩: "𝒩", - Ñ: "Ñ", - Ν: "Ν", - Œ: "Œ", - Ó: "Ó", - Ô: "Ô", - О: "О", - Ő: "Ő", - 𝔒: "𝔒", - Ò: "Ò", - Ō: "Ō", - Ω: "Ω", - Ο: "Ο", - 𝕆: "𝕆", - "“": "“", - "‘": "‘", - "⩔": "⩔", - 𝒪: "𝒪", - Ø: "Ø", - Õ: "Õ", - "⨷": "⨷", - Ö: "Ö", - "‾": "‾", - "⏞": "⏞", - "⎴": "⎴", - "⏜": "⏜", - "∂": "∂", - П: "П", - 𝔓: "𝔓", - Φ: "Φ", - Π: "Π", - "±": "±", - ℙ: "ℙ", - "⪻": "⪻", - "≺": "≺", - "⪯": "⪯", - "≼": "≼", - "≾": "≾", - "″": "″", - "∏": "∏", - "∝": "∝", - 𝒫: "𝒫", - Ψ: "Ψ", - '"': """, - 𝔔: "𝔔", - ℚ: "ℚ", - 𝒬: "𝒬", - "⤐": "⤐", - "®": "®", - Ŕ: "Ŕ", - "⟫": "⟫", - "↠": "↠", - "⤖": "⤖", - Ř: "Ř", - Ŗ: "Ŗ", - Р: "Р", - ℜ: "ℜ", - "∋": "∋", - "⇋": "⇋", - "⥯": "⥯", - Ρ: "Ρ", - "⟩": "⟩", - "→": "→", - "⇥": "⇥", - "⇄": "⇄", - "⌉": "⌉", - "⟧": "⟧", - "⥝": "⥝", - "⇂": "⇂", - "⥕": "⥕", - "⌋": "⌋", - "⊢": "⊢", - "↦": "↦", - "⥛": "⥛", - "⊳": "⊳", - "⧐": "⧐", - "⊵": "⊵", - "⥏": "⥏", - "⥜": "⥜", - "↾": "↾", - "⥔": "⥔", - "⇀": "⇀", - "⥓": "⥓", - ℝ: "ℝ", - "⥰": "⥰", - "⇛": "⇛", - ℛ: "ℛ", - "↱": "↱", - "⧴": "⧴", - Щ: "Щ", - Ш: "Ш", - Ь: "Ь", - Ś: "Ś", - "⪼": "⪼", - Š: "Š", - Ş: "Ş", - Ŝ: "Ŝ", - С: "С", - 𝔖: "𝔖", - "↑": "↑", - Σ: "Σ", - "∘": "∘", - 𝕊: "𝕊", - "√": "√", - "□": "□", - "⊓": "⊓", - "⊏": "⊏", - "⊑": "⊑", - "⊐": "⊐", - "⊒": "⊒", - "⊔": "⊔", - 𝒮: "𝒮", - "⋆": "⋆", - "⋐": "⋐", - "⊆": "⊆", - "≻": "≻", - "⪰": "⪰", - "≽": "≽", - "≿": "≿", - "∑": "∑", - "⋑": "⋑", - "⊃": "⊃", - "⊇": "⊇", - Þ: "Þ", - "™": "™", - Ћ: "Ћ", - Ц: "Ц", - "\t": "	", - Τ: "Τ", - Ť: "Ť", - Ţ: "Ţ", - Т: "Т", - 𝔗: "𝔗", - "∴": "∴", - Θ: "Θ", - " ": "  ", - " ": " ", - "∼": "∼", - "≃": "≃", - "≅": "≅", - "≈": "≈", - 𝕋: "𝕋", - "⃛": "⃛", - 𝒯: "𝒯", - Ŧ: "Ŧ", - Ú: "Ú", - "↟": "↟", - "⥉": "⥉", - Ў: "Ў", - Ŭ: "Ŭ", - Û: "Û", - У: "У", - Ű: "Ű", - 𝔘: "𝔘", - Ù: "Ù", - Ū: "Ū", - _: "_", - "⏟": "⏟", - "⎵": "⎵", - "⏝": "⏝", - "⋃": "⋃", - "⊎": "⊎", - Ų: "Ų", - 𝕌: "𝕌", - "⤒": "⤒", - "⇅": "⇅", - "↕": "↕", - "⥮": "⥮", - "⊥": "⊥", - "↥": "↥", - "↖": "↖", - "↗": "↗", - ϒ: "ϒ", - Υ: "Υ", - Ů: "Ů", - 𝒰: "𝒰", - Ũ: "Ũ", - Ü: "Ü", - "⊫": "⊫", - "⫫": "⫫", - В: "В", - "⊩": "⊩", - "⫦": "⫦", - "⋁": "⋁", - "‖": "‖", - "∣": "∣", - "|": "|", - "❘": "❘", - "≀": "≀", - " ": " ", - 𝔙: "𝔙", - 𝕍: "𝕍", - 𝒱: "𝒱", - "⊪": "⊪", - Ŵ: "Ŵ", - "⋀": "⋀", - 𝔚: "𝔚", - 𝕎: "𝕎", - 𝒲: "𝒲", - 𝔛: "𝔛", - Ξ: "Ξ", - 𝕏: "𝕏", - 𝒳: "𝒳", - Я: "Я", - Ї: "Ї", - Ю: "Ю", - Ý: "Ý", - Ŷ: "Ŷ", - Ы: "Ы", - 𝔜: "𝔜", - 𝕐: "𝕐", - 𝒴: "𝒴", - Ÿ: "Ÿ", - Ж: "Ж", - Ź: "Ź", - Ž: "Ž", - З: "З", - Ż: "Ż", - Ζ: "Ζ", - ℨ: "ℨ", - ℤ: "ℤ", - 𝒵: "𝒵", - á: "á", - ă: "ă", - "∾": "∾", - "∾̳": "∾̳", - "∿": "∿", - â: "â", - а: "а", - æ: "æ", - 𝔞: "𝔞", - à: "à", - ℵ: "ℵ", - α: "α", - ā: "ā", - "⨿": "⨿", - "∧": "∧", - "⩕": "⩕", - "⩜": "⩜", - "⩘": "⩘", - "⩚": "⩚", - "∠": "∠", - "⦤": "⦤", - "∡": "∡", - "⦨": "⦨", - "⦩": "⦩", - "⦪": "⦪", - "⦫": "⦫", - "⦬": "⦬", - "⦭": "⦭", - "⦮": "⦮", - "⦯": "⦯", - "∟": "∟", - "⊾": "⊾", - "⦝": "⦝", - "∢": "∢", - "⍼": "⍼", - ą: "ą", - 𝕒: "𝕒", - "⩰": "⩰", - "⩯": "⩯", - "≊": "≊", - "≋": "≋", - "'": "'", - å: "å", - 𝒶: "𝒶", - "*": "*", - ã: "ã", - ä: "ä", - "⨑": "⨑", - "⫭": "⫭", - "≌": "≌", - "϶": "϶", - "‵": "‵", - "∽": "∽", - "⋍": "⋍", - "⊽": "⊽", - "⌅": "⌅", - "⎶": "⎶", - б: "б", - "„": "„", - "⦰": "⦰", - β: "β", - ℶ: "ℶ", - "≬": "≬", - 𝔟: "𝔟", - "◯": "◯", - "⨀": "⨀", - "⨁": "⨁", - "⨂": "⨂", - "⨆": "⨆", - "★": "★", - "▽": "▽", - "△": "△", - "⨄": "⨄", - "⤍": "⤍", - "⧫": "⧫", - "▴": "▴", - "▾": "▾", - "◂": "◂", - "▸": "▸", - "␣": "␣", - "▒": "▒", - "░": "░", - "▓": "▓", - "█": "█", - "=⃥": "=⃥", - "≡⃥": "≡⃥", - "⌐": "⌐", - 𝕓: "𝕓", - "⋈": "⋈", - "╗": "╗", - "╔": "╔", - "╖": "╖", - "╓": "╓", - "═": "═", - "╦": "╦", - "╩": "╩", - "╤": "╤", - "╧": "╧", - "╝": "╝", - "╚": "╚", - "╜": "╜", - "╙": "╙", - "║": "║", - "╬": "╬", - "╣": "╣", - "╠": "╠", - "╫": "╫", - "╢": "╢", - "╟": "╟", - "⧉": "⧉", - "╕": "╕", - "╒": "╒", - "┐": "┐", - "┌": "┌", - "╥": "╥", - "╨": "╨", - "┬": "┬", - "┴": "┴", - "⊟": "⊟", - "⊞": "⊞", - "⊠": "⊠", - "╛": "╛", - "╘": "╘", - "┘": "┘", - "└": "└", - "│": "│", - "╪": "╪", - "╡": "╡", - "╞": "╞", - "┼": "┼", - "┤": "┤", - "├": "├", - "¦": "¦", - 𝒷: "𝒷", - "⁏": "⁏", - "\\": "\", - "⧅": "⧅", - "⟈": "⟈", - "•": "•", - "⪮": "⪮", - ć: "ć", - "∩": "∩", - "⩄": "⩄", - "⩉": "⩉", - "⩋": "⩋", - "⩇": "⩇", - "⩀": "⩀", - "∩︀": "∩︀", - "⁁": "⁁", - "⩍": "⩍", - č: "č", - ç: "ç", - ĉ: "ĉ", - "⩌": "⩌", - "⩐": "⩐", - ċ: "ċ", - "⦲": "⦲", - "¢": "¢", - 𝔠: "𝔠", - ч: "ч", - "✓": "✓", - χ: "χ", - "○": "○", - "⧃": "⧃", - ˆ: "ˆ", - "≗": "≗", - "↺": "↺", - "↻": "↻", - "Ⓢ": "Ⓢ", - "⊛": "⊛", - "⊚": "⊚", - "⊝": "⊝", - "⨐": "⨐", - "⫯": "⫯", - "⧂": "⧂", - "♣": "♣", - ":": ":", - ",": ",", - "@": "@", - "∁": "∁", - "⩭": "⩭", - 𝕔: "𝕔", - "℗": "℗", - "↵": "↵", - "✗": "✗", - 𝒸: "𝒸", - "⫏": "⫏", - "⫑": "⫑", - "⫐": "⫐", - "⫒": "⫒", - "⋯": "⋯", - "⤸": "⤸", - "⤵": "⤵", - "⋞": "⋞", - "⋟": "⋟", - "↶": "↶", - "⤽": "⤽", - "∪": "∪", - "⩈": "⩈", - "⩆": "⩆", - "⩊": "⩊", - "⊍": "⊍", - "⩅": "⩅", - "∪︀": "∪︀", - "↷": "↷", - "⤼": "⤼", - "⋎": "⋎", - "⋏": "⋏", - "¤": "¤", - "∱": "∱", - "⌭": "⌭", - "⥥": "⥥", - "†": "†", - ℸ: "ℸ", - "‐": "‐", - "⤏": "⤏", - ď: "ď", - д: "д", - "⇊": "⇊", - "⩷": "⩷", - "°": "°", - δ: "δ", - "⦱": "⦱", - "⥿": "⥿", - 𝔡: "𝔡", - "♦": "♦", - ϝ: "ϝ", - "⋲": "⋲", - "÷": "÷", - "⋇": "⋇", - ђ: "ђ", - "⌞": "⌞", - "⌍": "⌍", - $: "$", - 𝕕: "𝕕", - "≑": "≑", - "∸": "∸", - "∔": "∔", - "⊡": "⊡", - "⌟": "⌟", - "⌌": "⌌", - 𝒹: "𝒹", - ѕ: "ѕ", - "⧶": "⧶", - đ: "đ", - "⋱": "⋱", - "▿": "▿", - "⦦": "⦦", - џ: "џ", - "⟿": "⟿", - é: "é", - "⩮": "⩮", - ě: "ě", - "≖": "≖", - ê: "ê", - "≕": "≕", - э: "э", - ė: "ė", - "≒": "≒", - 𝔢: "𝔢", - "⪚": "⪚", - è: "è", - "⪖": "⪖", - "⪘": "⪘", - "⪙": "⪙", - "⏧": "⏧", - ℓ: "ℓ", - "⪕": "⪕", - "⪗": "⪗", - ē: "ē", - "∅": "∅", - " ": " ", - " ": " ", - " ": " ", - ŋ: "ŋ", - " ": " ", - ę: "ę", - 𝕖: "𝕖", - "⋕": "⋕", - "⧣": "⧣", - "⩱": "⩱", - ε: "ε", - ϵ: "ϵ", - "=": "=", - "≟": "≟", - "⩸": "⩸", - "⧥": "⧥", - "≓": "≓", - "⥱": "⥱", - ℯ: "ℯ", - η: "η", - ð: "ð", - ë: "ë", - "€": "€", - "!": "!", - ф: "ф", - "♀": "♀", - ffi: "ffi", - ff: "ff", - ffl: "ffl", - 𝔣: "𝔣", - fi: "fi", - fj: "fj", - "♭": "♭", - fl: "fl", - "▱": "▱", - ƒ: "ƒ", - 𝕗: "𝕗", - "⋔": "⋔", - "⫙": "⫙", - "⨍": "⨍", - "½": "½", - "⅓": "⅓", - "¼": "¼", - "⅕": "⅕", - "⅙": "⅙", - "⅛": "⅛", - "⅔": "⅔", - "⅖": "⅖", - "¾": "¾", - "⅗": "⅗", - "⅜": "⅜", - "⅘": "⅘", - "⅚": "⅚", - "⅝": "⅝", - "⅞": "⅞", - "⁄": "⁄", - "⌢": "⌢", - 𝒻: "𝒻", - "⪌": "⪌", - ǵ: "ǵ", - γ: "γ", - "⪆": "⪆", - ğ: "ğ", - ĝ: "ĝ", - г: "г", - ġ: "ġ", - "⪩": "⪩", - "⪀": "⪀", - "⪂": "⪂", - "⪄": "⪄", - "⋛︀": "⋛︀", - "⪔": "⪔", - 𝔤: "𝔤", - ℷ: "ℷ", - ѓ: "ѓ", - "⪒": "⪒", - "⪥": "⪥", - "⪤": "⪤", - "≩": "≩", - "⪊": "⪊", - "⪈": "⪈", - "⋧": "⋧", - 𝕘: "𝕘", - ℊ: "ℊ", - "⪎": "⪎", - "⪐": "⪐", - "⪧": "⪧", - "⩺": "⩺", - "⋗": "⋗", - "⦕": "⦕", - "⩼": "⩼", - "⥸": "⥸", - "≩︀": "≩︀", - ъ: "ъ", - "⥈": "⥈", - "↭": "↭", - ℏ: "ℏ", - ĥ: "ĥ", - "♥": "♥", - "…": "…", - "⊹": "⊹", - 𝔥: "𝔥", - "⤥": "⤥", - "⤦": "⤦", - "⇿": "⇿", - "∻": "∻", - "↩": "↩", - "↪": "↪", - 𝕙: "𝕙", - "―": "―", - 𝒽: "𝒽", - ħ: "ħ", - "⁃": "⁃", - í: "í", - î: "î", - и: "и", - е: "е", - "¡": "¡", - 𝔦: "𝔦", - ì: "ì", - "⨌": "⨌", - "∭": "∭", - "⧜": "⧜", - "℩": "℩", - ij: "ij", - ī: "ī", - ı: "ı", - "⊷": "⊷", - Ƶ: "Ƶ", - "℅": "℅", - "∞": "∞", - "⧝": "⧝", - "⊺": "⊺", - "⨗": "⨗", - "⨼": "⨼", - ё: "ё", - į: "į", - 𝕚: "𝕚", - ι: "ι", - "¿": "¿", - 𝒾: "𝒾", - "⋹": "⋹", - "⋵": "⋵", - "⋴": "⋴", - "⋳": "⋳", - ĩ: "ĩ", - і: "і", - ï: "ï", - ĵ: "ĵ", - й: "й", - 𝔧: "𝔧", - ȷ: "ȷ", - 𝕛: "𝕛", - 𝒿: "𝒿", - ј: "ј", - є: "є", - κ: "κ", - ϰ: "ϰ", - ķ: "ķ", - к: "к", - 𝔨: "𝔨", - ĸ: "ĸ", - х: "х", - ќ: "ќ", - 𝕜: "𝕜", - 𝓀: "𝓀", - "⤛": "⤛", - "⤎": "⤎", - "⪋": "⪋", - "⥢": "⥢", - ĺ: "ĺ", - "⦴": "⦴", - λ: "λ", - "⦑": "⦑", - "⪅": "⪅", - "«": "«", - "⤟": "⤟", - "⤝": "⤝", - "↫": "↫", - "⤹": "⤹", - "⥳": "⥳", - "↢": "↢", - "⪫": "⪫", - "⤙": "⤙", - "⪭": "⪭", - "⪭︀": "⪭︀", - "⤌": "⤌", - "❲": "❲", - "{": "{", - "[": "[", - "⦋": "⦋", - "⦏": "⦏", - "⦍": "⦍", - ľ: "ľ", - ļ: "ļ", - л: "л", - "⤶": "⤶", - "⥧": "⥧", - "⥋": "⥋", - "↲": "↲", - "≤": "≤", - "⇇": "⇇", - "⋋": "⋋", - "⪨": "⪨", - "⩿": "⩿", - "⪁": "⪁", - "⪃": "⪃", - "⋚︀": "⋚︀", - "⪓": "⪓", - "⋖": "⋖", - "⥼": "⥼", - 𝔩: "𝔩", - "⪑": "⪑", - "⥪": "⥪", - "▄": "▄", - љ: "љ", - "⥫": "⥫", - "◺": "◺", - ŀ: "ŀ", - "⎰": "⎰", - "≨": "≨", - "⪉": "⪉", - "⪇": "⪇", - "⋦": "⋦", - "⟬": "⟬", - "⇽": "⇽", - "⟼": "⟼", - "↬": "↬", - "⦅": "⦅", - 𝕝: "𝕝", - "⨭": "⨭", - "⨴": "⨴", - "∗": "∗", - "◊": "◊", - "(": "(", - "⦓": "⦓", - "⥭": "⥭", - "": "", - "⊿": "⊿", - "‹": "‹", - 𝓁: "𝓁", - "⪍": "⪍", - "⪏": "⪏", - "‚": "‚", - ł: "ł", - "⪦": "⪦", - "⩹": "⩹", - "⋉": "⋉", - "⥶": "⥶", - "⩻": "⩻", - "⦖": "⦖", - "◃": "◃", - "⥊": "⥊", - "⥦": "⥦", - "≨︀": "≨︀", - "∺": "∺", - "¯": "¯", - "♂": "♂", - "✠": "✠", - "▮": "▮", - "⨩": "⨩", - м: "м", - "—": "—", - 𝔪: "𝔪", - "℧": "℧", - µ: "µ", - "⫰": "⫰", - "−": "−", - "⨪": "⨪", - "⫛": "⫛", - "⊧": "⊧", - 𝕞: "𝕞", - 𝓂: "𝓂", - μ: "μ", - "⊸": "⊸", - "⋙̸": "⋙̸", - "≫⃒": "≫⃒", - "⇍": "⇍", - "⇎": "⇎", - "⋘̸": "⋘̸", - "≪⃒": "≪⃒", - "⇏": "⇏", - "⊯": "⊯", - "⊮": "⊮", - ń: "ń", - "∠⃒": "∠⃒", - "⩰̸": "⩰̸", - "≋̸": "≋̸", - ʼn: "ʼn", - "♮": "♮", - "⩃": "⩃", - ň: "ň", - ņ: "ņ", - "⩭̸": "⩭̸", - "⩂": "⩂", - н: "н", - "–": "–", - "⇗": "⇗", - "⤤": "⤤", - "≐̸": "≐̸", - "⤨": "⤨", - 𝔫: "𝔫", - "↮": "↮", - "⫲": "⫲", - "⋼": "⋼", - "⋺": "⋺", - њ: "њ", - "≦̸": "≦̸", - "↚": "↚", - "‥": "‥", - 𝕟: "𝕟", - "¬": "¬", - "⋹̸": "⋹̸", - "⋵̸": "⋵̸", - "⋷": "⋷", - "⋶": "⋶", - "⋾": "⋾", - "⋽": "⋽", - "⫽⃥": "⫽⃥", - "∂̸": "∂̸", - "⨔": "⨔", - "↛": "↛", - "⤳̸": "⤳̸", - "↝̸": "↝̸", - 𝓃: "𝓃", - "⊄": "⊄", - "⫅̸": "⫅̸", - "⊅": "⊅", - "⫆̸": "⫆̸", - ñ: "ñ", - ν: "ν", - "#": "#", - "№": "№", - " ": " ", - "⊭": "⊭", - "⤄": "⤄", - "≍⃒": "≍⃒", - "⊬": "⊬", - "≥⃒": "≥⃒", - ">⃒": ">⃒", - "⧞": "⧞", - "⤂": "⤂", - "≤⃒": "≤⃒", - "<⃒": "<⃒", - "⊴⃒": "⊴⃒", - "⤃": "⤃", - "⊵⃒": "⊵⃒", - "∼⃒": "∼⃒", - "⇖": "⇖", - "⤣": "⤣", - "⤧": "⤧", - ó: "ó", - ô: "ô", - о: "о", - ő: "ő", - "⨸": "⨸", - "⦼": "⦼", - œ: "œ", - "⦿": "⦿", - 𝔬: "𝔬", - "˛": "˛", - ò: "ò", - "⧁": "⧁", - "⦵": "⦵", - "⦾": "⦾", - "⦻": "⦻", - "⧀": "⧀", - ō: "ō", - ω: "ω", - ο: "ο", - "⦶": "⦶", - 𝕠: "𝕠", - "⦷": "⦷", - "⦹": "⦹", - "∨": "∨", - "⩝": "⩝", - ℴ: "ℴ", - ª: "ª", - º: "º", - "⊶": "⊶", - "⩖": "⩖", - "⩗": "⩗", - "⩛": "⩛", - ø: "ø", - "⊘": "⊘", - õ: "õ", - "⨶": "⨶", - ö: "ö", - "⌽": "⌽", - "¶": "¶", - "⫳": "⫳", - "⫽": "⫽", - п: "п", - "%": "%", - ".": ".", - "‰": "‰", - "‱": "‱", - 𝔭: "𝔭", - φ: "φ", - ϕ: "ϕ", - "☎": "☎", - π: "π", - ϖ: "ϖ", - ℎ: "ℎ", - "+": "+", - "⨣": "⨣", - "⨢": "⨢", - "⨥": "⨥", - "⩲": "⩲", - "⨦": "⨦", - "⨧": "⨧", - "⨕": "⨕", - 𝕡: "𝕡", - "£": "£", - "⪳": "⪳", - "⪷": "⪷", - "⪹": "⪹", - "⪵": "⪵", - "⋨": "⋨", - "′": "′", - "⌮": "⌮", - "⌒": "⌒", - "⌓": "⌓", - "⊰": "⊰", - 𝓅: "𝓅", - ψ: "ψ", - " ": " ", - 𝔮: "𝔮", - 𝕢: "𝕢", - "⁗": "⁗", - 𝓆: "𝓆", - "⨖": "⨖", - "?": "?", - "⤜": "⤜", - "⥤": "⥤", - "∽̱": "∽̱", - ŕ: "ŕ", - "⦳": "⦳", - "⦒": "⦒", - "⦥": "⦥", - "»": "»", - "⥵": "⥵", - "⤠": "⤠", - "⤳": "⤳", - "⤞": "⤞", - "⥅": "⥅", - "⥴": "⥴", - "↣": "↣", - "↝": "↝", - "⤚": "⤚", - "∶": "∶", - "❳": "❳", - "}": "}", - "]": "]", - "⦌": "⦌", - "⦎": "⦎", - "⦐": "⦐", - ř: "ř", - ŗ: "ŗ", - р: "р", - "⤷": "⤷", - "⥩": "⥩", - "↳": "↳", - "▭": "▭", - "⥽": "⥽", - 𝔯: "𝔯", - "⥬": "⥬", - ρ: "ρ", - ϱ: "ϱ", - "⇉": "⇉", - "⋌": "⋌", - "˚": "˚", - "": "", - "⎱": "⎱", - "⫮": "⫮", - "⟭": "⟭", - "⇾": "⇾", - "⦆": "⦆", - 𝕣: "𝕣", - "⨮": "⨮", - "⨵": "⨵", - ")": ")", - "⦔": "⦔", - "⨒": "⨒", - "›": "›", - 𝓇: "𝓇", - "⋊": "⋊", - "▹": "▹", - "⧎": "⧎", - "⥨": "⥨", - "℞": "℞", - ś: "ś", - "⪴": "⪴", - "⪸": "⪸", - š: "š", - ş: "ş", - ŝ: "ŝ", - "⪶": "⪶", - "⪺": "⪺", - "⋩": "⋩", - "⨓": "⨓", - с: "с", - "⋅": "⋅", - "⩦": "⩦", - "⇘": "⇘", - "§": "§", - ";": ";", - "⤩": "⤩", - "✶": "✶", - 𝔰: "𝔰", - "♯": "♯", - щ: "щ", - ш: "ш", - "": "", - σ: "σ", - ς: "ς", - "⩪": "⩪", - "⪞": "⪞", - "⪠": "⪠", - "⪝": "⪝", - "⪟": "⪟", - "≆": "≆", - "⨤": "⨤", - "⥲": "⥲", - "⨳": "⨳", - "⧤": "⧤", - "⌣": "⌣", - "⪪": "⪪", - "⪬": "⪬", - "⪬︀": "⪬︀", - ь: "ь", - "/": "/", - "⧄": "⧄", - "⌿": "⌿", - 𝕤: "𝕤", - "♠": "♠", - "⊓︀": "⊓︀", - "⊔︀": "⊔︀", - 𝓈: "𝓈", - "☆": "☆", - "⊂": "⊂", - "⫅": "⫅", - "⪽": "⪽", - "⫃": "⫃", - "⫁": "⫁", - "⫋": "⫋", - "⊊": "⊊", - "⪿": "⪿", - "⥹": "⥹", - "⫇": "⫇", - "⫕": "⫕", - "⫓": "⫓", - "♪": "♪", - "¹": "¹", - "²": "²", - "³": "³", - "⫆": "⫆", - "⪾": "⪾", - "⫘": "⫘", - "⫄": "⫄", - "⟉": "⟉", - "⫗": "⫗", - "⥻": "⥻", - "⫂": "⫂", - "⫌": "⫌", - "⊋": "⊋", - "⫀": "⫀", - "⫈": "⫈", - "⫔": "⫔", - "⫖": "⫖", - "⇙": "⇙", - "⤪": "⤪", - ß: "ß", - "⌖": "⌖", - τ: "τ", - ť: "ť", - ţ: "ţ", - т: "т", - "⌕": "⌕", - 𝔱: "𝔱", - θ: "θ", - ϑ: "ϑ", - þ: "þ", - "×": "×", - "⨱": "⨱", - "⨰": "⨰", - "⌶": "⌶", - "⫱": "⫱", - 𝕥: "𝕥", - "⫚": "⫚", - "‴": "‴", - "▵": "▵", - "≜": "≜", - "◬": "◬", - "⨺": "⨺", - "⨹": "⨹", - "⧍": "⧍", - "⨻": "⨻", - "⏢": "⏢", - 𝓉: "𝓉", - ц: "ц", - ћ: "ћ", - ŧ: "ŧ", - "⥣": "⥣", - ú: "ú", - ў: "ў", - ŭ: "ŭ", - û: "û", - у: "у", - ű: "ű", - "⥾": "⥾", - 𝔲: "𝔲", - ù: "ù", - "▀": "▀", - "⌜": "⌜", - "⌏": "⌏", - "◸": "◸", - ū: "ū", - ų: "ų", - 𝕦: "𝕦", - υ: "υ", - "⇈": "⇈", - "⌝": "⌝", - "⌎": "⌎", - ů: "ů", - "◹": "◹", - 𝓊: "𝓊", - "⋰": "⋰", - ũ: "ũ", - ü: "ü", - "⦧": "⦧", - "⫨": "⫨", - "⫩": "⫩", - "⦜": "⦜", - "⊊︀": "⊊︀", - "⫋︀": "⫋︀", - "⊋︀": "⊋︀", - "⫌︀": "⫌︀", - в: "в", - "⊻": "⊻", - "≚": "≚", - "⋮": "⋮", - 𝔳: "𝔳", - 𝕧: "𝕧", - 𝓋: "𝓋", - "⦚": "⦚", - ŵ: "ŵ", - "⩟": "⩟", - "≙": "≙", - ℘: "℘", - 𝔴: "𝔴", - 𝕨: "𝕨", - 𝓌: "𝓌", - 𝔵: "𝔵", - ξ: "ξ", - "⋻": "⋻", - 𝕩: "𝕩", - 𝓍: "𝓍", - ý: "ý", - я: "я", - ŷ: "ŷ", - ы: "ы", - "¥": "¥", - 𝔶: "𝔶", - ї: "ї", - 𝕪: "𝕪", - 𝓎: "𝓎", - ю: "ю", - ÿ: "ÿ", - ź: "ź", - ž: "ž", - з: "з", - ż: "ż", - ζ: "ζ", - 𝔷: "𝔷", - ж: "ж", - "⇝": "⇝", - 𝕫: "𝕫", - 𝓏: "𝓏", - "": "", - "": "", - }, - }, - }); - }, - 687: (r, e) => { - Object.defineProperty(e, "__esModule", { value: !0 }), - (e.numericUnicodeMap = { - 0: 65533, - 128: 8364, - 130: 8218, - 131: 402, - 132: 8222, - 133: 8230, - 134: 8224, - 135: 8225, - 136: 710, - 137: 8240, - 138: 352, - 139: 8249, - 140: 338, - 142: 381, - 145: 8216, - 146: 8217, - 147: 8220, - 148: 8221, - 149: 8226, - 150: 8211, - 151: 8212, - 152: 732, - 153: 8482, - 154: 353, - 155: 8250, - 156: 339, - 158: 382, - 159: 376, - }); - }, - 967: (r, e) => { - Object.defineProperty(e, "__esModule", { value: !0 }), - (e.fromCodePoint = - String.fromCodePoint || - function (r) { - return String.fromCharCode( - Math.floor((r - 65536) / 1024) + 55296, - ((r - 65536) % 1024) + 56320 - ); - }), - (e.getCodePoint = String.prototype.codePointAt - ? function (r, e) { - return r.codePointAt(e); - } - : function (r, e) { - return ( - 1024 * (r.charCodeAt(e) - 55296) + - r.charCodeAt(e + 1) - - 56320 + - 65536 - ); - }), - (e.highSurrogateFrom = 55296), - (e.highSurrogateTo = 56319); - }, - }, - a = {}; - function t(r) { - var o = a[r]; - if (void 0 !== o) return o.exports; - var c = (a[r] = { exports: {} }); - return e[r].call(c.exports, c, c.exports, t), c.exports; - } - (t.n = (r) => { - var e = r && r.__esModule ? () => r.default : () => r; - return t.d(e, { a: e }), e; - }), - (t.d = (r, e) => { - for (var a in e) - t.o(e, a) && - !t.o(r, a) && - Object.defineProperty(r, a, { enumerable: !0, get: e[a] }); - }), - (t.o = (r, e) => Object.prototype.hasOwnProperty.call(r, e)), - (r = t(563)), - (window.html_encode = r.encode), - (window.html_decode = r.decode); -})(); +(()=>{"use strict";var r,e={563:function(r,e,a){var t=this&&this.__assign||function(){return(t=Object.assign||function(r){for(var e,a=1,t=arguments.length;a