付録:アイヌ語の方言地図


アイヌ語方言地図SVGジェネレーターは、アイヌ語の単語の地理的分布を視覚化するためのSVG地図を生成するウェブアプリケーションである。各種データを入力することで、方言ごとの単語の広がりを示す地図が自動的に作成される。生成された地図(SVG形式)やデータ(Luaコード、Wikipedia形式の表)は、WikipediaやWiktionaryなどのプロジェクトで利用しやすいように設計されている。
概要
[編集]このツールは、アイヌ語研究や方言の比較・分析を支援することを目的としている。ユーザーが特定の単語(例:「酔う」)に対する各地域の方言形を入力すると、ツールが自動的に単語の異なりを分類し、地図上に色分けされた記号や領域で表示する。これにより、どの地域でどの語形が使われているかを直感的に把握することが可能となる。
主な機能
[編集]このツールは、画面左側の設定パネルと右側のプレビューエリア、そして画面下部のデータ入力エリアで構成されている。
1. 基本設定
[編集]地図全体の基本的な見た目を調整する。
- 領域の拡張距離 (半径): 地図上の各地点の分布を示す円や領域の大きさを調整する。値を大きくすると、各地点の影響範囲が広がる。
- 凡例のX/Y座標: 地図上に表示される凡例の位置を、X座標とY座標で指定する。
- 凡例のサイズ: 凡例の文字や記号の大きさを調整する。
2. タイトル設定
[編集]地図の上部に表示されるタイトルを設定する。
- 英語、ふりがな、漢字の3種類のタイトルを個別に設定可能。
- それぞれのテキスト内容、フォントサイズ、表示位置(X/Y座標)を細かく調整できる。
3. データ自動入力
[編集]本ツールの中心的な機能であり、方言データを貼り付けるだけで地図の大部分を自動生成できる。
入力形式
[編集]以下の形式でタブ区切りテキスト(TSV)を用意し、テキストエリアに貼り付ける。
en to get drunk
kana よう
kanji 酔う
id data
1 ihóski 《酒に酔う》((H))
2
3 ihóski((H))
4
5
6
7
8 ihóski((H))
9 iyoski(酔う、酔っぱらう);yoski(酔う、酔っぱらう)((kushiro2021))
10 iyoski((H))
11 ihóski (N); 'iyóski (H)((H))
12 ihóski((H))
13 iyóski((H))
14
15
16
17 ihoske(-an)((C3))
18 ihoski [自]((H))
19
20 ihóski〜'iyóski [自]((H))
21
22
23
24 e-sake-kinrakar(酔う);kuani(ku)-sake-kinrakar(酔う)((bugaeva_sato2021))
25
26
27
28
29
30
31
32
33 cep pe yoski;yoski((C3))
- 最初の数行で、地図のタイトルとなる英語(en)、ふりがな(kana)、漢字(kanji)を指定する。
id dataというヘッダー行に続けて、各地点の方言データを入力する。id列には、予めツールに定義されている場所ID(1〜75)を入れる。data列には、その地点で採録された方言形を記述する。複数の語形がある場合はセミコロン(;)やカンマ(,)で区切る。
自動処理
[編集]「処理実行 & 全データに反映」ボタンを押すと、以下の処理が自動で行われる。
- タイトル部分(en, kana, kanji)が「2. タイトル設定」に反映される。
data列の内容を解析し、外来語や注釈などを除外してアイヌ語の語形を抽出する。- 抽出された語形を正規化し、異なりを自動で分類する。分類結果は「4. 記号データ」に自動的に入力される。
- 各地点(場所ID)にどの語形(記号)が存在するかを割り出し、「5. 配置データ」に自動的に入力される。
- 上記のデータに基づいて、右側のプレビューがリアルタイムで更新される。
- 凡例のサイズが、語形の数や長さに応じて見やすいように自動調整される。
- 後述する「6. Wikipedia形式の表」と「7. Luaコード」も同時に生成される。
4. 記号データ と 5. 配置データ
[編集]これらのセクションでは、手動でデータを設定・編集できる。「3. データ自動入力」の結果を微調整したり、完全に手動で地図を作成したりする場合に使用する。
- 記号データ: 凡例に表示される記号と単語の対応を定義する。入力形式は
記号ID [タブ/カンマ] 単語名。 - 配置データ: 地図上の各地点(場所ID)にどの記号を配置するかを定義する。入力形式は
場所ID [タブ/カンマ] 記号ID1 [タブ/カンマ] 記号ID2...。1つの場所に複数の記号を配置することも可能。
6. Wikipedia形式の表
[編集]「3. データ自動入力」で処理したデータを元に、Wikipediaの記事でそのまま使える表形式のコード(ウィキテキスト)を生成する。「表をコピー」ボタンで簡単にクリップボードにコピーできる。
7. Luaコード
[編集]ウィクショナリーのデータモジュールなどで使用されることを想定したLuaコードを生成する。「3. データ自動入力」のデータを解析し、各地の地名(英語名)と、対応する方言形(ローマ字表記から自動でカタカナ転写を試みたもの)を関連付けて出力する。「Luaをコピー」ボタンでコピーできる。
8. 一括処理
[編集]多数の単語地図を連続して作成するための機能。指定された形式のTSVファイルをドラッグ&ドロップすると、ファイルの各行がそれぞれ1つの単語地図のデータとして扱われ、連続で処理される。処理が完了すると、生成された全てのSVGファイルとLuaファイルが1つのZipファイルにまとめられ、自動的にダウンロードされる。
出力ファイル
[編集]ツールからは以下のファイルをダウンロードできる。
- SVGファイル: ベクター画像形式の地図画像。ファイル名は「2. タイトル設定」の英語タイトルに基づいて自動生成される(例:
MapOfAinuLanguage-MindHeartSoul.svg)。 - Luaファイル: Wiktionary用のデータモジュール。ファイル名は主要な方言形のカタカナ表記に基づいて自動生成される。
ソースコード
[編集]以下のソースコードをコピーし、テキストエディタで貼り付け、html拡張子を付けて保存しブラウザで開くことでアイヌ語方言地図SVGジェネレーターが利用可能である。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>アイヌ語方言地図SVGジェネレーター</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Noto+Sans+JP:wght@400;500;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Noto Sans JP', 'Inter', sans-serif;
background-color: #f8fafc;
}
.prose h2 {
font-size: 1.125rem;
margin-bottom: 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid #e5e7eb;
}
.prose h3 {
font-size: 1rem;
margin-top: 1rem;
margin-bottom: 0.5rem;
}
.prose input[type="text"], .prose input[type="number"], .prose textarea {
width: 100%;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
border: 1px solid #d1d5db;
transition: border-color 0.2s, box-shadow 0.2s;
}
.prose input:focus, .prose textarea:focus {
outline: none;
border-color: #3b82f6;
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.4);
}
.btn {
padding: 0.5rem 1rem;
border-radius: 0.375rem;
color: white;
font-weight: 500;
cursor: pointer;
transition: background-color 0.2s;
}
.btn-blue {
background-color: #3b82f6;
}
.btn-blue:hover {
background-color: #2563eb;
}
#lang-selector {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M6 9l6 6 6-6'/%3e%3c/svg%3e");
background-repeat: no-repeat;
background-position: right 0.5rem center;
background-size: 1.5em 1.5em;
padding-right: 2.5rem;
}
#dropZone.drag-over {
border-color: #3b82f6;
background-color: #eff6ff;
}
</style>
</head>
<body class="text-gray-800">
<div class="container mx-auto p-4 lg:p-6">
<header class="relative text-center mb-6">
<div class="absolute top-0 right-0">
<select id="lang-selector" class="bg-white border border-gray-300 text-gray-700 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5">
<option value="ja">日本語</option>
<option value="en">English</option>
<option value="zh">中文</option>
<option value="ko">한국어</option>
<option value="ru">Русский</option>
</select>
</div>
<h1 data-lang-key="appTitle" class="text-2xl lg:text-3xl font-bold text-gray-900">アイヌ語方言地図SVGジェネレーター</h1>
<p data-lang-key="appSubtitle" class="text-gray-600 mt-2">各種データを入力または編集して、アイヌ語方言地図を生成します。</p>
</header>
<!-- 上段:設定とプレビュー -->
<div class="grid grid-cols-1 lg:grid-cols-12 gap-6 mb-6">
<!-- 設定パネル -->
<div class="lg:col-span-4 bg-white p-6 rounded-xl shadow-lg prose prose-sm max-w-none">
<div class="mb-6">
<h2 data-lang-key="section1Title">1. 基本設定</h2>
<div>
<label for="maxDistance" class="block font-medium" data-lang-key="maxDistLabel">領域の拡張距離 (半径)</label>
<input type="number" id="maxDistance" class="mt-1" value="500">
</div>
<div class="mt-4">
<label for="legendX" class="block font-medium" data-lang-key="legendXLabel">凡例のX座標</label>
<input type="number" id="legendX" class="mt-1">
</div>
<div class="mt-4">
<label for="legendY" class="block font-medium" data-lang-key="legendYLabel">凡例のY座標</label>
<input type="number" id="legendY" class="mt-1">
</div>
<div class="mt-4">
<label for="legendSize" class="block font-medium" data-lang-key="legendSizeLabel">凡例のサイズ</label>
<input type="number" id="legendSize" class="mt-1">
</div>
</div>
<div class="mb-6">
<h2 data-lang-key="section2Title">2. タイトル設定</h2>
<div id="titleSettings"></div>
</div>
</div>
<!-- SVGプレビューエリア -->
<div class="lg:col-span-8 bg-white p-6 rounded-xl shadow-lg">
<div class="flex justify-between items-center mb-4">
<h2 class="text-xl font-bold text-gray-900" data-lang-key="previewTitle">プレビュー</h2>
<div>
<button id="downloadSvg" class="btn btn-blue" data-lang-key="downloadSvgBtn">SVGをダウンロード</button>
<button id="downloadLua" class="btn btn-blue ml-2" data-lang-key="downloadLuaBtn">Luaをダウンロード</button>
</div>
</div>
<div id="svgPreview" class="border border-gray-200 rounded-lg w-full h-[600px] lg:h-auto lg:aspect-[72/59] overflow-auto bg-gray-50">
<p class="p-4 text-gray-500" data-lang-key="previewLoading">設定を読み込んでいます...</p>
</div>
</div>
</div>
<!-- 中段:データ自動入力 -->
<div class="bg-white p-6 rounded-xl shadow-lg prose max-w-none mb-6">
<h2 data-lang-key="section3Title">3. データ自動入力 (タブ区切り)</h2>
<p data-lang-key="section3Desc" class="text-sm text-gray-600">ここに処理したいデータを貼り付けてください。ヘッダー(idとdata)もタブで区切ってください。</p>
<textarea id="rawDataInput" class="w-full h-40 p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition" placeholder="en mind, heart, soul kana こころ kanji 心 id data 1 sísam; inuye書く。 2 pa, -ke; sató [日本語] 3 hesurí (sísam); makta《曾祖母》 4 1uré; sút, -cí [雅・稀] 5 sísam"></textarea>
<div class="mt-4 text-center">
<button id="processDataBtn" class="bg-blue-600 text-white font-bold py-2 px-6 rounded-lg hover:bg-blue-700 focus:outline-none focus:ring-4 focus:ring-blue-300 transition-all duration-300 transform hover:scale-105" data-lang-key="processBtn">
処理実行 & 全データに反映
</button>
</div>
<div id="processingError" class="mt-4 bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded-lg relative hidden" role="alert">
<strong class="font-bold" data-lang-key="errorHeader">エラー:</strong>
<span class="block sm:inline"></span>
</div>
</div>
<!-- 下段:データテーブル -->
<div class="grid grid-cols-1 lg:grid-cols-12 gap-6">
<!-- 記号データ -->
<div class="lg:col-span-5 bg-white p-6 rounded-xl shadow-lg prose prose-sm max-w-none">
<h2 data-lang-key="section4Title">4. 記号データ</h2>
<p data-lang-key="section4Desc" class="text-xs text-gray-600">以下の形式でタブまたはカンマ区切りのデータを貼り付けてください:<br><code class="text-xs">記号ID [tab/comma] 単語名</code></p>
<textarea id="symbolDataInput" rows="10" class="font-mono text-sm"></textarea>
<button id="loadSymbolData" class="btn btn-blue mt-2" data-lang-key="loadDataBtn">データを読み込み</button>
</div>
<!-- 配置データ -->
<div class="lg:col-span-7 bg-white p-6 rounded-xl shadow-lg prose prose-sm max-w-none">
<h2 data-lang-key="section5Title">5. 配置データ</h2>
<p data-lang-key="section5Desc" class="text-xs text-gray-600">以下の形式でタブまたはカンマ区切りのデータを貼り付けてください:<br><code class="text-xs">場所ID [tab/comma] 記号ID1 [tab/comma] 記号ID2 ...</code></p>
<textarea id="placementDataInput" rows="10" class="font-mono text-sm"></textarea>
<button id="loadPlacementData" class="btn btn-blue mt-2" data-lang-key="loadDataBtn">データを読み込み</button>
</div>
<!-- TSV -> Wikipedia表 変換ツール -->
<div class="lg:col-span-12 bg-white p-6 rounded-xl shadow-lg prose max-w-none mt-6">
<h2 data-lang-key="section6Title">6. Wikipedia形式の表</h2>
<p data-lang-key="section6Desc" class="text-sm text-gray-600">「3. データ自動入力」のTSVデータと地点データを元に、Wikipedia形式の表が自動生成されます。</p>
<div class="flex items-center gap-4 mt-4">
<button id="copyWikiTableBtn" class="bg-gray-200 text-gray-700 font-semibold py-2 px-4 rounded-lg hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-400 transition-all text-sm" data-lang-key="copyTableBtn">
表をコピー
</button>
</div>
<textarea id="wikiTableOutput" readonly class="w-full h-60 mt-4 p-3 font-mono text-sm border border-gray-300 rounded-lg bg-gray-50"></textarea>
</div>
<!-- Luaコード生成ツール -->
<div class="lg:col-span-12 bg-white p-6 rounded-xl shadow-lg prose max-w-none mt-6">
<h2 data-lang-key="section7Title">7. Luaコード</h2>
<p data-lang-key="section7Desc" class="text-sm text-gray-600">「3. データ自動入力」のデータからWiktionary用のLuaコードを生成します。</p>
<div class="flex items-center gap-4 mt-4">
<button id="copyLuaBtn" class="bg-gray-200 text-gray-700 font-semibold py-2 px-4 rounded-lg hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-400 transition-all text-sm" data-lang-key="copyLuaBtn">
Luaをコピー
</button>
</div>
<textarea id="luaCodeOutput" readonly class="w-full h-60 mt-4 p-3 font-mono text-sm border border-gray-300 rounded-lg bg-gray-50"></textarea>
</div>
<!-- 一括処理 -->
<div class="lg:col-span-12 bg-white p-6 rounded-xl shadow-lg prose max-w-none mt-6">
<h2 data-lang-key="section8Title">8. 一括処理 (TSVファイル)</h2>
<p data-lang-key="section8Desc" class="text-sm text-gray-600">指定形式のTSVファイルをここにドラッグ&ドロップすると、各行のデータが個別に処理され、SVGとLuaファイルが自動的にダウンロードされます。</p>
<div id="dropZone" class="mt-4 border-2 border-dashed border-gray-300 rounded-lg p-10 text-center cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-colors">
<p id="dropZoneText" data-lang-key="dropZoneText">ここにファイルをドラッグ&ドロップ</p>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
// --- START: 多言語対応 ---
const uiStrings = {
appTitle: { ja: "アイヌ語方言地図SVGジェネレーター", en: "Ainu Dialect Map SVG Generator", zh: "阿伊努语方言地图SVG生成器", ko: "아이누어 방언 지도 SVG 생성기", ru: "Генератор SVG карты диалектов айнского языка" },
appSubtitle: { ja: "各種データを入力または編集して、アイヌ語方言地図を生成します。", en: "Generate an Ainu dialect map by entering or editing various data.", zh: "通过输入或编辑各种数据来生成阿伊努语方言地图。", ko: "각종 데이터를 입력하거나 편집하여 아이누어 방언 지도를 생성합니다.", ru: "Создайте карту диалектов айнского языка, вводя или редактируя различные данные." },
section1Title: { ja: "1. 基本設定", en: "1. Basic Settings", zh: "1. 基本设置", ko: "1. 기본 설정", ru: "1. Основные настройки" },
maxDistLabel: { ja: "領域の拡張距離 (半径)", en: "Area Expansion Distance (Radius)", zh: "区域扩张距离(半径)", ko: "영역 확장 거리 (반경)", ru: "Расстояние расширения области (радиус)" },
legendXLabel: { ja: "凡例のX座標", en: "Legend X-coordinate", zh: "图例X坐标", ko: "범례 X좌표", ru: "Координата X легенды" },
legendYLabel: { ja: "凡例のY座標", en: "Legend Y-coordinate", zh: "图例Y坐标", ko: "범례 Y좌표", ru: "Координата Y легенды" },
legendSizeLabel: { ja: "凡例のサイズ", en: "Legend Size", zh: "图例大小", ko: "범례 크기", ru: "Размер легенды" },
section2Title: { ja: "2. タイトル設定", en: "2. Title Settings", zh: "2. 标题设置", ko: "2. 제목 설정", ru: "2. Настройки заголовка" },
titleEnglish: { ja: "英語", en: "English", zh: "英语", ko: "영어", ru: "Английский" },
titleHiragana: { ja: "ふりがな", en: "Furigana", zh: "日文假名", ko: "후리가나", ru: "Фуригана" },
titleKanji: { ja: "漢字", en: "Kanji", zh: "汉字", ko: "한자", ru: "Кандзи" },
textLabel: { ja: "テキスト", en: "Text", zh: "文本", ko: "텍스트", ru: "Текст" },
sizeLabel: { ja: "サイズ", en: "Size", zh: "大小", ko: "크기", ru: "Размер" },
xCoordLabel: { ja: "X座標", en: "X-coord", zh: "X坐标", ko: "X좌표", ru: "X-коорд" },
yCoordLabel: { ja: "Y座標", en: "Y-coord", zh: "Y坐标", ko: "Y좌표", ru: "Y-коорд" },
previewTitle: { ja: "プレビュー", en: "Preview", zh: "预览", ko: "미리보기", ru: "Предпросмотр" },
downloadSvgBtn: { ja: "SVGをダウンロード", en: "Download SVG", zh: "下载SVG", ko: "SVG 다운로드", ru: "Скачать SVG" },
downloadLuaBtn: { ja: "Luaをダウンロード", en: "Download Lua", zh: "下载Lua", ko: "Lua 다운로드", ru: "Скачать Lua" },
previewLoading: { ja: "設定を読み込んでいます...", en: "Loading settings...", zh: "正在加载设置...", ko: "설정을 불러오는 중...", ru: "Загрузка настроек..." },
section3Title: { ja: "3. データ自動入力 (タブ区切り)", en: "3. Automatic Data Input (Tab-separated)", zh: "3. 自动数据输入(制表符分隔)", ko: "3. 데이터 자동 입력 (탭으로 구분)", ru: "3. Автоматический ввод данных (с разделителями-табуляциями)" },
section3Desc: { ja: "ここに処理したいデータを貼り付けてください。ヘッダー(idとdata)もタブで区切ってください。", en: "Paste the data you want to process here. The header (id and data) must also be separated by tabs.", zh: "请在此处粘贴您要处理的数据。标题(id和data)也必须用制表符分隔。", ko: "처리할 데이터를 여기에 붙여넣으세요. 헤더(id 및 data)도 탭으로 구분해야 합니다.", ru: "Вставьте данные для обработки сюда. Заголовок (id и data) также должен быть разделен табуляцией." },
processBtn: { ja: "処理実行 & 全データに反映", en: "Process & Apply to All Data", zh: "处理并应用于所有数据", ko: "처리 실행 및 모든 데이터에 반영", ru: "Обработать и применить ко всем данным" },
errorHeader: { ja: "エラー:", en: "Error:", zh: "错误:", ko: "오류:", ru: "Ошибка:" },
section4Title: { ja: "4. 記号データ", en: "4. Symbol Data", zh: "4. 符号数据", ko: "4. 기호 데이터", ru: "4. Данные символов" },
section4Desc: { ja: "以下の形式でタブまたはカンマ区切りのデータを貼り付けてください:<br><code class=\"text-xs\">記号ID [tab/comma] 単語名</code>", en: "Paste data in the following format (tab or comma separated):<br><code class=\"text-xs\">Symbol ID [tab/comma] Word</code>", zh: "请按以下格式粘贴数据(制表符或逗号分隔):<br><code class=\"text-xs\">符号ID [tab/comma] 单词</code>", ko: "다음 형식으로 데이터를 붙여넣으세요 (탭 또는 쉼표로 구분):<br><code class=\"text-xs\">기호 ID [tab/comma] 단어</code>", ru: "Вставьте данные в следующем формате (разделитель - табуляция или запятая):<br><code class=\"text-xs\">ID символа [tab/comma] Слово</code>" },
loadDataBtn: { ja: "データを読み込み", en: "Load Data", zh: "加载数据", ko: "데이터 불러오기", ru: "Загрузить данные" },
section5Title: { ja: "5. 配置データ", en: "5. Placement Data", zh: "5. 放置数据", ko: "5. 배치 데이터", ru: "5. Данные о размещении" },
section5Desc: { ja: "以下の形式でタブまたはカンマ区切りのデータを貼り付けてください:<br><code class=\"text-xs\">場所ID [tab/comma] 記号ID1...</code>", en: "Paste data in the following format (tab or comma separated):<br><code class=\"text-xs\">Location ID [tab/comma] Symbol ID 1...</code>", zh: "请按以下格式粘贴数据(制表符或逗号分隔):<br><code class=\"text-xs\">位置ID [tab/comma] 符号ID1...</code>", ko: "다음 형식으로 데이터를 붙여넣으세요 (탭 또는 쉼표로 구분):<br><code class=\"text-xs\">장소 ID [tab/comma] 기호 ID 1...</code>", ru: "Вставьте данные в следующем формате (разделитель - табуляция или запятая):<br><code class=\"text-xs\">ID местоположения [tab/comma] ID символа 1...</code>" },
section6Title: { ja: "6. Wikipedia形式の表", en: "6. Wikipedia Table Format", zh: "6. Wikipedia表格格式", ko: "6. 위키피디아 형식 표", ru: "6. Формат таблицы Wikipedia" },
section6Desc: { ja: "「3. データ自動入力」のTSVデータと地点データを元に、Wikipedia形式の表が自動生成されます。", en: "A Wikipedia-formatted table is automatically generated based on the TSV data from '3. Automatic Data Input' and location data.", zh: "根据“3. 自动数据输入”中的TSV数据和位置数据自动生成Wikipedia格式的表格。", ko: "'3. 데이터 자동 입력'의 TSV 데이터와 위치 데이터를 기반으로 위키피디아 형식의 표가 자동으로 생성됩니다.", ru: "Таблица в формате Wikipedia автоматически генерируется на основе данных TSV из '3. Автоматический ввод данных' и данных о местоположении." },
copyTableBtn: { ja: "表をコピー", en: "Copy Table", zh: "复制表格", ko: "표 복사", ru: "Копировать таблицу" },
section7Title: { ja: "7. Luaコード", en: "7. Lua Code", zh: "7. Lua代码", ko: "7. Lua 코드", ru: "7. Код Lua" },
section7Desc: { ja: "「3. データ自動入力」のデータからWiktionary用のLuaコードを生成します。", en: "Generate Lua code for Wiktionary from the data in '3. Automatic Data Input'.", zh: "从“3. 自动数据输入”中的数据生成用于Wiktionary的Lua代码。", ko: "'3. 데이터 자동 입력'의 데이터로 위키낱말사전용 Lua 코드를 생성합니다.", ru: "Создайте код Lua для Викисловаря из данных в '3. Автоматический ввод данных'." },
copyLuaBtn: { ja: "Luaをコピー", en: "Copy Lua", zh: "复制Lua", ko: "Lua 복사", ru: "Копировать Lua" },
section8Title: { ja: "8. 一括処理 (TSVファイル)", en: "8. Batch Processing (TSV File)", zh: "8. 批量处理(TSV文件)", ko: "8. 일괄 처리 (TSV 파일)", ru: "8. Пакетная обработка (TSV-файл)" },
section8Desc: { ja: "指定形式のTSVファイルをここにドラッグ&ドロップすると、各行のデータが個別に処理され、SVGとLuaファイルが自動的にダウンロードされます。", en: "Drag and drop a TSV file in the specified format here. Each row of data will be processed individually, and SVG and Lua files will be automatically downloaded.", zh: "将指定格式的TSV文件拖放到此处。每行数据都将被单独处理,并自动下载SVG和Lua文件。", ko: "지정된 형식의 TSV 파일을 여기에 드래그 앤 드롭하세요. 각 데이터 행이 개별적으로 처리되고 SVG 및 Lua 파일이 자동으로 다운로드됩니다.", ru: "Перетащите сюда TSV-файл указанного формата. Каждая строка данных будет обработана индивидуально, а файлы SVG и Lua будут загружены автоматически." },
dropZoneText: { ja: "ここにファイルをドラッグ&ドロップ", en: "Drag & Drop File Here", zh: "将文件拖放到此处", ko: "여기에 파일 끌어다 놓기", ru: "Перетащите файл сюда" },
copySuccess: { ja: "コピー完了!", en: "Copied!", zh: "已复制!", ko: "복사 완료!", ru: "Скопировано!" },
errorGeneric: { ja: "エラー: SVGの生成に失敗しました。", en: "Error: Failed to generate SVG.", zh: "错误:SVG生成失败。", ko: "오류: SVG 생성에 실패했습니다.", ru: "Ошибка: не удалось создать SVG." },
errorInputEmpty: { ja: "入力データが空です。", en: "Input data is empty.", zh: "输入数据为空。", ko: "입력 데이터가 비어 있습니다.", ru: "Входные данные пусты." },
errorInputShort: { ja: "データはヘッダー行を含めて2行以上必要です。", en: "Data must have at least 2 rows, including the header.", zh: "数据必须至少有2行,包括标题行。", ko: "데이터는 헤더를 포함하여 2줄 이상이어야 합니다.", ru: "Данные должны содержать не менее 2 строк, включая заголовок." },
errorHeaderNotFound: { ja: "ヘッダーに \"id\" と \"data\" が見つかりません。", en: "Header must contain 'id' and 'data'.", zh: "标题中必须包含“id”和“data”。", ko: "헤더에 'id'와 'data'가 없습니다.", ru: "Заголовок должен содержать 'id' и 'data'." },
wikiTableErrorNoData: { ja: "「3. データ自動入力」にデータがありません。", en: "No data in '3. Automatic Data Input'.", zh: "“3. 自动数据输入”中没有数据。", ko: "'3. 데이터 자동 입력'에 데이터가 없습니다.", ru: "Нет данных в '3. Автоматический ввод данных'." },
wikiTableErrorShort: { ja: "「3. データ自動入力」のデータはヘッダー行を含めて2行以上必要です。", en: "Data in '3. Automatic Data Input' must have at least 2 rows, including the header.", zh: "“3. 自动数据输入”中的数据必须至少有2行,包括标题行。", ko: "'3. 데이터 자동 입력'의 데이터는 헤더를 포함하여 2줄 이상이어야 합니다.", ru: "Данные в '3. Автоматический ввод данных' должны содержать не менее 2 строк, включая заголовок." }
};
let currentLanguage = 'ja';
function setLanguage(lang) {
currentLanguage = lang;
document.documentElement.lang = lang;
document.querySelectorAll('[data-lang-key]').forEach(el => {
const key = el.dataset.langKey;
if (uiStrings[key] && uiStrings[key][lang]) {
if(el.tagName === 'TEXTAREA' && el.placeholder) {
// Placeholderの翻訳は未対応なのでスキップ
} else if (key === 'section4Desc' || key === 'section5Desc') {
el.innerHTML = uiStrings[key][lang];
}
else {
el.textContent = uiStrings[key][lang];
}
}
});
// タイトル設定のラベルも更新
renderTitleSettings();
}
// --- END: 多言語対応 ---
// 基準地図のSVGデータを直接埋め込み
const baseMapSVG = `<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 7200 5900">
<defs>
<style>
.st0, .st1 {
fill: #ABD7B1;
}
.st2 {
fill: #fff;
}
.st1 {
stroke: #000000;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 10px;
}
</style>
</defs>
<g id="canvas">
<rect class="st2" width="7200" height="5900"/>
</g>
<path class="st1" d="M1689.7-.8c-10.7,6.5-.5,12.3,6.6,6.6,9.4-5.8,11.1,1,13.3,9.3,66.4,243.1,47.7,506.4,177.8,728.9,3.8,6.7,5.5,13.1,3,20.6-3.2,12.6,3.1,25.8,6,38,9.6,28,18.6,56.2,30.5,83.4,5.7,15.8,20.3,30.6,15.2,48.4-9.9,47.7,15.6,92.3,42.7,129.4,6.9,12.7-11.9,9.8-3.7,36.4-.8,14,2.3,27.2,7.6,40,.7,16.8,6,32.5,10.9,48.4,0,40.8,22.7,63.3,31.5,100.4,2.6,18.6,17.2,34.3,16.3,53.3.3,17.2,22.6,29.4,34.7,39.2,25,18.5,47.3,40.1,70.8,60.3,5,3.6,7.9,10.1,11.4,14.9-4.1,14.8-2.6,31.7,4.4,50.7-14.9,12.2-9.7,36.9-1.1,51.6,2,5.8,15,18.1,5.1,21.5-3.4,1.2-6.8,2.5-11.2,1.2.4-29-10.6-23.5-8.4-43.2,2.1-16.1.3-31.5-9.2-45.6-7-14.1-15.8-27.4-22.2-41.8-2.7-6.7-6.1-13-11.3-18.3-6.6-8.4-12.1-18.1-20-25.5-7.3-7.1-15.1-13.5-18.6-23.5-10.9-15.2-25.7-25.2-43.6-31.2-3.8-6-5.5-13.5-11.4-18-10.6-7.1-17.6-16.9-22.1-28.7-4-8.2-6.8-18.6-15-23.3-20.5-10-20.2-37.1-40.4-46.5-138.3-75.4-381.5-88.9-454.4,79.9-29.2,75.1,38.1,72.7-10,147.7-88.9,179.6-143.2,385-168.2,580.1,5.2,5.4,3.2,11.6,2.9,18.1-.9,78.4,47.4,215.4,120.5,251.7,12.9,2.2,14.5,18.4,29.9,23.6,8,3.7,14.2,9.8,15.9,19.2,6.4,16.7,12.8,34.1,25.7,46.8,3.1,10,1.8,20.6,6.8,29.8,1.3,2.3,1.1,5.6,1.1,8.5-.4,17.3,12,36.7,0,52.4-9.9,14.3,5,28.4,9,42.1,3.4,9.5,5.6,19.5,10.1,28.5s3.6,15.5,7.8,22.3c2.3,9.3-5.4,14.1,4.5,24.1,3.7,8.7,13.3,11.1,18.6,17.4,7.1,13.7,20.3,21.9,32.8,30.4,13.5,11.2,71.6,26.5,75,.8-.8-6.9-3.3-20.9,8.3-15.3,7.5,4,12.5,9.8,12.3,18.8,1.6,17.9,4.6,35.5,10.7,52.7.7,2.7,1.1,6,0,8.4-5.2,12.9-3.7,25.4,1.6,37.7,6.1,12.6-5.5,20.8,3.2,35.6,3.6,7.3,5.4,14.9,4.9,23.1-.5,8.8,4.2,16.9,4,25.6-.2,9.1,4.5,16.6,6.7,24.9,6.5,19.3-.6,27.4,20.5,39.6,0,18.2-22.7,2.5-19.2,43.1-24.8,13.9-16.9,25.3-23.4,50.2-8.5,7.3-17.9,16-17.6,28.1-.2,10.8-1.5,21.8,1.7,32.3,1.9,6.3,0,11.3-3.5,16.2-6.9,7.8-11.8,16.3-12.4,27,0,.7-1.8,1.4-2.9,1.8-6.2-6-3.7-16.9-5.2-24.7-1.5-8.1-.4-15.6,3.1-23.2.2-7.2-.3-14.5.5-21.6,14-33.4-11.8-84.9-22.3-118.6-25.3-57.8,23.6-36.3-43.2-112.2-10.8-9.3-38.6-38.2-52.4-25-6.8,4.5-21.7,3-29.2-.4-10.4-6.9-22.9-.7-33.6-6.2-11.6-5.5-24.5-11.1-37.1-4.5-9.4,3.2-28.7,14.5-35.9,3.7-5.3-22.4-12.4-44.4-15.7-67.3-.8-5.5-4.4-8.8-10.3-9.4-5.7,4.5-9.6,11.3-17.8,10.4-76.1.9-102.7,84.5-118.8,148.4-8,24.8-22.6,46.8-27.2,72.8-9.2,24.4-18.5,40.4-16.5,66.5.2,27.6-9.2,53.8-19.6,78.9-7.2,22.8,1.5,40.1-27,48.6-19.8,9.2-14.5,34.3-19.5,52-.3,1.6-1.9,2.3-3.5,1.6-17.7-7.3-23.7-28.6-32.5-44-5.4-13.5-16-21.6-25.7-31.9,10-38-6.4-75.7-10.2-113.5-3.7-36.6-8.7-73.3-20.8-108.1-5.9-21.2-12.5-43.9-12.4-65.6,3.9-7.7,3.3-15.3.4-23.1-5.2-11.7,16.1-16.1,14.8-31.3-1.3-32.8,11.3-39,18.1-68,4.2-15.3,10-29.8,15.5-44.7,4.3-9,11-17.2,12-27.7,0-1.4.9-2.9,1.8-3.9,9.7-9.2,10.6-21.8,13.1-33.6,3.2-16.2,9.4-31.7,10.4-48.3,17.6-43.3,15.5-103.7-16.1-140.9-24.1-20,11.1-40.1.6-64-15-44.8-14.9-94.5-9.4-140.6,6.8-12.5,14.7-25.4,14.3-40.1,8.5-29.5,32.8-55.5,32-88.4,1.3-30.9,53.4-51.5,44-87.3-6.2-13.5-6.7-27.9-6.3-42.5-8.1-31.6,0-65.4-8.5-96.4,13.2-114.1-177.9-264.1-101.9-360.5,12.7-12,36.7-18,26-40.4-8.2-15.5,6.7-16.6,13.8-28.1,1.7-19-.5-39.3,8.1-57.1,2.3-5.2,2.1-11.4,2.8-16.9,8.2-17.3-7.6-34.6,4.5-50.1,2.5-4.1,7.2-7.7,8.3-12.5-.5-13.3,14.5-23.5,10.3-36.4-12.2-20.7-3.5-45.5-6-68.1,2.1-14.8,6.6-29.6,9.9-44.3,1.7-11.3,13.2-17.5,11.9-29.3,3.8-23.5,7.3-47.1,7.4-70.9-2.8-21.2,5.1-41.3,4.2-62.4.2-15.1-2-30.3.2-45.3,1.5-13.9,5-26.8-.7-40.4-3.5-10.9-5-22.5-7.1-33.8-.5-2.8-.8-6.2.3-8.6,4.5-9.3,1.2-18.4,0-27.6-3.2-19.1,13.5-22.1,5-45.7-3.1-11.8,9-12.5,7.3-30.3-.3-15.2.3-30.4-.4-45.5,0-18.8-7.5-36.9-4.5-55.8,3.7-14.5-6.3-27.4-9.2-41.2,8.2-8.6,9.6-17.4,6.4-28.4-.5-6.5.9-13.5-1.2-19.3-6.7-19.1-21.3-34.5-26.1-54.3-4.7-20.8-19.3-40.5-13.7-62.4,1.6-29.4,5.4-59,11.8-87.7,7-10.4,6-22.1,5.9-33.5,0-13,2.3-26-.6-38.9-.4-1.8.3-4.4,1.4-6.1,8-12,8.5-25.9,9.3-39.9,48.1-40.3,76.5-142.4,37.4-195.3-6.6-6.3-10.4-13.6-12-22.5"/>
<g>
<path class="st0" d="M391.4,5643.7c-1.9,0-3.7-1-4.7-2.7-17.9-17.6-16.9-12-32.9-11.2-4.2-.3-8.5,0-11.9-2.6-15.3-11.7-16.1-14.9-21.5-32-16.5-45.7-15.7-52.4-4-98.8,4.8-22.6,29.3-39.3,26.9-63.3-.1-9.4,12.2-3.6,15.1-8.8,3.4-3.7,5-11.1,4.4-18,0-7.6,0-16.1,4.5-23.8,8-40.7-16.9-77.4-37.6-110.3h0c-12.2-23-41-4.5-51.6-28.4-4-10.4-9.5-20.5-14.6-30.8-12.7-7.4-35.3-4.9-36.7-27.1,4.8-12-7.6-21.2-2.9-33.1,1.2-7.1,2.6-15.8,10.3-19.8,29.5-32.5,20.1-78.6,11.8-119.4-1.3-6.9-3.3-13.9,2.1-20.5,17.5-31.9,34.3-36.3,49.9-36.3,16-.6,29,5.6,40.7-11.1,4.1-9.8,12.1-13.8,19.3-17.3,8.4-4,15.4-8.1,16.3-19.5,1-4,7.1-23.7,16.6-20.9,22.5,10.2,14.5,26.7,26.6,26.9,13.5-1,16.7-5,17.4-11.7-3.9-34.6,16.6-26.6,25.6-54,5.9-36.4,72.8-41.4,59.9-74.7-6.2-6.6-9.3-14.9-13.8-22.3-8.3-7.5-12.7-17.9-17.6-27.6-7.9-14.1-14-18.4-20.4-22.9-7.7-5.5-15.6-11.2-25.3-31.7-.4-14.2,5.7-28.6,9-41.7,2.7-5.5,1.5-15.5,8.4-17.4,9.3-1.4,23.6.5,28.8-3.2,3.1-2.2,6-7.2,10.3-17.9.8-1.9,2.6-3.1,4.6-3.1,2,0,.8,0,1.2.2,16,4.4,37.3,40.6,54,42.7,5.5.9,6.6,4.9,7.6,9.1,1.1,5.2,2.8,8.6,7.4,9.4,16.1,2.4,29.2,11.6,42.5,19.7,1.8.7,3.1,2.4,3.2,4.5.4,8.9,8.1,12.1,15.1,12.1,12,.3,13.1-6.1,20.5-8.7,17.4,4,19.8-7.9,34.1-11.1,7.6-2.7,19.9-8,24.3-.5,5,10.1-14.2,18.6,6.9,26.6,13.3,2.4,26.4,7.5,40,15.5,4,1.7,8.3,2.6,12.8,2.6,36.2,0,79.4-58.4,99.4-93.1,4.3-12.6,3-27,4.4-40.5.8-23.4-18.9-42-25.6-63.9-5.7-18.4,16.2-36.2,4.3-53.3-10.7-14.5-9.1-33.6-15.9-49.1-4-10.2,1-20.1,7.1-28.7,7.8-8,5.5-24.4,16.9-30.7,9.3-4.8,17.9-13.3,28.9-14.2,8.7.1,12.3-4.5,17.9-11,87.5-19.1,52.9-178.9,52.7-245.1.8-10.6,12.2-12.3,13.5-23.3,2.7-10.9,9.9-17.2,12.2-27.5,19-22.2,20.8-50.3,21-79.6,31.1-93.6-9.1-193.2-42.1-273.2-25.6-62.6-45.9-112.1-19.8-136,8.7-15.9.5-17.6,14-34.6,16.1-22.2-13.2-34.4-.2-58.6,1.2-2.5,4.7-3.7,7.1-2.1,7.6,4.3,5.7,14.9,8.7,20.9,7.1,4.8,12.3,4.4,19.4,1.4,6.6-2.8,15.1-3.9,19.4-2.9,9.2,0,20.2-5.2,28-13.3,6.6-6.9,10-14.7,9.7-22.1,0-13.6,8-28.2,22.4-28.6,5.3-.3,9.9,1.8,12.1,7.3,6,30,18,18.8,26.7,41.2,3.2,17,17,26,31.2,35.6,10.1,6.7,22.4,14.8,28.5,24.6,38.1,57.8,85.5,111,130.8,160.7,11.1,10.4,7.4,25.4,18.5,34.9,5,5.5,10.3,11.4,9.7,19.3-1.2,15.8,10.5,24.3,19.8,34.9,5.4,8.6,7.4,18.4,14.3,25.9,6.8,7.2,11.5,16.4,16.5,25,13,20.2,30.4,37.1,47.3,53.5,17.7,17.2,36.1,35.1,49.6,56.8,26.9,39.3,74.2,57.6,108.2,89.7,11.6,12.9,28,22.3,42.6,30.6,10.1,5,6.1,19.5,14.6,23.9,100.4,70.1,213.7,103.8,324.3,124.2,13,.1,10.1-.8,16.7-1.4,9,2.3,6.4,10.2,7.8,39.6h0c14.5,9.9,10.7,26,23.7,35,26.2,20.7,172.5,52.2,199.4,12.4,11.3-18.3,36-23.9,41.2-45.9,6-11.7,27.1-17.9,30.5-30.1.2-3.8,2.6-7.3,6.3-9.1,21.6-12.1,36.3-32.7,58.1-44.8,16.3-8.5,15.4-27.2,26.4-40.2,12.9-12.1,22.6-25.2,31-43.2,1.4-3.2,6-3.7,8.3-1.1,1.9,2.1,3.7,6.8,3.3,11.2-.2,10.4,4.8,19.2,7.3,29.1.4,1.4,0,3-.8,4.2-3.5,5-5,10.6-6.6,16.5-3.1,15.3-12.4,29.3-21.4,39.8-15.7,16.8-17.1,27.9-18.4,38.7-3.2,38.9-59.7,64.3-59.1,126.8-2.8,33.7-28.8,24.2-3.3,69.4,6,9.3,10.9,20,15.3,29.4,3.8,10.4,8,17,16.8,19.7,6.2,2.6,12.4,5.7,11.9,12.7,0,5.4,0,9.6,4.1,13.8,9.5,18.1,12.9,38.7,17,57.7,4.6,22.5,8.9,43.8,20.2,63.5,1.1,1.9.8,4.2-.6,5.8-4.3,4.3-10.8-2.2-15.2-1.2-11.2-.1-14.1,14.6-4.1,17.7,6.4.3,31.7-.1,21.8,12-2.6,1.7-2.7,9.9,2.1,11.1,14.3-2,26,10.6,34.6,9.5,1.8.2,5.1-.4,5.3-1.1,1-3.7-2.8-9.1,4.7-10.2,8.2,2.8,16.4,7.8,21.4,7.1,4.9.5,10.6-2.8,14.7-13.1,8.1-11,21.5-16.1,28.7-27.4,7.6-6.2,17.3-11.3,22.1-19.6,8.5-9.2,17.8,7.2,43.8-5.1,6.9,2.1,25.2,3.1,19.9,13.5-9.8,12.2-20.3,18.7-31.1,19.3-10.8,0-16.6,7.5-27.8,7.9-11.7-2.3-17.3,4.7-23.3,17.1-1.2,2.7-4.9,2.9-6.1,2.7-14.2,1-7.3,31.6-16.4,38.3-6.7,4-1.3,9.3-6.4,12.9-5,2.3-5.3,9.6-11.7,5.1-15.7-11.1-41.3-1.7-59.9,2.2-13.6,3.9-26.2,3.3-37.6,11.8-12.7,9.5-17.8,12.9-27.1,6-2.3-1.5-3.6-2.3-5.8-2.3s-.2,0-.3,0c-14.3.6-24.7,17.7-19.5,30.8,2.4,6.6.4,2.8-.3,4.1-.7,1.3-1.8,2.2-3.2,2.5-8.9,2.7-4.3,16.2-14.9,20.1-6.7,3.5-15.6,6.6-15.7,13.9.5,13.2-25.1,17.6-25.4,17.7-6.7-.5-23.7-3-30.5-1.8-3,.5-5.1-2.5-6.8-4.4-4.6-6.2-20.6-16.8-8.7-23.4,7.1-.3,12.5,9.7,21.6,9.6,27.1-12.8,6.9-27.9-13.5-27.7-3.8-.6-5.5,1.5-7.6,5.6h0c-.9,1.7-2.6,2.7-4.4,2.7s-.2,0-.2,0c-7.5-.3-15.6-2.6-21.8,2.7-10.7,9.3-18.2,20.9-22.6,33.9-4.8,8.4,18.7,17.8,15.8,25.9-.8,1.8-2.6,3-4.6,3s0,0,0,0c-13.6-.2-24.9-1.2-36-5-5.6-2.8-12.3-3.9-20.7-3.8-11,0-18,1.5-28.2.4-8.7.8-14.5,4-23,4.1-14.1-2.2-36.8-6.6-43.1-20.4-147.8-51.1-439.9,278.7-408.9,424.6-2.6,17.4-6.2,34.3-7.5,52.2-.3,37.3-25.8,31.5-28.5,75.9-6,18.6-36.6-27.7-34.2-26.8-3-7.6-10.1-16.4-20.1-22.5-10.8-8.2-23.1-14.6-35.4-20.5-37.4-41.1-62.6-17.4-106.1-51.2-25.2-5.8-34.1-12.8-43.5-20.3-8.1-8.1-32.9-19.7-48.4-26.1-17.1-.5-20.4-19.6-35.1-23.6-14.4-1.4-24.1-12.5-35.4-19.6-30.2-14.9-48.7-63-83.4-65.8-20.1-2.2-37.1-7.9-50.9-21.8-98.1-117-219-50.7-320.3,32.1-26.6,10.4-41.8,39.5-61.1,59.9-5,4.2-7.3,17-15.4,17.7-3.8,0-7.9-2.9-11.3-4.4-4.2-2.5-2.4-9.4,2.7-9.2,1.3.6,12.1-3.5,11.6-9.3-1.1-5.4-8.2-7.5-17.7-9.9-9.3-2.1-20.7-5.9-20-16.1-.5-3.9-4.6-33-20.3-38.6-7.2-2.8-12.5-8.1-17.9-13.2-19.4-15.4-4.7-23.1-31.3-40.9-15.6-16.1-31.7-10.1-50.7-2.8-2.9.8-5.5,2.9-8.7,1.6-11.3-4-12-9.5-24.8-9.6-5.5,0-9.7-.4-14.6.9-33.2,14.3-90.5,126.1-78.7,160.8,7.7,37.8,29.9,23,50.2,40.4,7.1,5.7,13.8,12.6,21,20,16.2,16.3,31.8,32.9,51.1,32.8,18.5.2,12.9-3,21-7.3.3-.1,4.9-1.9,7.8-1.9,2.8,0,.6,0,1.7.3,5.2.9,10.4-1.1,15.4-2.9,6.6-2.1,14.1,6.7,20.2,9.4,1.1.7,1.7,1.5,2.1,3.1,3.2,10,6.2,12.4,9.4,15,13.2,10,6.2,22.3,27.8,35.5,20,8.3,25.6,29.8,37,45.5,21.8,29.9,53.8,10.4,76.7,41.5,1.1,10.9,7.5,13.1,14.1,18.6,6.1,5.4-6,15.9-13.4,16.8-6.2,0-.8,0-1.2-.1-1.7-.2-3.2-.4-4.6-.4-24.1,2.4-14.8,38-64.1,38.6-1.5,0-2.9-.6-3.9-1.7-13.4-15.8-29.4-20.5-51.7-25.9-9.8-3.2-25.7-7.9-34.8-2.9-9.1-.9-1.5-12.7-8.6-18.6-4.6-5.4-12.8-9-20.6-9s-9.8.8-13.3,5.8c-1.6,1.6-3.3,3.8-3.5,6.4-.6,6.3-2.7,12.3-4.8,18.1-1.7,3.5-1.5,8-4.7,10.3-10.1,6.2-19.2,13.1-28.7,21.5-2.5,2.1-4.7,1.1-7.6,1.2-34.2-2.2-27.7,35.9-30,63.2,1,11.8,5.8,20.9-7.5,32-19.9,5.4-39.7,13.1-58.5,22-7.5,11.5-21.2,45.7-27.1,42.4v-1.5Z"/>
<path d="M1077.5,3404.4c4,0,5.3.6,7.1,3.4,7.5,33.3,21.6,23.9,26.8,41.5,5.2,24.6,28.9,33.8,46.3,47.4,5.6,4,10.4,8.4,14.1,14.1,38.3,58,85.9,111.6,131.4,161.4,10.2,9.9,6.6,24.8,18.9,35.2,18,20-4.1,23,28.5,52.9,5.4,8.8,7.2,18.6,14.9,26.7,6.3,6.7,11.1,15.9,15.9,24.2,26.8,41.7,70.4,68.2,96.7,109.9h0c27,40.2,75.1,59,109.3,91.2,12,13.4,28.7,22.8,43.5,31.3,8.3,4.7,3.7,18.8,15,24.1,89.1,60.4,191.9,101.2,289.6,115,16.4,10,38.7,11.5,53.5,8.2,2.6,2.2,2.7,24.9,2.8,34.6,0,1.5.7,3,1.9,3.9,13.9,10.2,9.9,26.2,24.2,35.3,30.8,22.2,176.1,54.2,206.1,11.2,10.9-18,36-23.3,41.6-46.5,6.5-11.6,28.2-17.5,31.1-31.9,0-2.5,1.7-4.4,3.6-5.3,21.8-12.1,36.9-32.9,58.1-44.9,18.2-9.6,17.2-28.2,28-41.5,14.7-13.7,24.1-28.4,31.6-44.2,1.1,1.2,2.4,4.7,2.1,7.6-.3,11.5,4.8,20.6,7.5,30.6-5.7,8-6.6,16.9-9.5,25.5-3.4,12-10.9,21.3-18.1,30.2-30.1,32.2-11.2,46.2-30.1,68-22.8,26-48.8,61.1-48.7,100.9-.5,27.6-30.2,22.3-2.6,72,5.8,8.9,10.5,19.1,15,28.9,4,10.5,8.7,18.8,19.4,22.2,5.9,2.6,8.6,4.1,9,7,0,6-.3,12.4,5.5,18.4,17.6,38.8,15,82.6,36.4,120.2-21.6-12.5-38.7,17.1-16.5,24.8,6.6.9,14.2-.4,20,2.8-7.3,4.7-4.1,20.3,4.8,20.3s.3,0,.4,0h2.4-1.3c.9,0,1.8-.3,2.8-.3s.2,0,.2,0c10,.4,18.5,9.7,29.3,9.7,1.7-.1,13.9,1.4,10.6-11.2,16.5,8.7,30.3,12.8,40.2-8.1,7.4-10.4,20.8-14.8,27.7-26.5,8.1-6.5,17.9-11.5,23.3-21,2.4-1.4,4.2,0,7.1.4,10.8,3.3,21.7,2,32.4-3.1,4.2,1.4,13.1,2.4,16,5.2-7.2,8.9-16.5,16.8-27.5,17.4-11.7,0-17.4,7.4-27.8,7.9-14.2-3.4-22.6,9-27.6,19.8-16.9-1.7-17.3,26.4-19.2,37.7-3.5,3.6-8.6,6-7.7,14.3-1.9,1.1-5.5,3.4-5.9,5.7-20.9-15.3-57.8,1.1-78.5,4.5-15.6-1-28.2,14-39.8,18.1-2.7,0-.2,0-.3,0-5.8-.7-8.2-6-15.1-6-18.6.8-30.7,20.7-24.5,37.5-12.5,3-7,16.8-15.9,20.5-7.2,4.1-17.7,6.8-18.5,18.3.5,6.8-14,11.6-21.2,12.8-7.9-1.3-21.2-2.8-30.3-1.8-4.8-5.3-9.8-10.6-14.3-15.9,0,0,0-.6.7-2.1,6.2,4.2,11.4,9.1,20.9,9.8,14.3-4.5,19.3-17.2,17.1-21.7-2.6-10.4-18.1-16.1-31.3-16.1s-2.1,0-3.1,0c-4.9.6-7.3,5.3-8.9,8.3-9.3-.5-16.7-2.8-25.1,3.7h-.1c-11.1,9.8-19.2,21.7-23.9,35.4-5.4,9.9,8.4,19.1,15.6,26.3-11.8-.2-23.4-.9-34.5-4.7-6.2-2.8-13-4-21.8-4-9.6,0-14.9.8-21,.8-12.8-1.6-20.9,3.3-30.9,3.7-7.4,0-7.4-.7-12.3-2.8-11.7-3.1-23.9-6.3-26.7-16.2-166.9-56.1-453.5,298.3-417.7,429.7-5.5,23.1-6.8,45.6-9.7,68.7-14.8,20.9-23.4,26-26.4,57.4-30.1-21.4-19.7-34.2-42.8-50.4-12-8.3-23.9-17-38.3-22.3-36.7-41.9-61.2-17.7-107.7-52.6-44.6-10-35.8-23.2-75.5-38.8-6-1.8-11.3-6.8-17.9-8-14.6,0-18.1-19.8-35.1-23.6-13.3-1.3-23-13.1-34.3-19.4-30.1-16.2-48.2-63.5-85-66-13.3-1.8-26-5.2-36.3-10.7-8.1-8.7-18.1-13.5-25.6-23.1-100-103.7-209.9-34.2-311.8,44.9-26.9,11-42.5,39.4-61.2,60.1-5.4,3.6-7.5,14.8-12.7,16.9-3.1-.6-6.1-2.6-8.6-3.7,5.8.3,17.3-6,16.8-14.6-3-18-38.7-10.8-37.8-25.7-.4-3.7-4.6-35.9-23.2-43.1-9.8-3.7-16.2-13.2-24.7-19.7-6.5-27.3-18.9-28.4-35.1-43.1-16.1-6.2-34.1,2.2-48.6,7.5-13-5.1-12.9-9.8-26.6-10-8,.2-9.2-.3-15.9,1-37.8,17.7-93.2,125.1-82.7,166.1,9,43.1,35.6,28.5,51.7,43.7,23,18.3,46,54.2,75.1,54.2s15.1-2.3,23.3-7.7c1.8-.7,4.9-1.5,6-1.5s.3,0,.3,0c6.6,1.4,13.5-1.1,19.5-3.3,4.9,2.9,9.7,5.9,14.8,9.1,7.3,23.5,15.5,12.3,20.7,34.4,4.8,8.9,11.7,14,19,19.5,18.7,7.4,24.1,28.8,35.4,44,22.1,30.1,47.5,12.5,75.7,38.9,1.4,13.5,9.5,16.6,15.8,21.9,0,.6-6.6,8-10.2,8s-.3,0-.4,0c-33.6-5.6-17.8,36.7-69.7,38.2-14.6-17-31.7-22-53.9-27.4-10-2.9-25.9-8.6-36.4-3.2,4.2-23.2-32.8-37.6-46.6-19.8-2.4,2.1-4.1,5.6-4.4,8.8-.7,8.3-4.6,16.5-7.1,24.7-10.2,6.3-19.6,13.3-29.4,22-43.3-3.6-37.3,35.8-39.2,68,1,12,5.3,19.3-5.6,28.2-20.5,4.3-40,13.6-58.5,21.8-3.8,3.5-20.6,41.5-24,41.5s-.4-.2-.5-.6c-23-24.2-23.4-10.1-45.4-14.3-15.2-12.3-14.3-11.3-20.5-30.2-16.3-45.3-15.2-51.2-3.9-96,5.2-22.5,29.7-39.2,27-65,0,0,.9-.9,5-.9,21.5-1.8,9.5-33.7,18.6-47.3,9.1-42.9-17.1-81.4-38.1-114.8-14.9-25.6-43.7-8.2-51.2-27.6-4.3-11.1-10-21.4-15.2-32.2-11.3-9.2-31.1-3.8-35.9-22.2,3.6-10.6-.8-18.2-4.1-26.8,2.4-8.8,1.6-20,9.8-23.6,33-35.5,21.3-86.8,12.9-128.1-1.1-5.9-1-9.6,2-13,23.9-41.1,37-33.7,64.5-33.6,9.5,0,17.4-2.1,26.3-14.2,7.4-19,32.6-12.6,36-37.6,1.6-6.1,3-11.9,9.6-18.1,23.7,11.9,10,25.8,28.8,27.4,12.2-.8,21.4-4.1,22.5-16.8-4.3-31.2,14.8-22.2,25.4-52.4,20.1-53.8,94.2-32.7,45.2-101.7-7.9-6.9-12.2-17-17-26.7-18.1-32.1-28.3-17.8-45.6-54.4,2.5-18.1,8.4-34.5,13.2-52,29.2-2.3,32.2,3.5,43.4-24.3,13.3,3.4,35.2,40,54.5,42.8,1.9.3,2.3.7,3.5,5.4,1,4.3,3,11.8,11.5,13.1,15.4,2.2,28,11.5,41.4,19.4.6,20.8,31.7,21,40.7,8.2,8,1.7,16.2.3,23.1-4.5,2.9-3.9,7.4-5.3,12.6-6.8,5.1-1.8,26.2-10.8,16.4,4.6-5.8,9.1,2.9,20,12.5,21.6,12.8,2.3,25.4,7.2,38.6,15,4.9,2.2,10,3.2,15,3.2,44.9,0,93.2-77.3,104-96.1,4.8-13.6,3.4-28.3,4.8-42.2.9-25-18.6-43.6-25.9-65.6-4.8-17,17.3-35.2,3.6-54.8-10-13.7-8.3-32.5-15.4-48.1-2.9-7.3.2-14.5,5.8-23.1,8.9-8.2,6.5-24.6,16-30.1,8.9-4.3,17.2-12.8,26.8-13.5,11-.2,15.2-5.7,21.3-12.8,84.8-10.8,56.2-187,54-248.5,1.3-7.1,11.4-9.6,13.5-22.4,2.2-9.7,9.9-14.5,11.1-25,20.4-23.8,22-53.4,22.2-82.8,55.7-168.9-118.7-357.4-63-406.1,10-17,1-18.3,14-34.8,18.3-24.7-11.1-36.6.3-59.4,5.9,3.5,3.2,16.2,8.1,20.6,13.7,10.2,22.1.3,36.3-.9,9,0,.8,0,1.2,0,21.1,3.2,47.8-17.5,47.1-40.1,0-9.7,5.3-23.3,17.5-23.6M1077.5,3394.4c-17.6.2-27.3,17.5-27.5,33.5.3,6.3-2.5,12.8-8.3,18.8-8.6,9.5-23.2,13.2-28.3,11.5-12.7-1.7-20.9,9.8-30.9,3.5-1.8-7.6-1.3-16.1-10.1-21.9-4.8-2.9-11.7-1-14,4.1-13.9,26.3,14.3,38.8.7,57.8-12.8,15.6-6.8,20-13.9,34.6-15.6,15.8-15.1,35.7-10.2,58.9,30.8,108.4,112.2,229.9,71.1,353.4,1.3,32.6-5.2,57.5-22.1,81.7-1.6,8.3-9,13.9-10.9,24-.5,4.5-2.8,6.9-5.7,9.9-14,12.3-5.7,29.9-5.7,49.4,2.6,53.3,21.4,191.1-47.6,203.8-2.9.3-5.4,2.1-7.2,4.4-5.7,6.7-7.5,8.3-13.6,8.3-12.6,1-21.1,9.7-31,14.8-12.7,7-10.9,22.4-17.7,31.3-17.1,21.9-7.9,29.5-3,53.2,2.1,10.5,4.2,21.4,11.3,31,9.3,14.5-11.7,34-5.1,51.7,6.3,21.4,25.8,40.1,25.5,62.3-1.4,12.8,0,27-4,38.7-7.3,17.2-67.1,97-94.8,90.2-15.9,0-7.1-.7-10.5-2.1-14-8.2-27.6-13.4-41.4-15.9-2.6-.3-7-3.7-5.8-6.4h0c12.5-20.5-7.9-30.1-27.1-19.8-15.4,3-16.6,15-33.5,11.2-7.9.5-11.4,9.7-20.6,8.6-5.1,0-9.9-.9-10.1-7.3-.2-3.8-2.4-7.1-5.7-8.6-13.9-8.4-27.1-17.7-44.3-20.3-1.1-.2-2.1-.4-3.2-5.4-1-4.8-2.8-11.6-11.6-13.1-17.3-1-49.2-61.9-65.3-36.6-5.9,13.6-5.5,18-21.2,17.3-20.7,0-21.5,1.3-26.5,21.6-3,14-11.2,30.2-8.6,45.3,17.4,37.9,28,24.5,45.8,54.8,5,10.1,9.4,20.3,18.1,28.5,4.3,7.3,7.4,15,13.4,21.7,10,25.5-53.8,33.5-60.3,70.5-3.7,10.4-8.3,14.7-13.2,19.2-27.3,22.6,1.8,44.7-27.3,42.6-3.4-8.4-4.9-16.7-22.2-25.9-3.7-1.9-8.4-1.3-11.3,1.6-18.6,17.1-4.7,29.9-26.1,38.7-22.5,8.1-19,29.2-39,28.5-9.2,0-11.1-.7-18.9-.5-17,0-35.3,4.8-54,38.5-5.2,6.6-4.8,13.7-3.5,20.5,8,40.2,18.7,86.5-9.3,118.1-9.2,5.3-10.8,15.4-12.1,23-5.2,11.3,6.6,22.4,3,32.3-1.6,24.6,24.1,26.7,37.5,32.1,13.5,23.1,12.5,45.3,42.8,46.7,10.8,1.3,17.7,2.6,22.9,11.5,20.1,31.8,44.5,67.7,37.3,106.2-4.7,8.6-4.7,17.9-4.7,25.5.3,22.7-6.4,11.1-16.3,19.1-2.3,2.1-3.4,5.2-3.1,8.3,1.8,22.2-22.6,39.4-26.8,61.6-12.4,47.1-12,57.4,5.1,104.3,5.7,17.8,7.4,19.6,22.8,32,8.2,5.2,19.6,2.7,28.1,1.6,1,0,4.5,0,15.4,10.9,17.9,19.6,31-28.6,39.1-38.9,18.7-9.4,39-15.7,58.3-22.1,15.3-13.1,10.5-23.6,9.3-35.9,1.8-25.6-3.3-62.1,24.9-58.1,21.4,0,2.4,0,3.7,0,2.6.1,5.2-.7,7.2-2.5,9.3-8.2,18.2-14.9,28-21,2.1-1.3,3.6-3.3,4.3-5.7,2.6-8.7,6.6-17.1,7.4-26.7.2-1.9,1.6-2.6,2.6-3.9,9.1-9.2,30.4-.4,28.6,12.3-1.1,5.9,3.9,11.9,9.9,11.7,5,0,3.7-2.2,10.1-2.2,8.1,0,19.4,3.7,23.2,4.9,22,5.3,36.9,9.6,49.4,24.4,1.9,2.2,4.7,3.5,7.6,3.5s.2,0,.3,0c50.4-1,44.9-35.9,63.9-38.6,7.4,1,12.3.5,19.1-6,20.2-19.3-7.9-19.2-8.9-34.6-.2-2.4-1.3-4.6-3.1-6.3-26.9-27.3-52.7-10.5-74.5-37.5h0c-11.7-16.2-17.2-37.3-38.4-46.7-6.2-4.6-11.1-8.4-14.6-14.4-3.1-12.3-7.6-16.7-12.7-20.9-6.5-3.4-5.6-13.5-12-18.3-20.7-12.4-13.1-12.1-35.6-6.9-3.4,0-1.2,0-1.8-.2-12.4-1.9-21,10.1-31.9,8.9-24.5-.3-48-35.8-68.6-51.8-19.8-17.8-42.3-2.6-48.5-38.6-10.6-31.7,45.2-141,76.2-154,19.8-2.4,18.8,1.1,35.7,8.8,4.3,1.9,8.4-.4,12.4-1.9,18.6-6.8,30.6-12.7,45.8,2.5,10,7.3,15.5,11.4,19.5,28,.5,2.2,1.8,4.2,3.7,5.6,8.9,7,15.3,16.7,27.2,21.1,10.2,4,15.6,24.3,16.8,34.2,0,4.3,1.5,11.3,10,16,7,4.5,22.6,5,27.6,10.2-4.5,5.8-13.7,2-16.1,10.6-3.7,10.2,10.8,16.2,18.2,16.7,7.7-.2,12.2-7.9,15-13.5,18.6-22.4,36.7-52.8,63.2-64.5,59.9-46.2,129.3-96.5,196.5-96.1,57.2-1.8,89.6,37.2,132.2,74.6,11.8,5.8,25.8,10,40.3,11.5,17.6,1.3,31,16.6,45.2,32.7,12.8,16.3,27.9,27.9,44.8,38.6,7.8,5.9,16.6,12.6,28.2,13.9,13.4,5.3,17.3,23.1,35.4,23.7,5.1,1.6,10,5.8,15.8,7.5,37.3,14.9,30.1,28.3,74.6,38.6,42.8,33.3,68.5,10.6,104.4,49.9,12,7.1,24.9,12.1,36.4,21.3,9,5.4,15.4,13,18.6,20.6,2.8,6.4,22.6,38.4,37.9,33.3,3.2-1.5,5.5-4.6,5.8-8.1,2.2-22.8,7.1-29.2,16.8-42.1,10.6-11.7,10.4-18.3,11.7-33.7,1.8-16.8,3.5-32.7,7.4-48.9-5.4-27.5-5.1-57.5,12-99.2,47.9-121.8,249.2-363.5,388.1-325.5,8.5,14.8,31.4,19.4,46.8,21.6,8.7,0,14.8-3.1,23.2-4,10.2,1,17.3-.5,28.2-.4,8-.1,13.7,1.1,19.1,3.4,13.1,4.5,26.3,5,37.8,5.2,8.6.3,13.4-11.1,7.1-17.1-3.8-4-12-10-13.9-14.5,4.2-12.1,10.9-23,20.9-32,.1,0,.2-.2.3-.2,8.3-7,21.9,4.1,27.9-7h0c.5-.9,1.2-2.4,1.8-3.1,10.6-.4,22.4,4.4,23,9-.4,1.9-2.9,6.2-8.7,8.6-7-.6-12.3-9.3-19.7-9.6-8.9,0-13.8,12.1-8.2,18.6,7,6.4,11.9,18,21.9,19.3,3.4,0,1-.1,6-.2,9.2-.3,18.5,1.9,26,1.9,11.3-1.1,31.4-11.2,29.6-22.4.3-2.7,2-4.1,8.8-7.5,8.5-2.6,14.9-11.7,15.5-17.5,1.2-4,1.3-4.1,2.4-4.3,2.8-.7,5.1-2.5,6.5-5,1.3-2.5,1.6-5.5.6-8.1-4.1-10.1,4-23.5,15-24.1,4.1,1.1,7.5,5.5,13.9,5.9,9.1,2.4,28.3-19.5,41.2-18.1,21.9-2.7,51.8-18.1,71.8-7.1,5.1,4.5,13.3,2.5,15.8-3.4,4.1-2.1,7.3-6,6.7-10.9,3.7-8,8.2-4.7,8.7-18.5,1.2-5.5,1.3-22.7,8.4-22.4,12-.1,12.2-21.5,23-20.3,5.6,0,1.8,0,2.8.3,6.9.9,14.2-2.4,18.8-4.5,4.1-1.9,7.3-3.3,11.4-3.2,12.3-.6,24-7.7,34.8-21.1,9.5-14.7-13.1-20.1-23.8-21.4-10.9,3-19.7,7.5-30.7,3.2-16.7-5.6-17.8,10.5-31.2,17.5-9,5.3-12.1,13.8-21.5,19.6-5,3.8-10.7,8-15,14.1-7.6,16.8-13.4,11.5-27.4,5.1-6.5-3.9-16,2.2-14.7,10-10.6-.7-20.9-11.7-33.2-9.5-.2-.7-.3-1.7-.2-2.3,5.7-4,5.2-13.5-1.1-16.7-8-4.5-15.6-3.1-23.2-4-3.6-1.6-1.9-8,3.2-7.7,3.3-.4,7.8,2.8,11.6,2.8,7.4.2,12.5-8.6,8.7-15-10.9-19.1-15.1-39.9-19.6-62.1-4.5-19.7-7.6-41.7-18.4-60.2-2.5-2.6-2.6-5-2.6-10.3.8-9.7-8.2-14.6-14.9-17.3-6.8-1.9-10.3-6.6-14.4-17.2-4.4-9.5-9.3-20.4-15.5-29.9-23.9-41.8,1-30.7,4-66.7-.6-61,55.4-84.9,59-126.4,1.2-10.3,3-21.3,17.6-36.4,9.1-10.5,19.1-25.4,22.1-41.3.7-9,8.9-15.4,7.3-23.3-2.4-9.3-7.3-18.2-7.1-27.5.4-5.2-1.5-11.2-4.6-14.7-4.5-5.3-13.7-4.2-16.6,2.2-8.1,17-17.1,29.7-29.4,41.2-5.5,6.1-8.6,13.7-11.3,20.1-3.6,8.7-6.6,15.9-14.9,20-21.7,12.1-36.9,32.9-57.9,44.7-5.1,2.6-8.4,7.3-8.9,12.7-4.8,10.6-24.3,16.6-29.8,28.4-2.8,11.2-9.9,18-20.2,25.3-7.4,5.6-15.1,11.3-20.6,20-39.8,36-162.1,6.9-192.7-13.4-10.5-7.9-8.8-23.6-21.5-33.3,0-9.4.4-35.9-6.3-39.8-6.4-5.1-16.3,0-23.2-1-109.3-20.5-221.5-53.3-320.9-122.9-7.3-3.2-3.7-18.6-15.7-24.6-32.5-16.4-56-46.1-87.1-64.5-23.9-16.2-46.5-31.6-61.8-54.1-14-22.2-32.5-40.4-50.5-57.8-17.4-16.9-33.9-32.9-46.6-52.6-5.1-8.9-10.1-18.2-17.1-25.9-6.7-7.3-8.7-18.3-14.8-26.6-8.9-9.5-19.3-18.3-17.9-30.4,1-17.4-16.3-21.9-18.9-37.5-2-6.5-4.2-14-10.7-20.4-45.1-49.4-92.3-102.5-130.3-160-13.7-22.9-53-30.9-59-58.1-2.5-10.3-9.3-15.7-13.8-18.9-15.2-7.1-7.2-34.5-29.8-33.9h0l-.7,1.7Z"/>
</g>
<g>
<path class="st0" d="M3055.8,4009c-17.1-1.9-27.4-5.5-30.5-10.4-4.4-10.9,3.7-36,15.7-40.9,7.9-1.7,14.7-7.4,17.6-15.8,2.1-8-6.2-13.8-6.5-21.6,1.3-3.9-.4-10.8,5.2-11.7,7.9-.8,7.2,16.5,17.2,16.4,11.9-1.1,22.6-25.4,11.2-35.8-1.4-1.4-1.9-3.5-1.2-5.4,4.4-7.5,14.5-.4,19.9,2.9,4,2.6,8.1,5.3,11.8,5.3,10.1-1.1,20.4-17.3,28.3-23.9,5.8-4.4,9.2-10.4,10.4-19.1,4.3-17.5,3.6-25-12.6-27.7-37.9-3.8-24.2-57.8,9.5-22.6,7.5,9.9,24,0,25-9.9,7-18.2,1.3-25.4,28.8-35.8,37.5-11.5,38-42.1,69.5-57.3,3.8-.9,6.3-4.3,6.1-8.6-.3-11.4,1.6-23.1,5.7-36,4-10.2-2.8-10.9-1.2-17.4,1.2-3.1,5.1-3.2,7.8-3.2,7.5,0,10.3,4,12.4,6.9,9.1,15.7,49.8,11,46.8-11.9-2.2-9.9,6.5-39.6,29.5-47.4,6.3-3.7,12.8-7.4,20.7-7.4,8.7,0,1.5,0,4.8.6,10.3,3.7,13.4-6.1,17-18.5,1.9-3.7.2-6.7-2.2-10.6-1.3-39.5-22.4-51,14.7-91.3,1.8-1.7,4.2-2.6,6.7-2.6,14,.9,15.5,16.8,18.5,27.4,1.8,13.5,10.8,23.3,11.9,37-1,53.6,98.6,30.4,121.9,21,11.4-2.7,14.5-16.5,26.3-20.3,17-6.1,24.2-23.5,36.6-35.5,5.9-9.1-6-12.1,11.6-26.2,5.3-3.2,6.1-8.7,10.6-11.2,11.2-3.4,14.5-13.5,20.9-22,1.2-1.7,3.4-2.1,5.3-2.7,26.6-6.8,13.9-21,27-26,17-.4,29.2-8.3,45.4-10.3,20.6-.2,42.6,12.9,45.6,27.2,3.5,21.7-22.4,19.4-24.9,33.8-3.2,11.5,16.2,18.7,17.2,30.1.7,9-8.7,18.8-11.6,27.4-2,4.9-16.8,6.1-22.9,10-1.2.5-2.8.5-4,0-8.4-3.6-17.7-5.4-27.8-5.4-30.7,0-65.2,17.6-82,41.8-1.1,2-4.2,2.5-5.8,2-4.5.9-8.6,5.5-14.1,5.2-3.7,0-.2,0-.3,0-15.8,3.7-16.9,14.4-37.9,14.4-15.3.3-22.2,8.2-32,18.1-16.8,4-21.4,21.6-37.9,25.9-27.9,13.7-54,48.3-64.2,63-5.8,11.7-14,17.3-21.2,22.2-5.7,3.9-11.2,7.6-15.6,14.2-.8,1.8-4.2,2.4-5.1,2.2-21.3-6.4-39.4,17.2-58.1,3.1-14.5-8.2-9.1-14.5-14.3-23.7-14.9-9.7-37.3,10.2-41.2,25.4-4.2,14.9,14.8,13.2,9.9,22.5-6.8,10.1-13.6,21.1-18,32.9-10.6,26.3-33.4,17.6-38.9,33.7-.9,3.8-3.4,6.4-7,7.4-16.9,4.1-31.2,14-43.7,28.5-22.6,16.5-18.7,23.1-34.8,41.8-8.6,9.6-6.5,25.4-17.3,34.4-9.6,10.2-24.3,17.4-37.5,18.3-5.1.5-9.2-2.9-13.5-3.6-11.9-.3-30,24.2-34.2,32-8.7,13.8-12.8,44.3-31.4,45.4l.4-.7Z"/>
<path d="M3780.6,3384.1c18.2,0,37.7,11.3,40.2,23.2,2.5,18.4-23.9,15.1-24.9,32.5-3,15,16,21.7,17.1,30.7.4,7.1-8.3,16.4-11.4,25.5-6.5,1.7-13.3,4.1-20.1,7-40-17.2-93.4,5.6-115.9,38.1-5.7-1.5-10.5,4.9-15.8,4.9-4.8,0-.3,0-.5,0-15.9,2.2-16.5,14.1-37.7,14.4-17.4.5-25.3,9.2-35.5,19.6-16.7,3-21.3,21.8-35.9,24.7-25.1,12.1-50.3,41.2-66.9,65.2-9.6,19.7-25.6,19.8-36.6,36.2-22.4-6.4-45.7,17-56.2,3.8-14-7.6-6.5-14.3-13.4-23-24.5-18.9-71.9,33.6-39.1,48.6-6.2,9.3-13.7,20.8-18.3,33.6-6.3,13.9-15.2,17.2-23,20.1-6.7,2.5-14.2,5.3-16.2,14.6-.8,2.6-2.1,3.3-3.5,3.7-17.6,4.5-32.4,14.1-45.4,29.3-23.2,17-19,22.7-35.5,42.3-9.5,9.8-7.2,25.8-17.2,34.2-8.4,8.9-22.2,16.3-35.1,16.9-4.4,0-8.2-3.8-12.8-3.6-15.2,0-34.7,27.9-38.3,34.6-7.8,11.3-12.7,42-26.2,42-13.5,0-.6,0-.9,0v.8c-9.1-1.2-28.6-4.2-27-11.2,1.7-11.1,4-25.9,14.2-30.5,9-2,17-9.2,20.3-19,2.1-9.3-3.5-14.8-6.4-22,.5-2.5,1-5.1,1.1-7.7,13.2,40.5,52.8-5,31.1-28.1,8.5-.2,17,11.4,27,11.4,9.9,0,6.3-1.1,9.7-4,9-5.6,14.6-14.4,22.1-21.2,6.7-5.1,10.4-12,11.9-21.5,13.1-50-33.5-20.3-35.7-51.5,4.1-12.8,15.3-5.5,24,3.3,10,12.6,31.1,2.6,33.5-11.3,7.6-18.2-.1-23,26-33,40.3-13.4,41.8-45.1,69.8-57.5,5.7-1.7,9.3-7.1,9.1-13.4-.3-10.8,1.5-22,5.5-34.3,2.8-8.3.9-13.5-1.4-16.9,18-2.3,2.4,14.2,42.2,16.7,47.7-17.9,5.9-27.2,41.1-64.5,10-3.4,18.7-12.3,29.2-12.3s2.1,0,3.2.3c2.1.7,4,1,5.7,1,12.1,0,15.5-15.8,18.3-25.3,1.5-5.1-1.5-8.4-3.2-11.8-.3-40.2-22-45.6,14-85.8,4.5-3.3,10.7,2.3,12.2,6.5,3.3,10.9,5.8,22.2,9.1,33.1,4.1,5.7,6.4,11.6,7.1,19.1,3.6,60.8,96.8,35.2,127.9,25.6,13.1-2.6,16.1-16.7,27-20.5,18.5-6.7,25.7-24.2,38.4-36.6,4.2-3.8,3.5-8.5,3-11.6-2.2-10.4,13.3-15,17.2-24.6,13.2-4.1,16.7-14.8,23.4-23.8,10.8-3.8,23.7-6.7,26.3-23.3,0-.7,1.6-2.4,2.2-3.4,18.2-.4,31.1-8.7,45.8-10.3M3780.6,3374.1c-16.6,1.2-29.3,10.1-46,10.3-3.7,0-6.7,2.2-8.6,5.1-7.2,11.8-1,15.2-19.9,21-12.5,2.8-14.3,22.5-26.1,24.8-6.4,2.1-6.2,8.2-12.3,12.2-6.5,4.9-14.5,14.2-11.5,26.1-12.1,11.4-19.6,29.2-35.3,34.7-7.5,2.8-11.8,8-15.8,12.7-10.5,13.3-56.4,19.8-82.9,20.8-37.4-.5-42-17-42.6-30.4-.8-8.6-3.7-15.7-8-22.5-3.1-10.6-5.5-21.3-8.7-31.8-2.9-10.3-20.3-19.4-27.8-10.8-13.2,13.9-21.1,26.8-23.5,38-2.3,10.6-.2,19.5,1.9,28.8,1.8,7.4,3.7,16.1,3.7,27.2,0,3.2,2.3,6.2,3.6,8.8-1.9,5.9-4.9,21.3-11.3,17.5-14.8-4.1-27,7.1-38.9,12-20.7,14.4-23.6,39.3-22.6,47.1,0,4.9,0,6.3-1,7.6-8.1,8.5-20.1,11.3-32.3,5.4-7.3-4.8-6.4-12.7-20.8-13.1-10.1,0-2.9,0-4.6.3-3.4.5-6.4,2.7-7.8,5.8-3.6,8.1,4.1,8.2,1,17.8-4.3,13.4-6.3,25.8-6,37.8.2,2.1-1.1,3.6-3.2,3.9-32.2,15-33.1,45.9-69.3,57.4-17.1,6.4-25.7,13-28.3,27.8-2.2,7.8-4,21.4-15.5,21.7-5,0-3.5-1-4.2-1.9-12.7-16.9-39.2-20.7-41.8,3.6.4,15.9,13.6,24.7,27.1,26.7,4.5,1,8.8,2,9.9,3.9.6,1,2.2,5.1-1.1,17.6-1,7.5-3.7,12.9-8.9,16.6-8.3,7.3-15.1,18.5-25,22.6-8.2-2-16.5-11.9-26.7-11.4-6.9,0-.5,0-.7,0-8.5.1-13.1,11.4-6.6,17.2,4.5,4.4,3.8,11.7,1.7,17-6.4,12.1-11.3,15-16.4.4-4.1-10.4-18.8-7.6-19.4,3.1-4,14.2,5.4,17.1,5.7,27.4-2.5,6.9-8.3,11.2-14.7,12.6-15.5,6.6-24.2,36.3-17.6,48.2,4.4,6.4,14.1,10,33.4,12.5,17,0,24.6-17.5,30.3-33,6.1-15.6,7.5-17.6,20.2-32.9,7.9-8.5,13.6-11.6,16.2-11.6s0,0,.1,0c17.3,9.4,39.9-1.6,54.6-15.9,11.3-9.3,9.9-24.7,17.4-34.4,16.5-18.5,12.3-25.2,34.3-41.2,12.2-13.8,25.8-24.1,42.3-27.7,14.1-4.5,5.4-15,20.4-18.5,27.9-7.4,30.1-36.8,46.1-57.4,8-14.4-12.6-13.5-9.2-24.2,3-11.9,20.9-28.3,32.7-23,2.7,9,1.7,16.9,15.2,24.4,5,3.8,10.3,5.6,16,5.6,15.1-.7,27.6-11.8,43.9-7.9,9.8,1.9,13.3-12,24.3-17.2,7.6-5.2,16.3-11.1,22.7-23.8,10-14.4,35.1-47.6,61.6-60.8,15.5-2.9,21.5-21.2,34.3-24.4,2-.4,3.9-1.4,5.4-2.8,9.3-9.5,15.5-16.4,28.6-16.6,21.4,0,23.9-10.1,38.1-14.4,5,0,8.8-2.2,11.7-3.8,4.8-2.5,8.6,0,12.1-5.4,15.9-23,48.7-39.7,77.9-39.7,34.1,1,15.4,12.3,52.4-1.5,7.3-1.9,7.5-10,11.7-15.7,3.8-6.5,7.7-13.2,7.1-20.7,0-12-19.6-19.1-17.1-29,.1-2.4,1.5-3.7,8-7.3,40.3-21.2,2.4-60.2-33.2-59h0l-.5-.3Z"/>
</g>
<g>
<path class="st0" d="M6399.3,758.1c-2.7.1-4.9-2.2-5-4.9-1.6-16.9-23.7-25.9-40.4-24.5-3.3,1.5-24.4,6.4-27,1.2-2.8-4.6-6.3-10.3-2.8-14.3,6.5-8.7,9.2-18.9,11.9-28.7,6.3-14.1,2.3-30.3,4.4-45.5.7-9.4-3.8-13.4-8.5-17.6-26.5-22.8-11.8-56.2,25.5-41.8h.1c7.3,4.6,18.1,12.6,24.8,4,9.7-9,10-15.9,10.4-27.3-.1-1.6.7-3.2,2-4.2,10.4-8,16.9-8.3,23.8-8.6,7.6.4,19.3-4.8,27.2-4.8,19.1-1.2,12.9-8,22.4-12.9,5.7.2,10.5,9.3,15.9,8.6,23.4-13.3,62.3-50.6,63.7-89.4,10-16.9,20.1-16,21.2-42.4,2.7-12.6,7.1-24.2,7.5-37.3h0c.8-11.6,12.8-14.4,16.6-25.2,13.6-20.5,34.2-35.5,52.5-51.5,1-1.1,3.5-1.5,4.7-1,11.2,3.3,18,10.4,30.8,10.4,8.1,0,.4,0,.6,0,5-.3,10.7.2,10.3,5h0c4.8,8.4-1.4,24.1-4.3,28.7,0,0,0,.2-.1.2-4.6,5.9,4,12-.4,17.9-11.5,14.6,8.8,28.2,11.7,43.4.3,1.2,0,2.4-.5,3.4-18.7,30.6,10.8,44.8-10.6,62.2h-.1c-3.4,3.7-8.3-.1-12.1-.6-51.9,19.2-16.8,52.7-44,70.1-11.3,10-10.4,28.2-21.9,39-8.8,9.3-14.4,46.6-29.4,45.3-25.3-.5-20.1,27.4-39.6,36.8-5.7,1.4-10.9-4.3-17.3-3.1-8,0-17.5,3.3-26.3,5.3-4.3-.3-9-1.7-13.2-1.6-12.2.5-19,16.7-31,20.6-49.5,22.9-39.9,84.4-53.7,84.9v.2Z"/>
<path d="M6648.8,294.9c10.2,2.9,17.7,10.6,32.1,10.6s.5,0,.7,0c11,0,1.1,0,1.6,0,10.2.9,3.6,20.3.1,26.2-2.7,4-3,8.8-.9,13.1,1.4,2.9,1.2,3.7.4,5-13.1,19.2,7.6,31.2,11.1,47.1-19.5,36.6,9,47.9-9.4,60.8-.1,0-.2.2-.3.3-3.2-.2-7.1-3.2-10.6-1.9-33.9,13.1-34.7,33.7-35.3,48.8-.4,11.5-1.1,17.7-9.5,21.8-12.5,9.9-11.5,27.9-22.2,39.1-9,6.7-14.9,44.3-26.3,44.3-25.5-2-21.9,23-41.7,37.2-13.7-7.1-26.7-2.1-41.3,1.7-9.7-1.6-19.7-4.1-27.4,4.7-5.9,5.3-11.9,11.8-18.8,14.8-26.8,10.6-47.5,50-48.9,78.8,0,1.3-1.4,3.8-2.9,5.8-1.6-18.4-22.2-29.1-40-29.4-12.6,0-6.1.4-8.7,1.1-6.4,1.5-12.9,2.2-19.4,2.6-1.9-3.2-4.5-7.2-3.2-8.5,7.3-9.7,10.2-20.7,13.1-31.3,6.5-14.7,2.2-30.7,4.4-45.6.9-11.9-5-17.3-10.3-22-12.2-8.1-20.3-37.8,6.7-36,15.2-1.3,19.1,10.4,32.6,10.9,6.4,0,8.3-1.8,11.6-5.3,11.2-10.6,11.4-19.1,11.8-30.9,14.9-11.5,19.9-4.9,35.4-9.9,13.1-5.3,26.4,1.5,35.5-15.5,3.3,4.3,16.2,12.8,20.3,6.7,23.4-15.7,62.4-52.4,63.5-92.4,14.3-15.3,19.1-17.9,21.3-42.1,2.9-12.2,7-23.9,7.5-37.5.2-3.2,1.5-5.8,3.9-7.6,5.7-4.2,9-9.8,12.1-15.3,13.2-19.9,34-34.9,51.4-50.2M6648.8,284.9c-7.5.6-11.8,8-17.9,12.1-15,12.6-30.6,25.7-41.8,42.5-3,5.1-5.6,9.9-9.7,12.8h0c-4.7,3.6-7.6,9-7.9,15.2-.4,12.9-5,24.5-7.4,37-1.1,20.1-6.8,23.6-18.7,36.1-5.1,39.1-36,75-61.8,91-3.8-.4-9.2-9.2-14.7-8.5-12.1.5-6.2,13-23.5,12.9-7.6-.2-19,5.2-26.9,4.8-5.7-.3-28.8,3.7-30.5,17.6.1,12-2.1,18.2-11.1,26-5.1,1.4-11.6-3.6-16.7-7-41.8-17-62.9,21.7-31.2,49.9,11.2,7.4,4.6,20.6,6,31.5.3,9.8,0,18.4-3.6,26.5-2.7,9.8-5.2,19.1-11.1,27-6,5.2.7,25.2,11.1,24.8,7.2.2,18.8-2.8,28-3.5,37.6,3.5,23.7,23.8,37,28.9,8.7,3.4,15.9-8.5,16-14.9.6-23.7,20.2-61.6,42.6-69.8,7.2-2.9,13.1-8.6,18.3-13.4,9.5-11.9,14.8-4.6,26.9-5.8,8-2.2,16.9-5,23.8-5,7.2-.7,12.6,6.1,19.4,2.5,19.5-8.3,16-36.5,36.3-36.1,22.8-1.5,23.2-33.2,33.2-46.4,12.2-10.5,11.8-28.5,21.6-38.6,30.4-20.6-5.2-51.4,41.4-69.1,11.2,6.8,24-5.5,25.1-16.1.7-5.1-.6-9.9-1.9-14.5-2.4-8.7-4.9-17.7,3.8-33.9,1.1-2.1,1.5-4.6.9-6.9-1.7-13.6-21.7-28.2-12.6-39.3,0-.1.2-.3.2-.4,5.6-8.5-1.6-12.5.2-17.8,2.7-4.5,10.7-21.7,5.1-33.3-1.1-7.6-8.7-9.2-15.8-8.5-12.5.2-20.1-9-32.1-10.6h0v.3ZM6684.8,467.7h0Z"/>
</g>
<g>
<path class="st0" d="M2506.7,4397.2c-1.3,0-2.6-.5-3.6-1.5h0c-12.1-19.6-51.4,22.1-48.1-15.7,2.9-11.4,0-19.5-3.1-28-1.5-5.5-5.5-12.3-3.2-18.1,7.8-7.9,13.6-2.5,18.9-18.5,6.1-20.9,21-17.7,32.4-30.6,6.3-9.1,18.5-9.1,22.2-18.3,1.7-3.9,3.7-7.3,8-9.3,9.7-6.5,17.6-13,24-19.7,2.6-5.3,4.9-8.7,12.9-11.7,18.3-6.5,16-19.1,15-34.2.5-4.8,5.1-8,7.3-12.2,6.6-9.4,13.3-19.1,22.2-26.8,7-6.1,12.2-13.5,14.5-21.5,6.5-17.8,18.9-28.9,30.9-39.6,17.5-13.8,29.6-30.1,31.2-57.2,9.6-11.8,20.3-25.8,24.6-42.6,2.5-10.5,21.4-29.7,32.4-30,7.4-.7,10.3,5.2,15.3,9,6.9,6.5,14.8,10.3,19.3,20.5,3.3,6.3,3.9,6.5,5.5,7.2,9.8,5.4,25.6,15.8,41.8,15.9,9.8,0,2.1-.2,2.2-.2,22-2.1,45.2,1.4,65.4-8.3,3.8-2,8.3,2.1,6.8,6.1-4.2,12.8-10.1,37.8-28.3,34.1-5.1-3.9-10.3-8.6-16.7-7.9-.3.2-.6.3-1,.4-32.3,11.5-18.4,22.5-36.1,34.6-22.6,23.1-19.3,21.5-52.1,22.9-81.5.9-43.8,42.4-82,53.7-5.9,1.6-9.8,4.2-13.8,8-10.9,5.4-21.9,11.9-24.9,24-4.8,14.7-17.5,26.5-17,42.4,0,5.2-5.1,5.7-8.9,4.6-10.2,0-16.2,20.4-19.4,31.4-1,31.6-31.7,33.1-57.7,36.9-26.1,31.6-27.9,13.5-29.5,65.2-1.2,10.4,1.3,34.3-7.7,34.9h.3Z"/>
<path d="M2745.3,3966.8c5.4,0,2.3.2,3.5.7,2.9,1.7,5.5,4.2,8.3,6.8,6.4,6.2,14.4,10,18.3,19.1,6.7,12.8,5.8,6.6,15.5,13.7,5.2,4.8,25.9,12.1,36.4,12.1,17.9-2.3,47,1.8,69.7-8.9-4.1,12.3-7.2,28.5-20.5,31.7-5.1-3.8-10.4-8.9-17.9-9-6.6,0-3,.2-4.5.7-8.4,2.6-15.9,7.1-22.3,13.4-8.8,8.7-4,15.3-15.1,21.9-7.2,6.2-12.6,13.1-19.8,19.1-35.3,7.2-78.2-6.2-94.9,35.7-4.6,13.8-3.3,16.6-18,21.1-4.9,1.6-10.4,3.5-14.6,8.3-12,6-23.8,13.1-27.4,26.9-5.1,15-17.9,26.9-17.2,44.2-19-5.1-25.7,27.8-29.7,40,.3,5-.8,9.4-4.3,13-9.4,11.4-32.9,12-49.2,15.1-7.5,6.2-12.1,16.3-20.9,21-15.7,8.4-8.5,59.7-14.1,78.7-10.5-14.6-30.4-2-43.8-.2-2.6-.5-2.7-4.7-2.9-10.7,5-19.5-5.3-30.9-7-44.6.2-.3.8-1.2,3.4-2.2,10.2-2.8,13.3-10.5,16-17.4,5.3-18.9,20.2-15.4,31.5-29,7.6-9.6,19.1-8.4,23.1-19.8,1.8-3.7,2.9-5.4,5.7-6.5,10.5-7,18.9-13.9,25.8-21.2,2.4-4.8,3.5-7.2,10.5-10,21.9-8.1,19.2-23.5,18.2-39.2,8.9-12,16.6-25.2,27.8-34.8,7.8-6.7,13.3-14.9,16-23.6,14.4-39.6,61.4-44.6,61.3-95.3,10.7-13.1,21.2-27.4,25.6-44.6,1.9-8.5,19.3-25.7,27.5-26.2M2897,4010.3h0M2506.6,4392.1h0M2745.3,3956.8c-15.1,1.8-31.5,18-37.2,33.8-4.1,15.8-14.3,29.3-23.6,40.7-1.5,1.8-2.3,4-2.3,6.4-.5,46.1-46.9,50.8-60.7,91.8-2.3,7.2-6.7,14-13.2,19.5-9.4,8.1-16.4,18.1-23.1,27.7-18.1,17.6,4.3,36-19.8,44.6-9.1,3.3-12.3,7.8-15.3,13.5-6,6.2-13.3,12.2-22.4,18.2-5.5,2.6-7.9,6.8-9.9,11-3.2,8-15.8,8.5-21.8,17.9-11.8,12.2-26.7,9.8-33.2,32.1-7.1,21.2-29,3.9-15.5,39.9,2.9,8.2,5.5,15.2,2.9,25.1-1.9,11.2,3.2,24.8,14.2,23,10-.5,28.8-12.8,35-2.6h0c21.4,13.3,18.9-21.7,19.8-36.7.2-10.8.9-34.9,6.1-40.3,9.6-5.1,14.1-13.6,20.8-20.5,24-4.1,57.6-5.2,59-36.1,2.4-7.9,4.7-17.1,8.7-24.6,1.2-2.2,4.2-7.3,7-7.3,2.8,0,.8,0,1.3.2,3,.7,6.4,0,8.8-1.9,2.5-2,3.9-5,3.7-8.2-.3-14.6,12.8-26.9,16.9-41.3,2.4-9,9.9-14.3,22.2-20.5,4.4-3.2,6.7-6.3,13.2-7.8,15.1-3.4,21.2-13.4,24.3-27.2,11.7-36.5,61.6-19.8,91.9-31.5,7.2-6,12.5-12.7,19.3-18.7,12.7-7.9,9.5-14.9,16.2-22.9,5.4-5.3,11.8-9.1,18.9-11.1,3.9-.6,8.4,3.8,12.7,7,21.5,9.8,34.2-25.7,36.6-39.7.2-7.3-8.1-12.3-14.4-9-14,6.4-29.2,6.7-45.4,6.9-6.5,0-13.3,0-19.9.9-8.5,0-26.5-6.8-29.6-9.5-4.1-3.2-8.8-5.6-10.7-6-5.3-11.8-14.2-19.7-23-26.6-5.6-4.8-9.8-11.3-18.8-10.4h0l.3.2Z"/>
</g>
<g>
<path class="st0" d="M4066.4,3367.4c-7.7,0-18.6-1.5-26-.9-4.9.4-7.5-6.6-3-9.2,13.3-8.4,15.9-24,19.9-38.4,20.3-16.3,32.2-29,38.6-53.3,1.8-6.2,4.6-10.4,9.1-13.3,6.7-6.2,11.9-14.5,17-22.6,6.8-10.8,8.5-17,23.2-16.1,13.1,0,24.5,4.3,34-7.2,38.9-34.8,12.8-18.1,35.3-52.7,9.3-28.6,31-24.7,43.3-45.1,2.7-15.1,16.5-22.2,26.4-31.4.9-.9,2.2-1.4,3.5-1.4s.2,0,.4,0c16.7,1.9,42.7-1.3,47.6-10.8,8-10.8-2.8-22.6.8-28.9,13.6-17.3,22.4-18.5,30.2-19.7,4.4-.6,8.2-1.2,13.3-5.1,5.4-5.7,12.8-6.8,18.7-10.9,3.6-1.7,9.2-.7,12.9-.5,8.3-2,17,1.4,22.9,5.8,11.3,9.1,17.2,2.9,28.8,1.4,4.9-.2,6.9,7.1,2.4,9.3-16.9,9.6-28.7,28.9-46.9,37.6-12,9.5-25.3,21.1-35.2,34.8-12.7,11.9-26.7,21.9-37.5,35.4-15.6,13.9-5.3,35.5-20.5,46.9-8,2-5.3,13.1-11.6,18.1-6.2,3.1-11.5,6.8-16.7,11.4h0c-5.8,5.3-13.3,9.6-18.2,15.4-16.1,24.2-41.3.5-51.9,27.4-1.9,4.3-6.3,6.2-9.8,7.5-3.7,1.3-6.5,2.9-8.4,6.3-8,9.7-15.7,17.4-24.4,24.2-24.6,23.4-44.4,62.6-78.7,71.2-16.6,5.2-24.7,16.9-39.4,15.1h0v-.3Z"/>
<path d="M4417.5,3004.2c11,0,17.4,11.3,28.9,11.5,5.9,0,3.9-.3,5.9-1,3.9-1.2,7.5-2.3,11-2.9-17.5,9.6-29.3,29.2-47.2,37.7-12.1,9.7-25.8,21.2-36,35.4-12.6,11.9-26.6,21.6-37.6,35.6-17.3,17.4-8.3,39.4-19.5,46.1-10.1,3.3-7.3,14.1-12.3,18.5-6.6,2.9-11.7,7.2-16.7,11.4-6.3,5.5-13.8,9.6-19,16.1-15.8,22.3-41-2-52.6,28.6-3.3,5.5-12.6,3.8-17.4,12.4-8.3,10-15.9,17.4-23.8,23.6-24.3,22.9-44,61.8-76.7,70.2-13.1,2.8-21.6,15-35.2,15s-1.9,0-2.9-.2v.2c-5.9,0-22.8-1.5-26.4-.9,15.2-9.6,17.8-26.4,22-41.3,22.5-14.6,31-29.6,38.6-53.3,1.5-5.4,3.7-8.5,7.4-10.8,11-9.9,17.8-24.5,26.4-36.3,16.8-5,34.4,6.3,48-9.8,40.6-36.3,14.5-21.2,36.5-54.2,10.3-29.8,34-24.6,43.7-45.8,1.9-13.4,15.5-20.3,25-29.3,28.3,2.1,67.4-1.9,52.7-41.5,20.5-26.1,27.1-11.8,43-24.2,4.2-4.9,11.8-5.9,17.2-10,1.1-.5,2.4-.6,3.8-.6,2.4,0,5,.5,7.2.5,3.3,0,3.3-.7,6-.6M4463.3,3011.8h0M4417.5,2994.2c-1.9,0-3.9.2-5.9.7-5.5-.4-12.5-1.4-17.1,2.1-5.6,3.7-12.4,4.8-17.9,10.6-17.2,8.6-25.9,1.2-44.1,25.4-8.8,13.5,22.2,36.6-33.2,38.1-22.8,0-12-1.4-25.7,8.6-8,6.5-18,14.5-20.5,27.3-12.9,17.9-33.4,15.7-43.1,44.4-21.8,33.1,3.1,18.1-34.1,51.3-3.8,4.7-7.4,6.7-14.6,6.6-23.4-.6-31.7-4.9-43.4,17.8-5.1,8-9.8,15.6-15.9,21.3-19.9,17.6-9,41.5-45.3,63.6-10.2,10.6-5.4,31.5-21.9,41.3-8.4,4.9-4.3,18.8,5.4,18.5,3.7-.8,18,1,26.3.9,16.9,1.7,26.9-11.4,40.5-15.2,35.8-9,55.7-48,80.8-72.3,9.1-7.3,18.1-15.8,26-26.3.9-1.5,2.1-2.1,5.3-3.4,3.9-1.4,10.3-4.4,12.6-10.3,7.4-21.9,33.9-.5,51.2-26.1,4.6-5.4,11.9-9.6,17.5-14.6h0c8.5-8.3,21.6-10.7,23.3-23.5,1.7-5.8,1.3-3.7,4.3-5.4,18-12,6.5-34.5,22.3-48.6,10.3-13.1,24.4-22.8,36.6-34.5,9.7-13.2,22.5-24.8,34.5-34.1,18.1-8.8,30-27.7,46.5-37.4,3.3-1.7,5.4-4.9,5.4-8.8-2-16.1-17.1-7.7-26.8-6-9.4-1.6-16.6-12.1-29-11.5h0v-.5Z"/>
</g>
<g>
<path class="st0" d="M6125.8,1215.9c-2.9-.2-8.4-3.9-9.9-3.1-9.5.2-17.6-4.5-24.5-8.6-5.5-5.9-2.5-18.6-3.7-26.2.9-7.2-2.6-16.3.4-22.7,13.9-14,3.6-22.4,21.7-41.7,14.2-14.8,8.6-23.8,18.2-39.6,3-4.6,5-9.7,7.1-15.1,2.4-8.9,10.1-17.3,10.8-26.6,1.1-8.1,2.9-14.4,15.3-21.7,5.6-4.1,3.2-13.5,6.4-19.3,3.3-3.8,11.2-3.2,13.9,1.9,3.1,6.3,8.5,9.5,15.6,12.3,7.5,4.5.9,23.5,0,30.5-1.9,4.8-.7,11.6-4.7,15.1-71.6,38.1,23,128.5-42.1,151.3-6.3,1.1-12.1,2-20.9,11.6-1,1.1-2.3,1.6-3.7,1.6v.3Z"/>
<path d="M6173.6,994c1.5,0,3.1.5,3.4,1.3,4,8.2,11,12,18.3,14.9,1.1,12.5-3.5,24.4-5.4,36.8-74.8,45.7,17.3,133.6-40.3,150.7-6.5,1.1-13.8,2.3-23.8,13.2-3.3-1.5-6.9-3.5-10.8-3.1-7.6-.1-13.9-3.7-21.1-7.9-1.7-13.5-.7-27.3-2.1-41.1,4.5-4.9,9.4-10.5,9.8-19.4,2-17.4,22.8-28.4,24.8-46.9.4-5,2.1-9.7,5.9-15.8,6.6-10.4,8.8-23,15.7-32.9,5.8-12.3-1.5-18.9,16.1-29.1,6.1-4.8,6.4-13,7.2-19.3-.2-1.1,1-1.5,2.3-1.5M6173.6,984c-15.2,0-10.4,14.8-15.3,22.7-17.9,10.5-15.3,19.3-19,32.4-6.9,10.2-9.2,22.4-15.4,32.4h0c-9.4,14.6-5.1,26.3-18,39.1-6,7.8-13.4,16.9-14.2,28.5.8,7.8-10.5,12.4-9.8,20.8,2.6,11.7-3.1,42.1,6.9,48.7,7.4,4.4,15.8,9.3,26.5,9.3,1.5-.1,2.7.5,4.5,1.3,13.5,7.2,16.6-11.5,31.4-11.6,34-8.3,31-41.4,23.4-69.5-21-85.7,21.7-61.1,27.5-100.8,1.3-10.1,9.3-29.9-3.1-36.3-13.7-3.2-11.5-16.9-25.4-16.9h0Z"/>
</g>
<g>
<path class="st0" d="M6762.7,369.7c-20.1,0-27.2-17.1-48.9-27.9-3.9-2.2-6.6-9.8-3.9-14.7,5.3-11.2,8.1-21.6,8.4-32.7,0-1.8,1-1.5,1.5-1.6,33.9,2.5,48-46.7,78-50.5,7.1.5,15.9-6.4,22.4-7.3,4.8,7.7,5.2,16.9,5.7,26.7-.1,10.1,3.1,21.4,2.4,31.2-3,8.3-7.7,16.1-12.7,24.3-6.6,9.3-10.6,22-18,30.6-3.8,4.4-7.6,8.8-8.5,18.6-12.1,2.2-20.4,3.2-26.6,3.2h.2Z"/>
<path d="M6817.7,241.1c3.9,9.1,2.8,22.1,4.1,32.8.4,5.8,2.2,12.7,1.7,18-5.8,15.4-17.9,29.8-24.4,45.7-5.2,9.2-12,11.4-14.4,24.7-39.9,8.6-35.1-5.8-68.6-24.6-1.8-.8-3.4-5.4-2.2-8,5.2-10.7,8.2-21.1,9-31.7,33,0,47-44.5,74.6-50.5,7.4,0,13.7-3.6,20.1-6.4M6723.2,294.6h0M6820.2,230.2c-6.2,0-15.5,7.2-22.2,7.2-23.3-3.2-47,50.5-76.6,50.5s-.9,0-1.3,0c-4-.3-6.9,2.4-7,6.5-.4,10.9-3.4,21-8.1,30.9-3.5,7.1-.2,17.5,6.2,21,30.5,17.7,30.3,28.5,51.5,28.5s17-1.3,31.4-4c0-16.7,8-17,14.1-28.9,6.9-16.4,19.3-31,25.1-47.5,1.1-6.9-1-14.3-1.5-21.4-2.3-12.3,1.8-37.2-11.6-42.7h0Z"/>
</g>
<g>
<path class="st0" d="M4971.2,2681.9c-10.6.1-21.1-12.9-20.3-23.2-.4-4.3-4.5-10.1-4.5-13.9,29.4-11.7,57,15.5,63.2-17.6,8.2-11.3,13.3-21.5,16.2-32.2,1.4-3.9,6.4-6.4,12.1-9.2,6.6-3.3,14-7,18.6-14.2,2.1-2.3,5.6-3.8,9.3-5.3,6.4-2.6,14.3-5.9,16.8-15.2,3-12.3,14.4-20.3,19.8-31.9,5.8-15,15.3-28.4,24.1-42.2-.4,10.2,13.5,22,19.4,8.3,0-10.8,13.4-6.8,14.2-15.4,7.1,25-54.4,35.5-49.4,68.9,0,26.5-15.7,16.1-27.4,30.8-6.7,11.3-15.9,20.9-20.9,33.6-3,7-13.3,10.7-18.7,15.9-6.9,5.2-13.4,10.2-21.1,12.8-25.5,6.4-26.5,43.9-51.7,50h.3Z"/>
<path d="M5125.3,2488.3c2,3.7,5.4,6.7,9.5,7.7-44,26.6-18.7,47.8-35.8,58.5-6.8,3.5-14.3,3.8-19.7,12.5h0c-6.8,11.5-16,21.1-21.2,34.3-2.8,5.2-12.7,9.4-17.2,13.7-8.6,7.4-17.1,11.1-26.8,15v-.4c8.3-11.5,13.5-22,16.5-33.1,7.8-7.8,22.8-9.9,29.9-21.8,1.4-1.4,4.4-2.6,7.3-3.8,6.6-2.7,16.9-7,19.7-18.8,2.9-11.3,14.4-19.5,19.4-30.9,4.7-11.5,11.1-22,18.2-33M4970.2,2646.9c9.5-.7,16.8,3.3,25.2,3.2-2.9,7-8,12.7-13.6,18.9-5.6,7.8-12,11.3-20.3,3.2-7.3-6.8-4.6-16.1-8.9-23.8,5.4-.7,11.5-1.4,17.6-1.4M5136.4,2458.6c-9.8,1.2-11.5,14.2-17.2,20.8-7.8,12.1-15.7,24.1-21,37.6-5.6,11.7-17,19.7-20.1,32.9-3.1,11.8-18.4,10.7-25.3,18.8-7.8,12.7-27.7,13.4-31.5,25-3,11.4-8.6,21.3-15.5,30.8-2.6,6.7-3,15.1-12.3,15.8-3.9,0-1.4,0-2-.4-14.9-4.5-29.5-3-45-.7-10.5,4-1.5,13.4-.5,20.3-.1,13.9,12.6,27.5,25.3,27.5s9.4-1.8,13.4-6.2c7.1-8.2,15-15.6,19.5-25.8,4-8.9,10.8-15.3,20.3-18.4,13.2-4.5,22.8-14.9,34.5-22.1,3.7-2.4,6.7-5.3,8.4-9.5,4.8-12.2,14-21.7,20.5-32.9,3.1-5.2,9.9-5.6,14.8-8.4,21.4-8.4,6.5-34.2,21.3-46.5,8.4-7.9,18.2-14,27.5-20.8,10.4-6.5,25.6-32,5.5-32s-2.2,0-3.4.2c-1.1-1.8,1.5,4.4,1.8,5.4-18.9,6.3-9.6,13.9-17.3,16.4-1.2,0-2.7-.7-3.4-2-11.1-16.1,14.7-23.3,1.7-25.8h0Z"/>
</g>
<g>
<path class="st0" d="M2942.8,4401.9c-8.6-12.7-14.7-14.6-21.4-18.7-.7-1.8,7.1-9.8,5.1-14.5-6.5-15-9.3-14,6.9-18.8,10.3-3.6,21.5-6.3,32.3-7,1.6-.1,3-.9,3.8-2.2,5.7-8.6,19.7-22,26.7-22,1.7.1,6.4.6,13.2-3.7,3.2-1.5,5-3.8,7.4-.7,8.3,6.2,13.2,16.3,22.7,21.6-.7,1.9-2.6,7.2-3,8.2-9.9,2.8-28.9-1.3-28,13.7-9.6-.7-16.6,6.8-16,16.2-10.6,0-23.5,14-27.8,9.6-3.5-2.3-10.1-.4-11.2,5.1-.6,5.8-4.8,12.1-10.7,13.3h0Z"/>
<path d="M3015,4317.7h0M3013.8,4318.3c7.1,5.5,11.8,14,19.6,19.7-.2.6-.5,1.1-.5,1.7-10.5,2.1-26.4,0-28.9,13.5-8.6,1.3-15,8.2-16,16.7-8.8,2.1-13.8,6.4-20.3,9.6-6.4-4.1-17.2-1-18.9,8.8-.3,2.8-1.8,5.8-4,7.5-6.3-8.3-12.5-12.2-16.7-14.6,7-9.3,3.6-14.3-.7-23.7,12.6-4.4,25.8-8.7,39.1-9.5,3.1-.2,5.9-1.9,7.6-4.5,1.7-4.1,18.5-20.2,22.4-19.8,7.1.8,12.9-2.7,17.6-5.4M3014.4,4307.8c-5.2,0-10,6-16.1,6-7.5-2.4-26.3,13.3-32.9,24.2-11.2.8-22.7,3.3-33.4,7.3-18.8,5.7-19,6.4-10,25.7-14.5,24.6,1.6,8.8,18.2,36.3,9.7.2,17.3-8.8,18.2-18.1,0-.5,2.1-1.5,3-1.5s.2,0,.3,0c11.9,7.2,18.1-10.2,36.5-9-3.5-11.8,4.6-18.1,14.7-15.3,1.7,0,1.6-1,.8-4.7-.8-3.6.4-6.3,3.1-6.7,7.6-1.1,15.3-2.2,23.4-3.3,1.6-4.5,3.3-9.1,5.5-15.3-13.3-4.2-18.2-22.1-31.3-25.6Z"/>
</g>
<g>
<path class="st0" d="M6480.2,261.8c-10.3,0-21.2-2-30.7-3.2-12.3-10.8-19.5-23-22.6-38.3-.9-5.2,3.6-11.1,4.6-16.8,16.2-8.7,32.9-3,49.7,2.7,6.5.3,11.6,2.6,11.2,3.2,5.3,13.3,2.6,31,5.9,45.4-.8,2.5-3.7,6.9-18.1,6.9h0Z"/>
<path d="M6449.8,194v10c11-.3,27.6,7,38.7,8.6,3.4,13.1,2,27.8,4.6,41.5-10,6-29.4.7-41.4-.3-10.8-9.9-17-20.6-19.9-34.5-.1-3.1,3.1-8.4,4-12.3,4.5-2,9.1-3,14.1-3v-10M6449.8,194c-7.4,0-14.9,1.7-22.9,6.3-.8,7.6-6.5,13.8-5,21,3.6,17.3,11.8,30.5,25.5,42.1,11.9.4,51.5,11.6,56-8.4-2.5-11.2-1.7-22.7-3.4-34-1.7-11.6-.9-18.5-17.4-19.5-11.1-3.6-21.8-7.4-32.9-7.4h0Z"/>
</g>
<g>
<path class="st0" d="M803.5,3629.8c-31.7-15.4-55.2-52.6-16.6-76.9,7.9,3.7,15.5,13,23.8,12.9,5.9,1.2,10.5,2.2,16.7,12.5,14.2,23.7,4.6,29.4-9.3,46.4-5.2,1.8-9.8,3.3-14.6,5.1Z"/>
<path d="M788.4,3557.6h0M787.1,3558.6c19.1,17.9,25.1,5.3,35.8,22.1,12.1,20.3,5.2,24.1-8,39.7-4,1.4-7.5,2.6-11.3,3.9-26.1-13.7-47.3-44.2-16.7-65.8M786.9,3547.9c-45.3,20.5-21.1,73.4,16.4,87.2,5.4-1.8,10.8-3.7,17.6-6.1,17.6-21.7,25.7-25.5,10.7-53.2-12.4-20.7-22.1-10.4-33-21-2.9-2.9-7.5-6.3-11.8-6.9h0Z"/>
</g>
<g>
<path class="st0" d="M95.2,5287.1c-1.4.1-4-1.2-3.8-2.7.4-10.2-3.7-20-1.9-29.6-6.1-18.3-7.4-22.2,3.2-37.7h0c.5-.7,1.4-1.4,1.8-1.6,13.6-2.7,26.4-7.3,39.3-11.4-1.9,12.8-19.5,21.3-14.6,38.7,1.1,12.6-4.2,24.2-9.5,36.4-1.5,3.6-10,6.4-14.5,8h0Z"/>
<path d="M124.2,5212.5c-20.7,18.3.9,57.1-27.8,68.9.3-7.3-3.8-15.6-2.2-21.9.6-2.2.6-4.5-.2-6.5-5-17.7-7.7-16.1,2.6-32.7,9.5-1.9,18.6-4.7,27.5-7.7M137.2,5197.7c-14.7,4.7-28.7,10-43.6,12.9-1.8.4-3.9,2.1-5,3.7-12,17.7-10.2,22.7-3.9,42.1-2.9,9.4,2.5,18.2,1.7,27.6-.4,4.6,4.2,8.1,8.8,8.1s2.4-.2,3.4-.7c5.5-3,13.1-4.2,15.7-10.4,5.5-12.5,11.2-25.1,9.8-39.1-4.9-19.6,21.5-27.3,13-44.2h0Z"/>
</g>
<g>
<path class="st0" d="M5846.5,1535c-12.4-2.1-4.7-23.6,5.9-26.4,4.6,0,9.5,0,14.4-1.3-2.2,12.1-6.9,26.1-20.4,27.8h.1ZM5880.6,1492c2.5-6.3,5.2-13.5,4.1-21.8,0-8.4,4.9-17.1,5.3-25.9,7.7-5.4,27.3-12.5,33.6-3.6,2.6,2.5,3.5,2.8,1.9,5.6-9.8,26.8-17.3,34.9-44.9,45.8v-.2h0Z"/>
<path d="M5912.8,1441.7h0c5.9.3,6,1.7,7.8,3.2-9,19.9-9.1,28.5-31.7,38,.9-4,1.4-8.3.8-13.1.2-7,4.2-14.8,5-22.5,5.2-3,12.2-5.7,18.1-5.7M5860.2,1513.4c1,5.5-8.7,16.8-13.6,16.6-4-4.9,1.6-14.1,7-16.4,2.1,0,4.3,0,6.8-.2M5912.8,1431.7c-9.7,0-20.7,4.9-27.7,10,.2,9.7-5.7,19.3-5.3,29,1.2,8.4-2.3,15.5-5,22.8-3.1,10.6-13.3,9.9-23.1,10.1-16,3.6-24.6,34.2-5.1,36.4,10,0,22.6-13.2,23.5-24.3,2.9-22,21.4-19.6,35.4-30.5,17.4-10.3,16-20.6,24.5-36.5,5.5-9.6-8.7-17.5-17.2-17h0Z"/>
</g>
<g>
<path class="st0" d="M6050.1,1325.1c-4.8,0-12.7-11-13.8-16.5-.5-8.1-3.1-16-7.7-24-1-2.6-1.3-5.7,1.6-6,19.6,4.5,16-3.4,35.8,13,16.2,8.9,12.8,21.3-1.2,25.8-4.4,1.2-9.4,4.7-14.7,7.7h0Z"/>
<path d="M6032.9,1281.6h0M6034.3,1284.7c9.3,2.1,11.6-2.5,20.7,4.9,4.5,5.3,15.6,8.5,16.8,15.1h0c-2.3,9.7-14.5,7.8-22.2,15-11.5-8.6-7.7-23.5-15.2-35M6030.1,1273.6c-6.9,0-8.8,7.8-5.9,13.4,4,6.9,6.7,14.1,7.2,22.2,1.1,6.6,10.4,20.9,18.8,20.9s2.8-.4,4.1-1.3c11.3-9.5,23-5.5,27.3-21.6,3.4-12.5-12.4-18.1-19.8-25.2-14.2-11.1-18.4-4.6-31.7-8.4Z"/>
</g>
<g>
<path class="st0" d="M721.8,3531.1c.6-9.3-2.2-16.9-5.1-23.2-7.8-17.4-9.8-36.7-5.8-54.6,6.4-.5,11.5-2.4,15.6-7.9,5.3,13.2,1.7,27.4.8,42.1-2.3,20.2-.4,27.1-5.1,43.4-.2,0-.3.2-.5.2h0Z"/>
<path d="M723.8,3454.5c1.4,15-2.6,36.2-2.9,50.4-6.6-15.1-8.6-31.6-5.8-47.3,3-.5,6-1.5,8.8-3.2M724.8,3438.6c-4.1,8.1-8.9,9.6-17.4,9.8l-.7.7h0c-5.3,20.4-3.1,41.8,5.4,60.9,3.5,7.5,5.5,14.6,4.5,22.7,1.9,4.9,6.6,4.2,9.9,1.4,2.6-7.1,3-15.5,4.9-22.9-3.2-12.1,11.9-70.3-6.6-72.5h0Z"/>
</g>
<g>
<path class="st0" d="M5247.2,2376.4c-5.5,0-11.2-1.3-16.8-1.5-7.1-7.3-5.8-16.5-8.2-25.5,7.2-16.3,35.2-11,39.3,5,3.7,11.1-2.3,22.4-14.6,22.1h.3Z"/>
<path d="M5236.4,2344.6c8.3-.2,18.5,2.1,20.7,11.4,1,2.5,2,9.5-3,13.6-4.5,4.1-15.5.8-21.2.7-3.8-4.6-3.8-13.3-5.2-20,2.4-2.2,5.1-5.8,8.8-5.4M5236.4,2334.6c-8.1-.3-18.1,7.5-19,15.4,2.7,9.5.7,20.5,11.1,29.8,55.9,12.8,47.3-48.2,7.9-45.3h0Z"/>
</g>
<g>
<path class="st0" d="M5442.1,2144.1c-7.8.9,2.3-13.3.1-18.6-1.6-8.5,3.3-19.2,8.9-25.9,11.2-12,15.6-10.8,16,8.1,1.2,20.6-10.4,34.3-25.1,36.3h.1Z"/>
<path d="M5462.3,2096.9h0M5460.9,2097.5c4.5,15.5-1.5,37.1-15.9,41,1.3-4.2,3-8.3,2.2-14-2.2-7.1,6.8-23.4,13.8-27M5462.1,2086.9c-11.4,0-27.9,22.9-24.8,39.4.1,8.7-9.6,22.3,4.8,22.7,11.7,0,31.8-14.1,30-41.3,0-15.1-4.3-20.8-10-20.8h0Z"/>
</g>
<g>
<path class="st0" d="M6016.6,925.9c-3.7,0-11-6.5-13.2-10.3-.3-9.5-1.2-18.8,3.2-26.9,10.1-9.6,19.5-8.7,25.7,5.9-6.5,10.3-12.1,20-15.1,31.1h-.5v.2h-.1Z"/>
<path d="M6019.3,877.4c-20.9.9-22.8,22.5-20.9,39.5,2,4.7,11.4,14,18.2,14s3.8-.8,5.1-2.8c3-11.9,9.3-22.2,16-32.7-3.5-11.8-10.3-18-18.4-18Z"/>
</g>
<g>
<path class="st0" d="M5542.2,1945.6c-7.9-2.3-12.4-10.9-20.9-12.4-5.1-1-7-6.7-7.5-11.6-3.7-13.5-.6-25.7,10.8-24.6,9.4,4.7,24.3,11.5,28.6,21.8-.4,17.6,11,27.3-11,26.6v.2Z"/>
<path d="M5523.6,1902.1h.7c8.2,5.5,18,9.3,23.9,17.2.5,6.4,1.2,13.5,2.6,20.8-2.9.2-5.8.3-8.6.5h0c-6.6-4.2-11.1-10.2-19.8-12.2-2.1-.5-2.8-2.8-3-3.7-1.3-8.5-5.6-22.6,4.2-22.6M5523.6,1892.1c-16.7-.2-18.2,18.6-14.7,30.8.7,6.9,4.4,13.8,11.2,15.2,8.1,1.6,13.3,11.9,22.1,12.5,6.5.3,20.4-.3,18.4-12.4-2.5-9.2-.5-17.5-4.4-24.9-5.6-7.7-24.3-20.4-32.6-21.3h0Z"/>
</g>
<g>
<path class="st0" d="M2734.3,4538.2c-2.4,0-4.6-1.9-5-4.3-2.2-5.2-5.4-9.8-8.8-14.6-2.5-4.8-11.3-12-4.9-16.9,5.6-2.6,17.8-9.8,23.3-7.5,7.1,5.7,16.1,3.2,19.8,8.4,1.7,6.3-4.9,10.1-1.4,18.3,1.5,6.8,0,6.7-10.3,11.6-5.3,2.2-9,4.5-12.9,5.2l.2-.2Z"/>
<path d="M2736.4,4499.1c7.3,4.5,13,5.2,17.9,6.3-4.6,9.8-2.5,14-1.3,19,.6.5-14.6,7.1-18.7,8.8-3.7-9.9-10.9-17.6-16-26.6,5.4-3.4,12-5.1,18.1-7.5M2736.4,4489.1c-19.9,5.6-39.1,10.4-19.9,33,7,7.2,8.7,25,21.6,20.3,8.2-4.7,29.1-7.7,24.3-22.5-1-3.5-1.4-5.1,1.1-10.4,3.3-6.6-1.8-14.1-8.9-14.5-5.6,0-11.7-5.3-18-6.1h0l-.2.2Z"/>
</g>
</svg>`;
// デフォルトの記号スタイル定義
const SYMBOL_PROTOTYPES = [
{ symbolFill: '#F1C232', symbolStroke: '#000000', areaFill: '#FFE599', areaStroke: '#7F6000', info: '黄色い五芒星001' },
{ symbolFill: '#CC0000', symbolStroke: '#000000', areaFill: '#EA9999', areaStroke: '#660000', info: '赤ひし形002' },
{ symbolFill: '#674EA7', symbolStroke: '#000000', areaFill: '#B4A7D6', areaStroke: '#20124D', info: '紫三角003' },
{ symbolFill: '#1155CC', symbolStroke: '#000000', areaFill: '#9FC5E8', areaStroke: '#073763', info: '青丸004' },
{ symbolFill: '#45818E', symbolStroke: '#000000', areaFill: '#A2C4C9', areaStroke: '#0C343D', info: '青緑五角形005' },
{ symbolFill: '#E69138', symbolStroke: '#000000', areaFill: '#F9CB9C', areaStroke: '#783F04', info: 'オレンジ六芒星006' },
{ symbolFill: '#3C78D8', symbolStroke: '#000000', areaFill: '#A4C2F4', areaStroke: '#1C4587', info: '明るい青逆五芒007' },
{ symbolFill: '#A64D79', symbolStroke: '#000000', areaFill: '#D5A6BD', areaStroke: '#52293C', info: 'マゼンタ逆ひし008' },
{ symbolFill: '#B45F06', symbolStroke: '#000000', areaFill: '#F6B26B', areaStroke: '#783F04', info: '009' },
{ symbolFill: '#8E7CC3', symbolStroke: '#000000', areaFill: '#D9D2E9', areaStroke: '#4C3B78', info: '010' },
{ symbolFill: '#CC4125', symbolStroke: '#000000', areaFill: '#F4CCCC', areaStroke: '#660000', info: '011' },
{ symbolFill: '#F7C467', symbolStroke: '#000000', areaFill: '#FCE5CD', areaStroke: '#B45F06', info: '012' },
{ symbolFill: '#4285F4', symbolStroke: '#000000', areaFill: '#A4C2F4', areaStroke: '#1967D2', info: '013' },
{ symbolFill: '#0F9D58', symbolStroke: '#000000', areaFill: '#81C784', areaStroke: '#0B8043', info: '014' },
{ symbolFill: '#F4B400', symbolStroke: '#000000', areaFill: '#FDE293', areaStroke: '#A67C00', info: '015' },
{ symbolFill: '#DB4437', symbolStroke: '#000000', areaFill: '#F08080', areaStroke: '#C4281B', info: '016' },
{ symbolFill: '#795548', symbolStroke: '#000000', areaFill: '#A1887F', areaStroke: '#4E342E', info: '017' },
{ symbolFill: '#9C27B0', symbolStroke: '#000000', areaFill: '#CE93D8', areaStroke: '#6A1B9A', info: '018' },
{ symbolFill: '#00BCD4', symbolStroke: '#000000', areaFill: '#80DEEA', areaStroke: '#00838F', info: '019' },
{ symbolFill: '#607D8B', symbolStroke: '#000000', areaFill: '#90A4AE', areaStroke: '#37474F', info: '020' },
{ symbolFill: '#CC4125', symbolStroke: '#000000', areaFill: '#F4CCCC', areaStroke: '#660000', info: '021' },
{ symbolFill: '#F7C467', symbolStroke: '#000000', areaFill: '#FCE5CD', areaStroke: '#B45F06', info: '022' },
{ symbolFill: '#4285F4', symbolStroke: '#000000', areaFill: '#A4C2F4', areaStroke: '#1967D2', info: '023' },
{ symbolFill: '#0F9D58', symbolStroke: '#000000', areaFill: '#81C784', areaStroke: '#0B8043', info: '024' },
{ symbolFill: '#F4B400', symbolStroke: '#000000', areaFill: '#FDE293', areaStroke: '#A67C00', info: '025' },
{ symbolFill: '#DB4437', symbolStroke: '#000000', areaFill: '#F08080', areaStroke: '#C4281B', info: '026' },
{ symbolFill: '#795548', symbolStroke: '#000000', areaFill: '#A1887F', areaStroke: '#4E342E', info: '027' },
{ symbolFill: '#9C27B0', symbolStroke: '#000000', areaFill: '#CE93D8', areaStroke: '#6A1B9A', info: '028' },
{ symbolFill: '#00BCD4', symbolStroke: '#000000', areaFill: '#80DEEA', areaStroke: '#00838F', info: '029' },
{ symbolFill: '#607D8B', symbolStroke: '#000000', areaFill: '#90A4AE', areaStroke: '#37474F', info: '030' },
{ symbolFill: '#CC4125', symbolStroke: '#000000', areaFill: '#F4CCCC', areaStroke: '#660000', info: '031' },
{ symbolFill: '#F7C467', symbolStroke: '#000000', areaFill: '#FCE5CD', areaStroke: '#B45F06', info: '032' },
{ symbolFill: '#4285F4', symbolStroke: '#000000', areaFill: '#A4C2F4', areaStroke: '#1967D2', info: '033' },
{ symbolFill: '#0F9D58', symbolStroke: '#000000', areaFill: '#81C784', areaStroke: '#0B8043', info: '034' },
{ symbolFill: '#F4B400', symbolStroke: '#000000', areaFill: '#FDE293', areaStroke: '#A67C00', info: '035' },
{ symbolFill: '#DB4437', symbolStroke: '#000000', areaFill: '#F08080', areaStroke: '#C4281B', info: '036' },
{ symbolFill: '#795548', symbolStroke: '#000000', areaFill: '#A1887F', areaStroke: '#4E342E', info: '037' },
{ symbolFill: '#9C27B0', symbolStroke: '#000000', areaFill: '#CE93D8', areaStroke: '#6A1B9A', info: '038' },
{ symbolFill: '#00BCD4', symbolStroke: '#000000', areaFill: '#80DEEA', areaStroke: '#00838F', info: '039' },
{ symbolFill: '#607D8B', symbolStroke: '#000000', areaFill: '#90A4AE', areaStroke: '#37474F', info: '040' },
{ symbolFill: '#CC4125', symbolStroke: '#000000', areaFill: '#F4CCCC', areaStroke: '#660000', info: '041' },
{ symbolFill: '#F7C467', symbolStroke: '#000000', areaFill: '#FCE5CD', areaStroke: '#B45F06', info: '042' },
{ symbolFill: '#4285F4', symbolStroke: '#000000', areaFill: '#A4C2F4', areaStroke: '#1967D2', info: '043' },
{ symbolFill: '#0F9D58', symbolStroke: '#000000', areaFill: '#81C784', areaStroke: '#0B8043', info: '044' },
{ symbolFill: '#F4B400', symbolStroke: '#000000', areaFill: '#FDE293', areaStroke: '#A67C00', info: '045' },
{ symbolFill: '#DB4437', symbolStroke: '#000000', areaFill: '#F08080', areaStroke: '#C4281B', info: '046' },
{ symbolFill: '#795548', symbolStroke: '#000000', areaFill: '#A1887F', areaStroke: '#4E342E', info: '047' },
{ symbolFill: '#9C27B0', symbolStroke: '#000000', areaFill: '#CE93D8', areaStroke: '#6A1B9A', info: '048' },
{ symbolFill: '#00BCD4', symbolStroke: '#000000', areaFill: '#80DEEA', areaStroke: '#00838F', info: '049' },
{ symbolFill: '#607D8B', symbolStroke: '#000000', areaFill: '#90A4AE', areaStroke: '#37474F', info: '050' },
{ symbolFill: '#CC4125', symbolStroke: '#000000', areaFill: '#F4CCCC', areaStroke: '#660000', info: '051' },
{ symbolFill: '#F7C467', symbolStroke: '#000000', areaFill: '#FCE5CD', areaStroke: '#B45F06', info: '052' },
{ symbolFill: '#4285F4', symbolStroke: '#000000', areaFill: '#A4C2F4', areaStroke: '#1967D2', info: '053' },
{ symbolFill: '#0F9D58', symbolStroke: '#000000', areaFill: '#81C784', areaStroke: '#0B8043', info: '054' },
{ symbolFill: '#F4B400', symbolStroke: '#000000', areaFill: '#FDE293', areaStroke: '#A67C00', info: '055' },
{ symbolFill: '#DB4437', symbolStroke: '#000000', areaFill: '#F08080', areaStroke: '#C4281B', info: '056' },
{ symbolFill: '#795548', symbolStroke: '#000000', areaFill: '#A1887F', areaStroke: '#4E342E', info: '057' },
{ symbolFill: '#9C27B0', symbolStroke: '#000000', areaFill: '#CE93D8', areaStroke: '#6A1B9A', info: '058' },
{ symbolFill: '#00BCD4', symbolStroke: '#000000', areaFill: '#80DEEA', areaStroke: '#00838F', info: '059' },
{ symbolFill: '#607D8B', symbolStroke: '#000000', areaFill: '#90A4AE', areaStroke: '#37474F', info: '060' }
];
// 状態管理オブジェクト
const state = {
maxDistance: 400,
legendX: 4600,
legendY: 5500,
legendSize: 240,
titles: [
{ id: 'english', nameKey: 'titleEnglish', text: 'template', fontSize: 550, x: 3800, y: 700 },
{ id: 'hiragana', nameKey: 'titleHiragana', text: 'みほん', fontSize: 350, x: 3800, y: 1380 },
{ id: 'kanji', nameKey: 'titleKanji', text: '見本', fontSize: 550, x: 3800, y: 2175 }
],
symbols: [], // Initially empty, populated from textarea
placements: [
{ id: 1, en: 'Yakumo', ja: '八雲', symbolX: 408, symbolY: 5195, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 280, labelY: 5363 },
{ id: 2, en: 'Oshamambe', ja: '長万部', symbolX: 474, symbolY: 5011, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 383, labelY: 4780 },
{ id: 3, en: 'Horobetsu', ja: '幌別', symbolX: 758, symbolY: 5073, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 747, labelY: 5278 },
{ id: 4, en: 'Biratori', ja: '平取', symbolX: 1174, symbolY: 5003, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1200, labelY: 4781 },
{ id: 5, en: 'Nukkibetsu', ja: '貫気別', symbolX: 1240, symbolY: 4951, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1580, labelY: 4960 },
{ id: 6, en: 'Niikappu', ja: '新冠', symbolX: 1265, symbolY: 5106, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1300, labelY: 5299 },
{ id: 7, en: 'Samani', ja: '様似', symbolX: 1510, symbolY: 5262, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1780, labelY: 5300 },
{ id: 8, en: 'Obihiro', ja: '帯広', symbolX: 1566, symbolY: 4836, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1700, labelY: 4610 },
{ id: 9, en: 'Kushiro', ja: '釧路', symbolX: 2057, symbolY: 4800, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 2250, labelY: 4892 },
{ id: 10, en: 'Bihoro', ja: '美幌', symbolX: 1922, symbolY: 4331, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1922, labelY: 4100 },
{ id: 11, en: 'Asahikawa', ja: '旭川', symbolX: 1232, symbolY: 4375, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 880, labelY: 4300 },
{ id: 12, en: 'Nayoro', ja: '名寄', symbolX: 1257, symbolY: 4067, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1265, labelY: 3830 },
{ id: 13, en: 'Soya', ja: '宗谷', symbolX: 1073, symbolY: 3439, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 848, labelY: 3340 },
{ id: 14, en: 'Ochiho', ja: '落帆', symbolX: 1534, symbolY: 2609, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1750, labelY: 2650 },
{ id: 15, en: 'Tarantomari', ja: '多蘭泊', symbolX: 1141, symbolY: 2559, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 848, labelY: 2650 },
{ id: 16, en: 'Maoka', ja: '真岡', symbolX: 1166, symbolY: 2483, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 848, labelY: 2350 },
{ id: 17, en: 'Shiraura', ja: '白浦', symbolX: 1296, symbolY: 2066, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1550, labelY: 2050 },
{ id: 18, en: 'Raichishka', ja: 'ライチシカ', symbolX: 1106, symbolY: 1602, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 721, labelY: 1642 },
{ id: 19, en: 'Nairo', ja: '内路', symbolX: 1452, symbolY: 1346, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1700, labelY: 1350 },
{ id: 20, en: 'Saru', ja: '沙流', symbolX: 1174, symbolY: 5003, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1200, labelY: 4781 },
{ id: 21, en: 'Kuril', ja: '千島', symbolX: 6769, symbolY: 317, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 6925, labelY: 444 },
{ id: 22, en: 'Shumshu', ja: '占守', symbolX: 6769, symbolY: 317, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 6925, labelY: 444 },
{ id: 23, en: 'Paramushir', ja: '幌筵', symbolX: 6625, symbolY: 422, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 6288, labelY: 410 },
{ id: 24, en: 'South Kuril', ja: '南千島', symbolX: 2981, symbolY: 4063, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 2981, labelY: 4273 },
{ id: 25, en: 'Yamambetsu', ja: '弥満別', symbolX: 1645, symbolY: 2915, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1831, labelY: 3109 },
{ id: 26, en: 'Shirahama', ja: '白浜', symbolX: 1360, symbolY: 2265, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1550, labelY: 2350 },
{ id: 27, en: 'Niitoi', ja: '新問', symbolX: 1485, symbolY: 1420, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1500, labelY: 1600 },
{ id: 28, en: 'Taraika', ja: '多来加', symbolX: 1745, symbolY: 1190, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1746, labelY: 950 },
{ id: 29, en: 'Chirai', ja: '智来', symbolX: 1160, symbolY: 2035, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 968, labelY: 2050 },
{ id: 30, en: 'Usoro', ja: '鵜城', symbolX: 1105, symbolY: 1440, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1105, labelY: 1220 },
{ id: 31, en: 'Nemuro', ja: '根室', symbolX: 2347, symbolY: 4454, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 2520, labelY: 4552 },
{ id: 32, en: 'Chitose', ja: '千歳', symbolX: 952, symbolY: 4843, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 826, labelY: 4600 },
{ id: 33, en: 'Kussharo', ja: '屈斜路', symbolX: 2035, symbolY: 4500, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 2289, labelY: 4312 },
{ id: 34, en: 'Chikabumi', ja: '近文', symbolX: 1232, symbolY: 4375, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 880, labelY: 4200 },
{ id: 35, en: 'Hobetsu', ja: '穂別', symbolX: 1145, symbolY: 4905, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1206, labelY: 4673 },
{ id: 36, en: 'Rebun', ja: '礼文', symbolX: 565, symbolY: 4995, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 400, labelY: 4802 },
{ id: 37, en: 'Ashoro', ja: '足寄', symbolX: 1724, symbolY: 4667, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1724, labelY: 4544 },
{ id: 38, en: 'Teshio', ja: '天塩', symbolX: 1039, symbolY: 3754, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 817, labelY: 3818 },
{ id: 39, en: 'Abuta', ja: '虻田', symbolX: 645, symbolY: 4920, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 729, labelY: 4759 },
{ id: 40, en: 'Shiraoi', ja: '白老', symbolX: 831, symbolY: 5014, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 734, labelY: 4821 },
{ id: 41, en: 'Tonnai', ja: '富内', symbolX: 1534, symbolY: 2609, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1750, labelY: 2650 },
{ id: 42, en: 'Harutori', ja: '春採', symbolX: 2057, symbolY: 4800, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 2057, labelY: 5009 },
{ id: 43, en: 'Tokachi', ja: '十勝', symbolX: 1768, symbolY: 4848, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1894, labelY: 5025 },
{ id: 44, en: 'Mukawa', ja: '鵡川', symbolX: 1105, symbolY: 4995, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 977, labelY: 5049 },
{ id: 45, en: 'Usu', ja: '有珠', symbolX: 635, symbolY: 5038, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 636, labelY: 4926 },
{ id: 46, en: 'Shiranuka', ja: '白糠', symbolX: 1925, symbolY: 4805, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1885, labelY: 4908 },
{ id: 47, en: 'Shizunai', ja: '静内', symbolX: 1262, symbolY: 5127, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1275, labelY: 4997 },
{ id: 48, en: 'Hidaka', ja: '日高', symbolX: 1173, symbolY: 5058, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1173, labelY: 5274 },
{ id: 49, en: 'Nijibetsu', ja: '虹別', symbolX: 2144, symbolY: 4531, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1903, labelY: 4551 },
{ id: 50, en: 'Ogifushi', ja: '荻伏', symbolX: 1381, symbolY: 5195, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1317, labelY: 5291 },
{ id: 51, en: 'Urakawa', ja: '浦河', symbolX: 1447, symbolY: 5226, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1447, labelY: 5103 },
{ id: 52, en: 'Shari', ja: '斜里', symbolX: 2162, symbolY: 4296, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 2162, labelY: 4180 },
{ id: 53, en: 'Akan', ja: '阿寒', symbolX: 1946, symbolY: 4575, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1946, labelY: 4452 },
{ id: 54, en: 'Fushiko', ja: '伏古', symbolX: 1554, symbolY: 4834, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1554, labelY: 4710 },
{ id: 55, en: 'Azuma', ja: '厚真', symbolX: 1064, symbolY: 4940, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1064, labelY: 4823 },
{ id: 56, en: 'Kitami', ja: '北見', symbolX: 1860, symbolY: 4357, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1684, labelY: 4417 },
{ id: 57, en: 'Abashiri', ja: '網走', symbolX: 1988, symbolY: 4260, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1988, labelY: 4140 },
{ id: 58, en: 'Muroran', ja: '室蘭', symbolX: 711, symbolY: 5125, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 711, labelY: 5007 },
{ id: 59, en: 'Shiranushi', ja: '白主', symbolX: 1125, symbolY: 3165, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1125, labelY: 3034 },
{ id: 60, en: 'Takashima', ja: '高島', symbolX: 1670, symbolY: 4755, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1670, labelY: 4631 },
{ id: 61, en: 'Biroo', ja: '広尾', symbolX: 1616, symbolY: 5119, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1615, labelY: 4989 },
{ id: 62, en: 'Aihama', ja: '相浜', symbolX: 1374, symbolY: 2262, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1555, labelY: 2346 },
{ id: 63, en: 'Memuro', ja: '芽室', symbolX: 1492, symbolY: 4831, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1492, labelY: 4707 },
{ id: 64, en: 'Tooro', ja: '塘路', symbolX: 2134, symbolY: 4712, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 2133, labelY: 4586 },
{ id: 65, en: 'Fupushinai', ja: '布伏内', symbolX: 1910, symbolY: 4662, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1910, labelY: 4551 },
{ id: 66, en: 'Ebeotsu', ja: '江部乙', symbolX: 1072, symbolY: 4456, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 852, labelY: 4489 },
{ id: 67, en: 'Hagino', ja: '萩野', symbolX: 828, symbolY: 5033, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 886, labelY: 5227 },
{ id: 68, en: 'Chirotto', ja: '白人', symbolX: 1626, symbolY: 4839, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1626, labelY: 4722 },
{ id: 69, en: 'Horoman', ja: '幌満', symbolX: 1510, symbolY: 5262, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1780, labelY: 5300 },
{ id: 70, en: 'Etorofu', ja: '択捉', symbolX: 3417, symbolY: 3641, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 3417, labelY: 3513 },
{ id: 71, en: 'Otofuke', ja: '音更', symbolX: 1554, symbolY: 4785, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1554, labelY: 4663 },
{ id: 72, en: 'Takae', ja: '高江', symbolX: 1265, symbolY: 5106, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1300, labelY: 5299 },
{ id: 73, en: 'Mitsuishi', ja: '三石', symbolX: 1327, symbolY: 5161, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 1293, labelY: 5358 },
{ id: 74, en: 'Mokoto', ja: '藻琴', symbolX: 2017, symbolY: 4280, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 2017, labelY: 4148 },
{ id: 75, en: 'Toyoura', ja: '豊浦', symbolX: 605, symbolY: 4994, symbolId1: 0, symbolId2: 0, symbolId3: 0, symbolId4: 0, symbolId5: 0, symbolId6: 0, symbolId7: 0, symbolId8: 0, symbolId9: 0, labelX: 605, labelY: 4883 }
]
};
// --- DOM Elements ---
const rawDataInputEl = document.getElementById('rawDataInput');
const processDataBtnEl = document.getElementById('processDataBtn');
const processingErrorEl = document.getElementById('processingError');
const symbolDataInputEl = document.getElementById('symbolDataInput');
const placementDataInputEl = document.getElementById('placementDataInput');
const copyWikiTableBtnEl = document.getElementById('copyWikiTableBtn');
const wikiTableOutputEl = document.getElementById('wikiTableOutput');
const copyLuaBtnEl = document.getElementById('copyLuaBtn');
const luaCodeOutputEl = document.getElementById('luaCodeOutput');
const langSelectorEl = document.getElementById('lang-selector');
const dropZoneEl = document.getElementById('dropZone');
const dropZoneTextEl = document.getElementById('dropZoneText');
// 初期化関数
function init() {
document.getElementById('maxDistance').value = state.maxDistance;
document.getElementById('legendX').value = state.legendX;
document.getElementById('legendY').value = state.legendY;
document.getElementById('legendSize').value = state.legendSize;
attachEventListeners();
setLanguage('ja'); // デフォルト言語を設定
updatePreview();
}
// イベントリスナー設定
function attachEventListeners() {
langSelectorEl.addEventListener('change', (e) => setLanguage(e.target.value));
document.getElementById('maxDistance').addEventListener('change', (e) => {
state.maxDistance = parseInt(e.target.value, 10);
updatePreview();
});
document.getElementById('legendX').addEventListener('change', (e) => {
state.legendX = parseInt(e.target.value, 10);
updatePreview();
});
document.getElementById('legendY').addEventListener('change', (e) => {
state.legendY = parseInt(e.target.value, 10);
updatePreview();
});
document.getElementById('legendSize').addEventListener('change', (e) => {
state.legendSize = parseInt(e.target.value, 10);
updatePreview();
});
document.getElementById('titleSettings').addEventListener('change', handleTitleChange);
// Manual load buttons
document.getElementById('loadSymbolData').addEventListener('click', () => {
loadSymbolData();
updatePreview();
});
document.getElementById('loadPlacementData').addEventListener('click', () => {
loadPlacementData();
updatePreview();
});
// Automatic processing button
processDataBtnEl.addEventListener('click', () => handleProcessData(rawDataInputEl.value));
document.getElementById('downloadSvg').addEventListener('click', downloadSvg);
document.getElementById('downloadLua').addEventListener('click', downloadLua);
// Wikipedia Table generator
copyWikiTableBtnEl.addEventListener('click', () => copyToClipboard(wikiTableOutputEl.value, copyWikiTableBtnEl));
copyLuaBtnEl.addEventListener('click', () => copyToClipboard(luaCodeOutputEl.value, copyLuaBtnEl));
// Drag and Drop
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
dropZoneEl.addEventListener(eventName, preventDefaults, false);
});
['dragenter', 'dragover'].forEach(eventName => {
dropZoneEl.addEventListener(eventName, () => dropZoneEl.classList.add('drag-over'), false);
});
['dragleave', 'drop'].forEach(eventName => {
dropZoneEl.addEventListener(eventName, () => dropZoneEl.classList.remove('drag-over'), false);
});
dropZoneEl.addEventListener('drop', handleDrop, false);
}
function preventDefaults(e) {
e.preventDefault();
e.stopPropagation();
}
// UIレンダリング関数
function renderTitleSettings() {
const container = document.getElementById('titleSettings');
container.innerHTML = state.titles.map(t => `
<div class="grid grid-cols-2 gap-x-4 gap-y-2 border-t pt-4 mt-4">
<h3 class="col-span-2">${uiStrings[t.nameKey][currentLanguage]}</h3>
<div>
<label>${uiStrings.textLabel[currentLanguage]}</label>
<input type="text" data-id="${t.id}" data-prop="text" value="${t.text}">
</div>
<div>
<label>${uiStrings.sizeLabel[currentLanguage]}</label>
<input type="number" data-id="${t.id}" data-prop="fontSize" value="${t.fontSize}">
</div>
<div>
<label>${uiStrings.xCoordLabel[currentLanguage]}</label>
<input type="number" data-id="${t.id}" data-prop="x" value="${t.x}">
</div>
<div>
<label>${uiStrings.yCoordLabel[currentLanguage]}</label>
<input type="number" data-id="${t.id}" data-prop="y" value="${t.y}">
</div>
</div>
`).join('');
}
// データ変更ハンドラ
function handleTitleChange(e) {
const { id, prop } = e.target.dataset;
const value = e.target.type === 'number' ? parseFloat(e.target.value) : e.target.value;
const title = state.titles.find(t => t.id === id);
if (title) {
title[prop] = value;
updatePreview();
}
}
function loadSymbolData() {
state.symbols = []; // Reset symbols array
const data = symbolDataInputEl.value;
const lines = data.split('\n');
lines.forEach(line => {
if (line.trim() === '') return;
const parts = line.split(/[\t,]/);
if(parts.length < 2) return;
const idStr = parts[0].trim();
const word = parts.slice(1).join(' ').trim();
const id = parseInt(idStr, 10);
if (isNaN(id) || id <= 0) return;
// Get style from prototypes, cycling if ID > prototype length
const style = SYMBOL_PROTOTYPES[(id - 1) % SYMBOL_PROTOTYPES.length];
state.symbols.push({
id: id,
word: word,
...style
});
});
}
function loadPlacementData() {
state.placements.forEach(p => {
for (let i = 1; i <= 9; i++) {
p[`symbolId${i}`] = 0;
}
});
const data = placementDataInputEl.value;
const lines = data.split('\n');
lines.forEach(line => {
if (line.trim() === '') return;
const values = line.split(/[\t,]/).map(v => parseInt(v.trim(), 10));
if (values.length < 1 || isNaN(values[0])) return;
const placementId = values[0];
const placement = state.placements.find(p => p.id === placementId);
if (placement) {
for (let i = 1; i <= 9; i++) {
placement[`symbolId${i}`] = isNaN(values[i]) ? 0 : values[i];
}
}
});
}
// --- START: DATA PROCESSING LOGIC ---
async function handleProcessData(rawData) {
if (rawData.startsWith('\uFEFF')) {
rawData = rawData.substring(1);
}
rawData = rawData.trim();
if (!rawData) {
showProcessingError(uiStrings.errorInputEmpty[currentLanguage]);
return;
}
const lines = rawData.split('\n');
// 1. Parse titles and find data start
const titleData = {};
let dataStartIndex = -1;
for (let i = 0; i < lines.length; i++) {
const line = lines[i].trim();
if (line.startsWith('id\tdata')) {
dataStartIndex = i;
break;
}
const parts = line.split('\t');
if (parts.length >= 2) {
const key = parts[0].trim();
const value = parts[1].trim();
if (key === 'en' || key === 'kana' || key === 'kanji') {
titleData[key] = value;
}
}
}
if (dataStartIndex === -1) {
showProcessingError("ヘッダー 'id\tdata' が見つかりません。");
return;
}
// 2. Update titles and font sizes
const titleMap = {
en: { id: 'english', baseSize: 550, threshold: 8 },
kana: { id: 'hiragana', baseSize: 350, threshold: 6 },
kanji: { id: 'kanji', baseSize: 550, threshold: 4 }
};
for (const [key, config] of Object.entries(titleMap)) {
const titleState = state.titles.find(t => t.id === config.id);
if (titleState && titleData[key]) {
const text = titleData[key];
titleState.text = text;
titleState.fontSize = text.length > config.threshold
? Math.floor((config.baseSize * config.threshold) / text.length)
: config.baseSize;
document.querySelector(`input[data-id="${config.id}"][data-prop="text"]`).value = titleState.text;
document.querySelector(`input[data-id="${config.id}"][data-prop="fontSize"]`).value = titleState.fontSize;
}
}
// 3. Process dialect data
const dataLines = lines.slice(dataStartIndex);
if (dataLines.length < 2) {
showProcessingError(uiStrings.errorInputShort[currentLanguage]);
return;
}
try {
hideProcessingError();
const originalData = parseInputTsv(dataLines);
const allWords = [];
const dataWithExtractedWords = originalData.map(row => {
const cleanedWords = extractAndCleanWords(row.data);
cleanedWords.forEach(cleaned => {
allWords.push({
cleaned: cleaned,
normalized: normalizeWord(cleaned)
});
});
return { id: row.id, cleanedWords: cleanedWords };
});
const { classificationTable, classificationMap } = generateClassificationTable(allWords);
const outputData = generateOutputData(dataWithExtractedWords, classificationMap);
symbolDataInputEl.value = formatForTextarea(classificationTable, '\t');
placementDataInputEl.value = formatForTextarea(outputData, '\t');
loadSymbolData();
loadPlacementData();
// 4. Adjust legend size
const legendItems = state.symbols.filter(s => s.word);
const legendCount = legendItems.length;
const maxTextLength = legendCount > 0 ? Math.max(...legendItems.map(s => s.word.length)) : 0;
const isCountLarge = legendCount >= 9;
const isTextLong = maxTextLength >= 9;
let newLegendSize = 240;
if (isCountLarge && isTextLong) {
const A = Math.max(legendCount, maxTextLength);
newLegendSize = (240 * 8) / A;
} else if (isCountLarge) {
newLegendSize = (240 * 8) / legendCount;
} else if (isTextLong) {
newLegendSize = (240 * 8) / maxTextLength;
}
state.legendSize = Math.floor(newLegendSize);
document.getElementById('legendSize').value = state.legendSize;
// 5. Update UI and generate outputs
await updatePreview();
handleGenerateWikiTable(dataLines);
generateLuaCode(dataLines);
} catch (error) {
console.error("処理中にエラーが発生しました:", error);
showProcessingError(error.message);
}
}
function formatForTextarea(data, delimiter) {
if (data.length <= 1) { // Check if only header exists or empty
return '';
}
// Skip header (index 0) and map to string
return data.slice(1)
.map(row => Object.values(row).join(delimiter))
.join('\n');
}
function parseInputTsv(lines) {
const header = lines[0].split('\t').map(h => h.trim().replace(/^"|"$/g, ''));
const idIndex = header.indexOf('id');
const dataIndex = header.indexOf('data');
if (idIndex === -1 || dataIndex === -1) {
throw new Error(uiStrings.errorHeaderNotFound[currentLanguage]);
}
return lines.slice(1).map(line => {
const firstTabIndex = line.indexOf('\t');
if (firstTabIndex === -1) return null;
const id = line.substring(0, firstTabIndex).trim();
let data = line.substring(firstTabIndex + 1).trim();
if (data.startsWith('"') && data.endsWith('"')) {
data = data.substring(1, data.length - 1);
}
return { id, data };
}).filter(Boolean);
}
function extractAndCleanWords(cellData) {
if (!cellData) return [];
const finalTokens = [];
// Replace tildes with semicolons before splitting
const processedCellData = cellData.replace(/[~~]/g, ';');
const primaryTokens = processedCellData.split(';');
primaryTokens.forEach(pToken => {
let cleanedPToken = pToken.replace(/\s*\(.*?\)/g, '').replace(/\s*\[.*?\]/g, '');
const secondaryTokens = cleanedPToken.split(',');
const hasInvalidToken = secondaryTokens.some(sToken =>
sToken.includes('《') || sToken.includes('》') ||
sToken.includes('≪') || sToken.includes('≫') ||
sToken.includes('<<') || sToken.includes('>>')
);
if (hasInvalidToken) {
return;
}
secondaryTokens.forEach(sToken => {
let currentToken = sToken;
currentToken = currentToken.replace(/[\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFFEF\u4E00-\u9FAF][\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\uFF00-\uFFEF\u4E00-\u9FAF\u3002\u3001]*/g, '');
currentToken = currentToken.trim();
if (currentToken.startsWith('-') || /^\d/.test(currentToken)) return;
currentToken = currentToken.replace(/[()\[\]]/g, '').trim();
if (!/[a-zA-Z]/.test(currentToken)) {
return;
}
if (currentToken) {
finalTokens.push(currentToken);
}
});
});
return finalTokens;
}
function normalizeWord(word) {
if (!word) return '';
return word.trim().toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/'/g, '');
}
function generateClassificationTable(allWords) {
const frequency = new Map();
allWords.forEach(word => {
frequency.set(word.normalized, (frequency.get(word.normalized) || 0) + 1);
});
let sortable = Array.from(frequency.entries()).map(([normalized, count]) => ({ normalized, count }));
sortable.sort((a, b) => (b.count - a.count) || a.normalized.localeCompare(b.normalized));
const classificationTable = [{ '記号ID': '記号ID', 'data': 'data' }];
const classificationMap = new Map();
sortable.forEach((item, index) => {
const classId = index + 1;
let displayData = (item.count > 1) ? item.normalized : (allWords.find(w => w.normalized === item.normalized)?.cleaned || item.normalized);
classificationTable.push({ '記号ID': classId, 'data': displayData });
classificationMap.set(item.normalized, classId);
});
return { classificationTable, classificationMap };
}
function generateOutputData(dataWithWords, classificationMap) {
const outputData = [{ 'id': 'id', 'data': 'data' }];
dataWithWords.forEach(row => {
const ids = row.cleanedWords
.map(word => classificationMap.get(normalizeWord(word)))
.filter(id => id !== undefined);
const uniqueSortedIds = [...new Set(ids)].sort((a, b) => a - b);
outputData.push({ 'id': row.id, 'data': uniqueSortedIds.join('\t') });
});
return outputData;
}
function showProcessingError(message) {
processingErrorEl.querySelector('span').textContent = message;
processingErrorEl.classList.remove('hidden');
}
function hideProcessingError() {
processingErrorEl.classList.add('hidden');
}
// --- END: DATA PROCESSING LOGIC ---
// --- START: WIKIPEDIA TABLE LOGIC ---
function handleGenerateWikiTable(dataLines) {
if (!dataLines) {
wikiTableOutputEl.value = uiStrings.wikiTableErrorNoData[currentLanguage];
return;
}
if (dataLines.length < 2) {
wikiTableOutputEl.value = uiStrings.wikiTableErrorShort[currentLanguage];
return;
}
try {
const tsvDataMap = new Map(parseInputTsv(dataLines).map(item => [item.id, item.data]));
let wikiText = '{| class="wikitable"\n';
wikiText += '|-\n';
wikiText += '! en !! ja !! id !! data\n';
state.placements.forEach(p => {
const data = tsvDataMap.get(String(p.id)) || '';
wikiText += '|-\n';
wikiText += `| ${p.en} || ${p.ja} || ${p.id} || ${data}\n`;
});
wikiText += '|}';
wikiTableOutputEl.value = wikiText;
} catch (error) {
console.error("Wikipedia表の生成中にエラー:", error);
wikiTableOutputEl.value = `${uiStrings.errorHeader[currentLanguage]} ${error.message}`;
}
}
function copyToClipboard(text, button) {
if (!text) return;
const textArea = document.createElement('textarea');
textArea.value = text;
textArea.style.position = 'fixed';
textArea.style.left = '-9999px';
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
document.execCommand('copy');
const originalText = button.textContent;
button.textContent = uiStrings.copySuccess[currentLanguage];
setTimeout(() => {
button.textContent = originalText;
}, 2000);
} catch (err) {
console.error('クリップボードへのコピーに失敗:', err);
}
document.body.removeChild(textArea);
}
// --- END: WIKIPEDIA TABLE LOGIC ---
// --- START: LUA CODE GENERATION ---
const luaTemplate = `local export = {}
export.gloss = ""
export.syns = {
-- Hokkaido: Southern/Central
["Abuta"] = { "" },
["Azuma"] = { "" },
["Biratori"] = { "" },
["Chitose"] = { "" },
["Ebeotsu"] = { "" },
["Hagino"] = { "" },
["Hidaka"] = { "" },
["Hobetsu"] = { "" },
["Horobetsu"] = { "" },
["Horoman"] = { "" },
["Mitsuishi"] = { "" },
["Mukawa"] = { "" },
["Muroran"] = { "" },
["Niikappu"] = { "" },
["Nukkibetsu"] = { "" },
["Ogifushi"] = { "" },
["Oshamambe"] = { "" },
["Rebun"] = { "" },
["Samani"] = { "" },
["Saru"] = { "" },
["Shiraoi"] = { "" },
["Shizunai"] = { "" },
["Takae"] = { "" },
["Takashima"] = { "" },
["Toyoura"] = { "" },
["Urakawa"] = { "" },
["Usu"] = { "" },
["Yakumo"] = { "" },
-- Hokkaido: Northern
["Asahikawa"] = { "" },
["Chikabumi"] = { "" },
["Nayoro"] = { "" },
["Soya"] = { "" },
["Teshio"] = { "" },
-- Hokkaido: Eastern
["Abashiri"] = { "" },
["Akan"] = { "" },
["Ashoro"] = { "" },
["Bihoro"] = { "" },
["Biroo"] = { "" },
["Chirotto"] = { "" },
["Fupushinai"] = { "" },
["Fushiko"] = { "" },
["Harutori"] = { "" },
["Kitami"] = { "" },
["Kushiro"] = { "" },
["Kussharo"] = { "" },
["Memuro"] = { "" },
["Mokoto"] = { "" },
["Nemuro"] = { "" },
["Nijibetsu"] = { "" },
["Obihiro"] = { "" },
["Otofuke"] = { "" },
["Shari"] = { "" },
["Shiranuka"] = { "" },
["Tokachi"] = { "" },
["Tooro"] = { "" },
-- Sakhalin: West Coast
["Chirai"] = { "" },
["Maoka"] = { "" },
["Raichishka"] = { "" },
["Shiranushi"] = { "" },
["Tarantomari"] = { "" },
["Usoro"] = { "" },
-- Sakhalin: East Coast
["Aihama"] = { "" },
["Nairo"] = { "" },
["Niitoi"] = { "" },
["Ochiho"] = { "" },
["Shirahama"] = { "" },
["Shiraura"] = { "" },
["Taraika"] = { "" },
["Tonnai"] = { "" },
["Yamambetsu"] = { "" },
-- Kuril: Northern
["Kuril"] = { "" },
["Paramushir"] = { "" },
["Shumshu"] = { "" },
-- Kuril: Southern
["Etorofu"] = { "" },
["South Kuril"] = { "" },
}
return export`;
function createRegionMap(template) {
const regionMap = new Map();
let currentRegion = 'Unknown';
const lines = template.split('\n');
for (const line of lines) {
const trimmedLine = line.trim();
if (trimmedLine.startsWith('--')) {
const regionMatch = trimmedLine.match(/-- (.*)/);
if (regionMatch && regionMatch[1]) {
currentRegion = regionMatch[1].trim();
}
} else if (trimmedLine.startsWith('["')) {
const locationMatch = trimmedLine.match(/\["(.*?)"\]/);
if (locationMatch && locationMatch[1]) {
regionMap.set(locationMatch[1], currentRegion);
}
}
}
return regionMap;
}
const regionMap = createRegionMap(luaTemplate);
function splitPronunciations(str) {
// Replace tildes and full-width tildes with semicolons before splitting
const processedStr = str.replace(/[~~]/g, ';');
const result = [];
let current = '';
let parenDepth = 0;
for (const char of processedStr) {
if (char === '(' || char === '[' || char === '≪' || char === '(') {
parenDepth++;
} else if (char === ')' || char === ']' || char === '≫' || char === ')') {
parenDepth = Math.max(0, parenDepth - 1);
}
if (char === ';' && parenDepth === 0) {
if (current.trim()) {
result.push(current.trim());
}
current = '';
} else {
current += char;
}
}
if (current.trim()) {
result.push(current.trim());
}
return result;
}
function getKatakanaConversion(rawStr, region = 'Hokkaido: Southern/Central') {
if (!rawStr || !rawStr.trim()) return { katakana: '', original: rawStr };
let s = rawStr.split(',')[0];
s = s.replace(/[\((≪\[].*?[\))≫\]]/g, '');
if (!s.trim()) return { katakana: '', original: rawStr };
// Handle long vowels with macrons before other processing
s = s.replace(/Ā/g, 'aa').replace(/ā/g, 'aa');
s = s.replace(/Ī/g, 'ii').replace(/ī/g, 'ii');
s = s.replace(/Ū/g, 'uu').replace(/ū/g, 'uu');
s = s.replace(/Ē/g, 'ee').replace(/ē/g, 'ee');
s = s.replace(/Ō/g, 'oo').replace(/ō/g, 'oo');
s = s.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
s = s.replace(/č/g, 'c');
s = s.toLowerCase();
// Handle separated vowels with a placeholder BEFORE removing other characters
s = s.replace(/([aiueo])([ '.-]+)([aiueo])/g, (match, v1, separators, v2) => {
return `${v1}|${v2}`;
});
// Now remove any remaining separators that were not between vowels
s = s.replace(/[ '.-]/g, '');
if (!s) return { katakana: '', original: rawStr };
const syllableMap = {
'ka': 'カ', 'ki': 'キ', 'ku': 'ク', 'ke': 'ケ', 'ko': 'コ',
'ga': 'ガ', 'gi': 'ギ', 'gu': 'グ', 'ge': 'ゲ', 'go': 'ゴ',
'sa': 'サ', 'si': 'シ', 'su': 'ス', 'se': 'セ', 'so': 'ソ',
'za': 'ザ', 'zi': 'ジ', 'zu': 'ズ', 'ze': 'ゼ', 'zo': 'ゾ',
'ta': 'タ', 'tu': 'トゥ', 'te': 'テ', 'to': 'ト',
'da': 'ダ', 'di': 'ヂ', 'du': 'ドゥ', 'de': 'デ', 'do': 'ド',
'ca': 'チャ', 'ci': 'チ', 'cu': 'チュ', 'ce': 'チェ', 'co': 'チョ',
'ja': 'ジャ', 'ji': 'ジ', 'ju': 'ジュ', 'je': 'ジェ', 'jo': 'ジョ',
'na': 'ナ', 'ni': 'ニ', 'nu': 'ヌ', 'ne': 'ネ', 'no': 'ノ',
'ha': 'ハ', 'hi': 'ヒ', 'hu': 'フ', 'he': 'ヘ', 'ho': 'ホ',
'ba': 'バ', 'bi': 'ビ', 'bu': 'ブ', 'be': 'ベ', 'bo': 'ボ',
'pa': 'パ', 'pi': 'ピ', 'pu': 'プ', 'pe': 'ペ', 'po': 'ポ',
'ma': 'マ', 'mi': 'ミ', 'mu': 'ム', 'me': 'メ', 'mo': 'モ',
'ya': 'ヤ', 'yu': 'ユ', 'ye': 'イェ', 'yo': 'ヨ',
'ra': 'ラ', 'ri': 'リ', 'ru': 'ル', 're': 'レ', 'ro': 'ロ',
'wa': 'ワ', 'wi': 'ウィ', 'we': 'ウェ', 'wo': 'ウォ'
};
const kurilNorthernSyllableMap = {
'sha': 'シャ', 'shi': 'シ', 'shu': 'シュ', 'she': 'シェ', 'sho': 'ショ',
'cha': 'チャ', 'chi': 'チ', 'chu': 'チュ', 'che': 'チェ', 'cho': 'チョ', 'tsu': 'ツ'
};
const vowelMap = {a: 'ア', i: 'イ', u: 'ウ', e: 'エ', o: 'オ'};
const vowels = 'aiueo';
const finalConsonantMap = {
't': 'ッ', 'p': 'ㇷ゚', 'k': 'ㇰ', 's': 'ㇱ', 'm': 'ㇺ',
'h': {'a':'ㇵ', 'i':'ㇶ', 'u':'ㇷ', 'e':'ㇸ', 'o':'ㇹ'},
'r': {'a':'ㇻ', 'i':'ㇼ', 'u':'ㇽ', 'e':'ㇾ', 'o':'ㇿ'}
};
let katakana = '';
let i = 0;
let lastVowel = '';
while (i < s.length) {
let consumed = false;
// Handle separator
if (s[i] === '|') {
lastVowel = ''; // Reset the last vowel context
i++;
continue; // Skip to the next character
}
// 1. Check for 3-char syllables
if (region === 'Kuril: Northern' && i + 2 < s.length) {
const threeChar = s.substring(i, i + 3);
if (kurilNorthernSyllableMap[threeChar]) {
katakana += kurilNorthernSyllableMap[threeChar];
lastVowel = threeChar.slice(-1);
i += 3;
consumed = true;
}
}
if (consumed) continue;
// 2. Check for 2-char syllables
if (i + 1 < s.length) {
const twoChar = s.substring(i, i + 2);
if (syllableMap[twoChar]) {
katakana += syllableMap[twoChar];
lastVowel = twoChar.slice(-1);
i += 2;
consumed = true;
}
}
if (consumed) continue;
// 3. Check for single vowels and long vowels
const char = s[i];
if (vowels.includes(char)) {
if (katakana.length > 0 && char === lastVowel) {
katakana += 'ー';
} else {
katakana += vowelMap[char];
}
lastVowel = char;
i++;
consumed = true;
}
if (consumed) continue;
// 4. Check for final consonants
if (finalConsonantMap[char]) {
if (typeof finalConsonantMap[char] === 'object') {
katakana += finalConsonantMap[char][lastVowel] || ''; // Use last vowel context
} else {
katakana += finalConsonantMap[char];
}
i++;
consumed = true;
} else if (char === 'n' || char === 'ɴ' || char === 'ŋ') {
katakana += 'ン';
i++;
consumed = true;
} else if (char === 'y') {
katakana += 'イ';
i++;
consumed = true;
} else if (char === 'w') {
katakana += 'ウ';
i++;
consumed = true;
}
if (consumed) continue;
if (!consumed) {
i++; // Failsafe
}
}
return { katakana, original: rawStr };
}
function generateLuaCode(dataLines) {
let output = luaTemplate;
if (!dataLines || dataLines.length < 2) {
luaCodeOutputEl.value = output;
return;
}
const englishTitle = state.titles.find(t => t.id === 'english')?.text || "";
output = output.replace(`export.gloss = ""`, `export.gloss = "${englishTitle.replace(/"/g, '\\"')}"`);
const tsvDataMap = new Map(parseInputTsv(dataLines).map(item => [parseInt(item.id, 10), item.data]));
const pronunciationData = new Map();
state.placements.forEach(p => {
const pronunciations = tsvDataMap.get(p.id) || '';
pronunciationData.set(p.en, pronunciations);
});
pronunciationData.forEach((pronunciations, englishName) => {
const region = regionMap.get(englishName) || 'Unknown';
let luaValue;
if (!pronunciations || pronunciations.trim() === '') {
luaValue = '{ "" }';
} else {
const rawItems = splitPronunciations(pronunciations);
const katakanaGroups = new Map();
for (const item of rawItems) {
const { katakana } = getKatakanaConversion(item, region);
if (!katakana) continue;
if (!katakanaGroups.has(katakana)) {
katakanaGroups.set(katakana, []);
}
katakanaGroups.get(katakana).push(item);
}
const finalPronunciations = [];
for (const group of katakanaGroups.values()) {
if (group.length === 1) {
finalPronunciations.push(group[0]);
} else {
const getPriority = (str) => {
if (/[úóáéí]/.test(str)) return 1;
if (/[一-龠ぁ-んァ-ヶ]/.test(str)) return 2;
if (/, -/.test(str)) return 3;
return 4;
};
const best = group.sort((a, b) => getPriority(a) - getPriority(b))[0];
finalPronunciations.push(best);
}
}
const items = finalPronunciations.map(p => {
const { katakana, original } = getKatakanaConversion(p, region);
const formatted = katakana ? `${katakana}:${original}` : original;
return `"${formatted.replace(/"/g, '\\"')}"`;
});
if (items.length > 0) {
luaValue = `{ ${items.join(", ")} }`;
} else {
luaValue = '{ "" }';
}
}
const searchRegex = new RegExp(`(\\["${englishName}"\\]\\s*=\\s*){[^}]*}`);
const replacement = `["${englishName}"]\t= ${luaValue}`;
if (output.match(searchRegex)) {
output = output.replace(searchRegex, replacement);
}
});
luaCodeOutputEl.value = output;
}
// --- END: LUA CODE GENERATION ---
// --- START: DRAG AND DROP ---
function handleDrop(e) {
let dt = e.dataTransfer;
let files = dt.files;
if (files.length > 0) {
const file = files[0];
const reader = new FileReader();
reader.onload = (event) => {
processDroppedFile(event.target.result);
};
reader.readAsText(file);
}
}
async function processDroppedFile(content) {
const lines = content.split('\n').filter(line => line.trim() !== '');
if (lines.length < 2) {
alert('ファイルにはヘッダーと少なくとも1つのデータ行が必要です。');
return;
}
const header = lines[0].split('\t').map(h => h.trim());
const dataRows = lines.slice(1);
const zip = new JSZip();
const svgFolder = zip.folder("SVG");
const luaFolder = zip.folder("Lua");
const usedFilenames = {};
dropZoneTextEl.textContent = `処理中... (0/${dataRows.length})`;
for (let i = 0; i < dataRows.length; i++) {
const row = dataRows[i].split('\t').map(d => d.trim());
if (row.length < header.length) continue;
const rowData = {};
header.forEach((h, index) => {
rowData[h] = row[index];
});
let inputString = `en\t${rowData.en || ''}\nkana\t${rowData.kana || ''}\nkanji\t${rowData.kanji || ''}\nid\tdata\n`;
for (let j = 1; j <= 75; j++) {
if (rowData[j]) {
inputString += `${j}\t${rowData[j]}\n`;
}
}
dropZoneTextEl.textContent = `処理中... (${i + 1}/${dataRows.length}): ${rowData.en}`;
await handleProcessData(inputString);
await new Promise(resolve => setTimeout(resolve, 100));
// --- SVG file logic with unique naming ---
const svgEl = document.querySelector('#svgPreview svg');
const englishTitleText = state.titles.find(t => t.id === 'english')?.text || 'Untitled';
const formattedTitle = englishTitleText.replace(/[^a-zA-Z\s]/g, '').split(' ').filter(word => word).map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join('');
const baseSvgFilename = `MapOfAinuLanguage-${formattedTitle}.svg`;
let finalSvgFilename = baseSvgFilename;
if (usedFilenames[finalSvgFilename]) {
usedFilenames[finalSvgFilename]++;
const nameParts = baseSvgFilename.split('.');
const extension = nameParts.pop();
const baseName = nameParts.join('.');
finalSvgFilename = `${baseName}${usedFilenames[finalSvgFilename]}.${extension}`;
} else {
usedFilenames[finalSvgFilename] = 1;
}
const serializer = new XMLSerializer();
let svgSource = serializer.serializeToString(svgEl);
svgSource = '<?xml version="1.0" standalone="no"?>\r\n' + svgSource;
svgFolder.file(finalSvgFilename, svgSource);
// --- Lua file logic with unique naming ---
const luaCode = luaCodeOutputEl.value;
const symbol1 = state.symbols.find(s => s.id === 1);
let baseLuaFilename = 'module.lua';
if (symbol1 && symbol1.word) {
const { katakana } = getKatakanaConversion(symbol1.word);
if (katakana) {
baseLuaFilename = `${katakana}.lua`;
}
}
let finalLuaFilename = baseLuaFilename;
if (usedFilenames[finalLuaFilename]) {
usedFilenames[finalLuaFilename]++;
const nameParts = baseLuaFilename.split('.');
const extension = nameParts.pop();
const baseName = nameParts.join('.');
finalLuaFilename = `${baseName}${usedFilenames[finalLuaFilename]}.${extension}`;
} else {
usedFilenames[finalLuaFilename] = 1;
}
luaFolder.file(finalLuaFilename, luaCode);
}
dropZoneTextEl.textContent = 'ファイルを圧縮中...';
zip.generateAsync({ type: "blob" })
.then(function(content) {
downloadFile(content, "AinuDialectMaps.zip", "application/zip");
dropZoneTextEl.textContent = uiStrings.dropZoneText[currentLanguage];
alert('一括処理が完了しました。');
});
}
// --- END: DRAG AND DROP ---
// プレビュー更新
async function updatePreview() {
const previewDiv = document.getElementById('svgPreview');
previewDiv.innerHTML = `<p class="p-4 text-gray-500">${uiStrings.previewLoading[currentLanguage]}</p>`;
try {
const generatedSvg = await generateSvg(baseMapSVG);
previewDiv.innerHTML = '';
previewDiv.appendChild(generatedSvg);
} catch (error) {
console.error('Error generating SVG:', error);
previewDiv.innerHTML = `<p class="p-4 text-red-500">${uiStrings.errorGeneric[currentLanguage]}<br>${error.message}</p>`;
}
}
// SVG生成ロジック
async function generateSvg(baseSvgText) {
const parser = new DOMParser();
const doc = parser.parseFromString(baseSvgText, "image/svg+xml");
const baseSvg = doc.documentElement;
if (baseSvg.querySelector("parsererror")) {
throw new Error("Could not parse the provided SVG content.");
}
const viewBox = baseSvg.getAttribute('viewBox') || '0 0 7200 5900';
const [,, width, height] = viewBox.split(' ');
const newSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
newSvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
newSvg.setAttribute('version', '1.1');
newSvg.setAttribute('viewBox', viewBox);
const defs = baseSvg.querySelector('defs');
if (defs) {
newSvg.appendChild(defs.cloneNode(true));
}
const bgLayer = document.createElementNS('http://www.w3.org/2000/svg', 'g');
bgLayer.innerHTML = `<rect width="${width}" height="${height}" fill="white" />`;
const areaLayer = document.createElementNS('http://www.w3.org/2000/svg', 'g');
const areaStrokeSingleLayer = document.createElementNS('http://www.w3.org/2000/svg', 'g');
const mapLayer = document.createElementNS('http://www.w3.org/2000/svg', 'g');
const symbolLayer = document.createElementNS('http://www.w3.org/2000/svg', 'g');
const labelLayer = document.createElementNS('http://www.w3.org/2000/svg', 'g');
const titleLayer = document.createElementNS('http://www.w3.org/2000/svg', 'g');
const legendLayer = document.createElementNS('http://www.w3.org/2000/svg', 'g');
Array.from(baseSvg.children).forEach(child => {
if (child.tagName.toLowerCase() === 'path' || child.tagName.toLowerCase() === 'g') {
if (child.id !== 'canvas') {
mapLayer.appendChild(child.cloneNode(true));
}
}
});
newSvg.appendChild(bgLayer);
newSvg.appendChild(areaLayer);
newSvg.appendChild(mapLayer);
newSvg.appendChild(areaStrokeSingleLayer);
newSvg.appendChild(titleLayer);
newSvg.appendChild(labelLayer);
newSvg.appendChild(symbolLayer);
newSvg.appendChild(legendLayer);
const symbolGroups = {};
state.placements.forEach(p => {
const addPoint = (symbolId, point) => {
if (symbolId <= 0 || !state.symbols.find(s => s.id === symbolId)) return;
if (!symbolGroups[symbolId]) {
symbolGroups[symbolId] = [];
}
symbolGroups[symbolId].push(point);
};
const positions = [
{ x: p.symbolX, y: p.symbolY },
{ x: p.symbolX - 80, y: p.symbolY },
{ x: p.symbolX + 80, y: p.symbolY },
{ x: p.symbolX, y: p.symbolY - 80 },
{ x: p.symbolX - 80, y: p.symbolY - 80 },
{ x: p.symbolX + 80, y: p.symbolY - 80 },
{ x: p.symbolX, y: p.symbolY + 80 },
{ x: p.symbolX - 80, y: p.symbolY + 80 },
{ x: p.symbolX + 80, y: p.symbolY + 80 },
];
for(let i = 1; i <= 9; i++) {
addPoint(p[`symbolId${i}`], positions[i-1]);
}
});
for (const symbolId in symbolGroups) {
const points = symbolGroups[symbolId];
const symbolInfo = state.symbols.find(s => s.id == symbolId);
if (!symbolInfo) continue;
const regions = findConnectedComponents(points, state.maxDistance);
regions.forEach(region => {
if (region.length === 1) {
const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
circle.setAttribute('cx', region[0].x);
circle.setAttribute('cy', region[0].y);
const fillCircle = circle.cloneNode();
fillCircle.setAttribute('r', state.maxDistance);
fillCircle.setAttribute('fill', symbolInfo.areaFill);
areaLayer.appendChild(fillCircle);
const strokeCircle = circle.cloneNode();
strokeCircle.setAttribute('r', state.maxDistance);
strokeCircle.setAttribute('fill', 'none');
strokeCircle.setAttribute('stroke', symbolInfo.areaStroke);
strokeCircle.setAttribute('stroke-width', '20');
areaStrokeSingleLayer.appendChild(strokeCircle);
} else if (region.length > 1) {
const hullPoints = getConvexHull(region);
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
let pathData = `M ${hullPoints[0].x} ${hullPoints[0].y} `;
for(let i = 0; i < hullPoints.length; i++){
const p0 = hullPoints[(i - 1 + hullPoints.length) % hullPoints.length];
const p1 = hullPoints[i];
const p2 = hullPoints[(i + 1) % hullPoints.length];
const p3 = hullPoints[(i + 2) % hullPoints.length];
const cp1x = p1.x + (p2.x - p0.x) / 6;
const cp1y = p1.y + (p2.y - p0.y) / 6;
const cp2x = p2.x - (p3.x - p1.x) / 6;
const cp2y = p2.y - (p3.y - p1.y) / 6;
pathData += `C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y} `;
}
pathData += 'Z';
path.setAttribute('d', pathData);
const strokePath = path.cloneNode();
strokePath.setAttribute('stroke', symbolInfo.areaStroke);
strokePath.setAttribute('stroke-width', state.maxDistance * 2 + 40);
strokePath.setAttribute('stroke-linejoin', 'round');
strokePath.setAttribute('fill', symbolInfo.areaStroke);
areaLayer.appendChild(strokePath);
const fillPath = path.cloneNode();
fillPath.setAttribute('stroke', symbolInfo.areaFill);
fillPath.setAttribute('stroke-width', state.maxDistance * 2);
fillPath.setAttribute('stroke-linejoin', 'round');
fillPath.setAttribute('fill', symbolInfo.areaFill);
areaLayer.appendChild(fillPath);
}
});
}
state.titles.forEach(title => {
const textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text');
textEl.setAttribute('x', title.x);
textEl.setAttribute('y', title.y);
textEl.setAttribute('font-size', `${title.fontSize}pt`);
textEl.setAttribute('text-anchor', 'middle');
textEl.setAttribute('dominant-baseline', 'middle');
textEl.setAttribute('fill', '#000000');
textEl.setAttribute('stroke', '#FFFFFF');
textEl.setAttribute('stroke-width', '25pt');
textEl.setAttribute('stroke-linejoin', 'round');
textEl.setAttribute('paint-order', 'stroke');
textEl.textContent = title.text;
titleLayer.appendChild(textEl);
});
state.placements.forEach(p => {
const drawSymbol = (symbolId, x, y) => {
if (symbolId > 0) {
const symbolInfo = state.symbols.find(s => s.id == symbolId);
if (symbolInfo) {
const symbol = createSymbol(symbolInfo, 80);
symbol.setAttribute('transform', `translate(${x}, ${y}) ${symbol.getAttribute('transform') || ''}`);
symbolLayer.appendChild(symbol);
}
}
};
const positions = [
{ x: p.symbolX, y: p.symbolY },
{ x: p.symbolX - 80, y: p.symbolY },
{ x: p.symbolX + 80, y: p.symbolY },
{ x: p.symbolX, y: p.symbolY - 80 },
{ x: p.symbolX - 80, y: p.symbolY - 80 },
{ x: p.symbolX + 80, y: p.symbolY - 80 },
{ x: p.symbolX, y: p.symbolY + 80 },
{ x: p.symbolX - 80, y: p.symbolY + 80 },
{ x: p.symbolX + 80, y: p.symbolY + 80 },
];
let hasSymbols = false;
for(let i = 1; i <= 9; i++) {
const symbolId = p[`symbolId${i}`];
if (symbolId > 0 && state.symbols.find(s => s.id === symbolId)) {
hasSymbols = true;
}
drawSymbol(symbolId, positions[i-1].x, positions[i-1].y);
}
if (hasSymbols) {
const label = document.createElementNS('http://www.w3.org/2000/svg', 'text');
label.setAttribute('x', p.labelX);
label.setAttribute('y', p.labelY - 30);
label.setAttribute('font-size', '88pt');
label.setAttribute('text-anchor', 'middle');
label.setAttribute('dominant-baseline', 'middle');
label.setAttribute('fill', '#000000');
label.setAttribute('stroke', '#FFFFFF');
label.setAttribute('stroke-width', '25pt');
label.setAttribute('stroke-linejoin', 'round');
label.setAttribute('paint-order', 'stroke');
const tspan1 = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
tspan1.textContent = p.ja;
const tspan2 = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
tspan2.textContent = p.en;
tspan2.setAttribute('x', p.labelX);
tspan2.setAttribute('dy', '106pt');
label.appendChild(tspan1);
label.appendChild(tspan2);
labelLayer.appendChild(label);
}
});
const legendSymbols = state.symbols.filter(s => s.word).sort((a, b) => a.id - b.id);
const scaleFactor = state.legendSize / 240;
const legendSpacing = 400 * scaleFactor;
legendSymbols.forEach((s, index) => {
const legendGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
const symbol = createSymbol(s, state.legendSize);
const legendX = state.legendX;
const legendY = state.legendY - (legendSymbols.length - 1 - index) * legendSpacing;
symbol.setAttribute('transform', `translate(${legendX}, ${legendY}) ${symbol.getAttribute('transform') || ''}`);
const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
text.setAttribute('x', legendX + (290 * scaleFactor));
text.setAttribute('y', legendY);
text.setAttribute('font-size', `${300 * scaleFactor}pt`);
text.setAttribute('text-anchor', 'start');
text.setAttribute('dominant-baseline', 'middle');
text.setAttribute('fill', '#000000');
text.setAttribute('stroke', '#FFFFFF');
text.setAttribute('stroke-width', `${25 * scaleFactor}pt`);
text.setAttribute('stroke-linejoin', 'round');
text.setAttribute('paint-order', 'stroke');
text.textContent = s.word;
legendGroup.appendChild(symbol);
legendGroup.appendChild(text);
legendLayer.appendChild(legendGroup);
});
return newSvg;
}
function createSymbol(symbolInfo, size) {
const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
let baseArtworkSize = 90;
const strokeWidth = 10;
let shape = document.createElementNS('http://www.w3.org/2000/svg', 'path');
const d = {
'五芒星': "M144.8,162.6c-.8,0-1.6-.2-2.3-.6l-22.4-11.8-22.4,11.8c-.7.4-1.5.6-2.3.6s-2.1-.3-2.9-1c-1.5-1.1-2.3-3-2-4.9l4.3-24.9-18.1-17.7c-1.4-1.3-1.9-3.3-1.3-5.1.6-1.8,2.2-3.1,4-3.4l25-3.6,11.2-22.7c.8-1.7,2.6-2.8,4.5-2.8h0c1.9,0,3.6,1.1,4.5,2.8l11.2,22.7,25,3.6c1.9.3,3.4,1.6,4,3.4.6,1.8,0,3.8-1.3,5.1l-18.1,17.7,4.3,24.9c.3,1.9-.4,3.8-2,4.9-.9.6-1.9,1-2.9,1Z",
'ひし形': "M120,165c-1.8,0-3.5-1-4.4-2.6l-13.4-24.6-24.6-13.4c-1.6-.9-2.6-2.6-2.6-4.4s1-3.5,2.6-4.4l24.6-13.4,13.4-24.6c.9-1.6,2.6-2.6,4.4-2.6s3.5,1,4.4,2.6l13.4,24.6,24.6,13.4c1.6.9,2.6,2.6,2.6,4.4s-1,3.5-2.6,4.4l-24.6,13.4-13.4,24.6c-.9,1.6-2.6,2.6-4.4,2.6Z",
'三角': "M80,159.6c-1.8,0-3.4-1-4.3-2.5s-.9-3.5,0-5l40-69.3c.9-1.5,2.5-2.5,4.3-2.5s3.4,1,4.3,2.5l40,69.3c.9,1.5.9,3.5,0,5s-2.5,2.5-4.3,2.5h-80Z",
'丸': "M120,165c-24.8,0-45-20.2-45-45s20.2-45,45-45,45,20.2,45,45-20.2,45-45,45Z",
'五角形': "M95.3,163c-2.2,0-4.1-1.4-4.8-3.5l-15.3-47c-.7-2.1,0-4.3,1.8-5.6l40-29.1c.9-.6,1.9-1,2.9-1s2.1.3,2.9,1l40,29.1c1.8,1.3,2.5,3.5,1.8,5.6l-15.3,47c-.7,2.1-2.6,3.5-4.8,3.5h-49.4Z",
'六芒星': "M140,159.6c-1,0-2.1-.3-3-1l-17-12.5-17,12.5c-.9.6-1.9,1-3,1s-1.7-.2-2.5-.7c-1.7-1-2.7-2.9-2.5-4.9l2.3-21-19.3-8.5c-1.8-.8-3-2.6-3-4.6s1.2-3.8,3-4.6l19.3-8.5-2.3-21c-.2-2,.8-3.9,2.5-4.9.8-.4,1.6-.7,2.5-.7s2.1.3,3,1l17,12.5,17-12.5c.9-.6,1.9-1,3-1s1.7.2,2.5.7c1.7,1,2.7,2.9,2.5,4.9l-2.3,21,19.3,8.5c1.8.8,3,2.6,3,4.6s-1.2,3.8-3,4.6l-19.3,8.5,2.3,21c.2,2-.8,3.9-2.5,4.9-.8.4-1.6.7-2.5.7Z",
'逆五芒': "M95.3,76.9c.8,0,1.6.2,2.3.6l22.4,11.8,22.4-11.8c.7-.4,1.5-.6,2.3-.6s2.1.3,2.9,1c1.5,1.1,2.3,3,2,4.9l-4.3,24.9,18.1,17.7c1.4,1.3,1.9,3.3,1.3,5.1-.6,1.8-2.2,3.1-4,3.4l-25,3.6-11.2,22.7c-.8,1.7-2.6,2.8-4.5,2.8h0c-1.9,0-3.6-1.1-4.5-2.8l-11.2-22.7-25-3.6c-1.9-.3-3.4-1.6-4-3.4s0-3.8,1.3-5.1l18.1-17.7-4.3-24.9c-.3-1.9.4-3.8,2-4.9.9-.6,1.9-1,2.9-1h0Z",
'逆ひし': "M151.8,151.8c-1.3,1.3-3.2,1.8-4.9,1.3l-26.9-7.9-26.9,7.9c-1.8.5-3.7,0-4.9-1.3s-1.8-3.2-1.3-4.9l7.9-26.9-7.9-26.9c-.5-1.8,0-3.7,1.3-4.9s3.2-1.8,4.9-1.3l26.9,7.9,26.9-7.9c1.8-.5,3.7,0,4.9,1.3s1.8,3.2,1.3,4.9l-7.9,26.9,7.9,26.9c.5,1.8,0,3.7-1.3,4.9Z",
'009': "M144.5,149.6c-1.7,0-3.2,0-4.5-.2-4.6-.3-8.6-3.6-9.6-8-.2-.9-.4-1.7-.5-2.4-.2-1.3-.4-2-.9-3.1-1.8-3.3-5.1-5.3-8.9-5.3s-7.3,1.6-9.2,6c-.3.6-.4,1.4-.6,2.3-.5,2.7-1.5,7.3-6.8,9.5-1.1.4-2.2.7-3.3.8-.1,0-.3,0-.4,0s-.2,0-.3,0c-1,0-2,0-3.1,0-1.7,0-3.4,0-5.1.1-1.8,0-3.6.1-5.4.1s-3.1,0-4.5-.1c-7-.5-11.6-6.1-11.2-13.6.8-12.5,6.5-24,16.3-32.5,9.4-8.2,21.4-12.7,33.8-12.7s2.9,0,4.3.2c24.5,2.1,44.5,22.2,45.6,45.6.2,5.1-1.9,9.3-5.7,11.3-.3.2-.6.5-1,.7,0,0,0,0-.1,0-1.4.6-2.7,1-4.1,1.2-.2,0-.3,0-.5,0s-.2,0-.3,0c-.9,0-2,0-3.1,0-1.7,0-3.4,0-5.2.1-1.8,0-3.6.1-5.5.1Z",
'010': "M119.9,149.6c-1.4,0-2.9,0-4.3-.2-24.5-2.1-44.5-22.2-45.6-45.6-.2-5.1,1.9-9.3,5.7-11.3.3-.2.6-.5,1-.7,0,0,0,0,.1,0,1.4-.6,2.7-1,4.1-1.2.2,0,.3,0,.5,0s.2,0,.3,0c.9,0,2,0,3.1,0,1.7,0,3.4,0,5.2-.1,1.8,0,3.6-.1,5.5-.1s3.2,0,4.5.2c4.6.3,8.6,3.6,9.6,8,.2.9.4,1.7.5,2.4.2,1.3.4,2,.9,3.1,1.8,3.3,5.1,5.3,8.9,5.3s7.3-1.6,9.2-6c.3-.6.4-1.4.6-2.3.5-2.7,1.5-7.3,6.8-9.5,1.1-.4,2.2-.7,3.3-.8.1,0,.3,0,.4,0s.2,0,.3,0c1,0,2,0,3.1,0,1.7,0,3.4,0,5.1-.1,1.8,0,3.6-.1,5.4-.1s3.1,0,4.5.1c7,.5,11.6,6.1,11.2,13.6-.8,12.5-6.5,24-16.3,32.5-9.4,8.2-21.4,12.7-33.8,12.7Z",
'011': "M136.7,170c-.3,0-.7,0-1.1,0-12.6-.8-24.2-6.7-32.7-16.6-9-10.4-13.5-24.2-12.3-37.8,2.1-24.5,22.2-44.5,45.6-45.6.3,0,.5,0,.8,0,4.8,0,8.6,2.1,10.5,5.7.2.3.4.6.6,1s0,0,0,.1c.6,1.4,1,2.7,1.2,4.1,0,.3,0,.5,0,.8-.1,2.6,0,5.4,0,8.3.1,3.3.2,6.7,0,10-.3,4.6-3.6,8.6-8,9.6-.9.2-1.7.4-2.4.5-1.3.2-2,.4-3.1.9-3.5,1.9-5.4,5.4-5.2,9.3.2,3.9,2.4,7.2,6,8.8.6.3,1.4.4,2.3.6,2.7.5,7.3,1.5,9.5,6.8.4,1.1.7,2.2.8,3.3,0,.2,0,.5,0,.7-.1,2.6,0,5.4,0,8.3,0,3.3.2,6.6,0,9.9-.5,6.7-5.5,11.2-12.5,11.2Z",
'012': "M103,170c-4.8,0-8.6-2.1-10.5-5.7-.2-.3-.4-.6-.6-1s0,0,0-.1c-.6-1.4-1-2.7-1.2-4.1,0-.3,0,.5,0-.8.1-2.6,0-5.4,0-8.3-.1-3.3-.2-6.7,0-10,.3-4.6,3.6-8.6,8-9.6.9-.2,1.7-.4,2.4-.5,1.3-.2,2-.4,3.1-.9,3.5-1.9,5.4-5.4,5.2-9.3-.2-3.9-2.4-7.2-6-8.8-.6-.3-1.4-.4-2.3-.6-2.7-.5-7.3-1.5-9.5-6.8-.4-1.1-.7-2.2-.8-3.3,0-.2,0-.5,0-.7.1-2.6,0-5.4,0-8.3,0-3.3-.2-6.6,0-9.9.5-6.7,5.5-11.2,12.5-11.2s.7,0,1.1,0c12.6.8,24.2,6.7,32.7,16.6,9,10.4,13.5,24.2,12.3,37.8-2.1,24.5-22.2,44.5-45.6,45.6-.3,0-.5,0-.8,0Z",
'013': "M120.1,170c-11.5,0-21.9-6.2-27.3-16.2-7.6-14.1-1.7-27.3,3.6-39,1.2-2.7,2.3-5.2,3.3-7.7,0,0,0-.2.1-.3l15.5-33.7c.2-.6.6-1.2,1.1-1.7,1-1,2.3-1.5,3.5-1.5s2,.3,2.8.9c.5.3.9.7,1.2,1.1.5.6.8,1.3,1.1,1.9,5.1,10.8,10.2,22,15,32.8l.9,1.9c2.8,6.2,5.6,12.5,7.7,18.9,3.7,10.9,2.5,20.8-3.6,29.4-5.8,8.2-14.9,13-25,13Z",
'014': "M120,170c-1,0-2-.3-2.8-.9-.5-.3-.9-.7-1.2-1.1-.5-.6-.8-1.3-1.1-2-5.1-10.8-10.2-22-15-32.8l-.9-1.9c-2.8-6.2-5.6-12.5-7.7-18.9-3.7-10.9-2.5-20.8,3.6-29.4,5.8-8.2,14.9-13,25-13s21.9,6.2,27.3,16.2c7.6,14.1,1.7,27.3-3.6,39-1.2,2.7-2.3,5.2-3.3,7.7,0,0,0,.2-.1.3l-15.5,33.7c-.2.6-.6,1.2-1.1,1.7-1,1-2.3,1.5-3.6,1.5Z",
'015': "M139.6,150.8c-8.8,0-16.9-3.7-24.8-7.2-2.7-1.2-5.2-2.3-7.7-3.3,0,0-.2,0-.3-.1l-33.7-15.5c-.6-.2-1.2-.6-1.7-1.1h0c-1.7-1.7-2-4.4-.6-6.4.4-.6.9-1,1.4-1.4.6-.4,1.1-.6,1.7-.9,10.8-5.1,22-10.2,32.8-15l1.9-.9c6.2-2.8,12.5-5.6,18.9-7.7,4.1-1.4,8.1-2.1,11.9-2.1,6.3,0,12.2,1.9,17.5,5.6,8.7,6.1,13.5,16.2,12.9,26.9-.6,10.8-6.7,20.3-16.2,25.4-4.4,2.4-9.2,3.6-14.2,3.6Z",
'016': "M100.5,150.8c-6.3,0-12.2-1.9-17.5-5.6-8.7-6.1-13.5-16.2-12.9-26.9.6-10.8,6.7-20.3,16.2-25.4,4.5-2.4,9.2-3.6,14.2-3.6,8.8,0,16.9,3.7,24.8,7.2,2.7,1.2,5.2,2.3,7.7,3.3,0,0,.2,0,.3.1l33.7,15.5c.6.2,1.2.6,1.7,1.1,1.7,1.7,2,4.4.6,6.4-.3.5-.7.9-1.1,1.2-.6.5-1.3.8-2,1.1-10.7,5.1-21.9,10.1-32.7,15l-2.1.9c-6.2,2.8-12.5,5.6-18.9,7.7-4.1,1.4-8.1,2.1-11.9,2.1Z",
'017': "M96.9,180c-.8,0-1.7-.2-2.5-.6-2.2-1.2-3.1-3.9-2.2-6.2l17-43.4h-17.2c-1.6,0-3.2-.8-4.1-2.1-.9-1.3-1.2-3-.6-4.6l21.6-59.7c.7-2,2.6-3.3,4.7-3.3,0,0,31.8-.1,31.8-.1,1.7,0,3.4.9,4.3,2.4.9,1.5,1,3.3.2,4.9l-18.8,36.5h16.7c1.9,0,3.6,1.1,4.5,2.8.8,1.7.6,3.7-.5,5.3l-51,66.2c-1,1.3-2.5,1.9-4,1.9Z",
'018': "M94.5,180c-1.7,0-3.4-.9-4.3-2.4-.9-1.5-1-3.3-.2-4.9l18.8-36.5h-16.7c-1.9,0-3.6-1.1-4.5-2.8-.8-1.7-.6-3.7.5-5.3l51-66.2c1-1.3,2.5-1.9,4-1.9s1.7.2,2.5.6c2.2,1.2,3.1,3.9,2.2,6.2l-17,43.4h17.2c1.6,0,3.2.8,4.1,2.1.9,1.3,1.2,3,.6,4.6l-21.6,59.7c-.7,2-2.6,3.3-4.7,3.3,0,0-31.8.1-31.8.1Z",
'019': "M124.8,152.9c-.6,0-1.1,0-1.7-.3l-59.7-21.6c-2-.7-3.3-2.6-3.3-4.7v-31.8c-.1-1.7.8-3.4,2.2-4.3.8-.5,1.7-.7,2.6-.7s1.6.2,2.3.6l36.5,18.8v-16.7c0-1.9,1.1-3.6,2.8-4.5.7-.3,1.5-.5,2.2-.5,1.1,0,2.2.4,3.1,1l66.2,51c2,1.5,2.5,4.3,1.3,6.4-.9,1.6-2.6,2.5-4.4,2.5s-1.2-.1-1.8-.3l-43.4-17v17.2c0,1.6-.8,3.2-2.1,4.1-.9.6-1.9.9-2.9.9Z",
'020': "M131.2,152.9c-1.1,0-2.2-.4-3.1-1l-66.2-51c-2-1.5-2.5-4.3-1.3-6.4.9-1.6,2.6,2.5-4.4,2.5s1.2.1,1.8.3l43.4,17v-17.2c0-1.6.8-3.2,2.1-4.1.9-.6,1.9-.9,2.9-.9s1.1,0,1.7.3l59.7,21.6c2,.7,3.3,2.6,3.3,4.7v31.8c.1,1.7-.8,3.4-2.2,4.3-.8.5-1.7.7-2.6.7s-1.6-.2-2.3-.6l-36.5-18.8v16.7c0,1.9-1.1,3.6-2.8,4.5-.7.3-1.5.5-2.2.5Z",
'021': "M144.1,165c-1.5,0-2.9-.6-4.2-1.9-.9-.9-1.8-2-2.6-3-.5-.6-1-1.2-1.4-1.7-2.2-2.5-4.3-4.9-6.5-7.4-3.1-3.5-6.2-7.1-9.4-10.7-3.4,3.8-6.7,7.7-10,11.4-3.2,3.7-6.5,7.5-9.8,11.2-1.1,1.2-2.6,2-4.2,2-1.5,0-3-.6-4-1.7-1-1.1-1.6-2.5-1.5-4v-76.7c0-.1,0-.3,0-.4.3-4,3-6.7,6.9-7.1.2,0,.3,0,.5,0,0,0,44,0,44,0,.1,0,.3,0,.4,0,3.8.3,6.7,3,7,6.6,0,.2,0,.3,0,.5v77.5c0,.8-.2,1.5-.6,2.2-.9,1.9-2.8,3.1-4.8,3.1Z",
'022': "M98,165c-.1,0-.3,0-.4,0-3.8-.3-6.7-3-7-6.6,0-.2,0-.3,0-.5v-77.5c0-.8.2-1.5.6-2.2.9-1.9,2.8-3.1,4.8-3.1s2.9.6,4.2,1.9c.9.9,1.8,2,2.6,3,.5.6,1,1.2,1.4,1.7,2.2,2.5,4.3,4.9,6.5,7.4,3.1,3.5,6.2,7.1,9.4,10.7,3.4-3.8,6.7-7.7,10-11.4,3.2-3.7,6.5-7.5,9.8-11.2,1.1-1.2,2.6-2,4.2-2s3,.6,4,1.7c1,1.1,1.6,2.5,1.5,4v76.7c0,.1,0,.3,0,.4-.3,4-3,6.7-6.9,7.1-.2,0-.3,0-.5,0,0,0-44,0-44,0Z",
'023': "M82.5,149.5c-.1,0-.3,0-.4,0-4-.3-6.7-3-7.1-6.9,0-.2,0-.3,0-.5v-44c0-.1,0-.3,0-.4.3-3.8,3-6.7,6.6-7,.2,0,.3,0,.5,0s77.5,0,77.5,0c.8,0,1.5.2,2.2.5,1.6.8,2.7,2.3,3,4,.2,1.3,0,3.2-1.8,5-.9.9-2,1.8-3,2.6-.6.5-1.2,1-1.7,1.4-2.5,2.2-5,4.4-7.5,6.5-3.5,3.1-7.1,6.2-10.6,9.3,3.8,3.4,7.7,6.7,11.4,10,3.7,3.2,7.5,6.5,11.2,9.8,1.7,1.5,2.4,3.9,1.7,6-.8,2.2-2.9,3.7-5.3,3.7s-76.8,0-76.8,0Z",
'024': "M80.3,149.4c-.8,0-1.5-.2-2.2-.5-1.6-.8-2.7-2.3-3-4-.2-1.3,0-3.2,1.8-5,.9-.9,2-1.8,3-2.6.6-.5,1.2-1,1.7-1.4,2.5-2.2,4.9-4.3,7.4-6.5,3.5-3.1,7.1-6.2,10.7-9.4-3.8-3.4-7.7-6.7-11.4-10-3.7-3.2-7.5-6.5-11.2-9.8-1.7-1.5-2.4-3.9-1.7-6,.8-2.2,2.9-3.7,5.3-3.7s76.8,0,76.8,0c.1,0,.3,0,.4,0,4,.3,6.7,3,7.1,6.9,0,.2,0,.3,0,.5v44c0,.1,0,.3,0,.4-.3,3.8-3,6.7-6.6,7-.2,0-.3,0-.5,0s-77.5,0-77.5,0Z",
'025': "M120,161.6c-1.3,0-2.5-.5-3.5-1.4-4.3-4.2-8.8-8.6-13.3-12.9-1.6-1.5-3.2-3-4.9-4.6-10.5-9.6-22.3-20.4-23.3-36.8-.8-14.5,9.9-26.6,24.4-27.6.6,0,1.2,0,1.7,0,6.9,0,13.4,2.8,18.9,7.9h.1c0-.2.2-.3.3-.4,5.5-4.9,11.9-7.4,18.7-7.4s15.2,3.5,20.1,9.6c5.1,6.4,6.9,14.7,5,23.5-2.8,12.8-10.9,20.4-18.7,27.7-1,1-2.1,2-3.1,3l-18.9,18.1c-1,.9-2.2,1.4-3.5,1.4Z",
'026': "M138.8,161.6c-6.9,0-13.4-2.8-18.9-7.9h-.1c0,.2-.2.3-.3.4-5.5,4.9-11.9,7.4-18.7,7.4s-15.2-3.5-20.1-9.6c-5.1-6.4-6.9-14.7-5-23.5,2.8-12.8,10.9-20.4,18.7-27.7,1-1,2.1-2,3.1-3l18.9-18.1c1-.9,2.2-1.4,3.5-1.4s2.5.5,3.5,1.4c4.3,4.2,8.8,8.6,13.3,12.9,1.6,1.5,3.2,3,4.9,4.6,10.5,9.6,22.3,20.4,23.3,36.8.8,14.5-9.9,26.6-24.4,27.6-.6,0-1.2,0-1.7,0Z",
'027': "M104.5,165c-13.9,0-25.1-10.5-26-24.4-.5-7.4,2.3-14.7,7.8-20.7h-.2c0-.2-.2-.3-.3-.4-7.5-8.5-9.5-19.7-5.2-29.3,4.2-9.4,13.4-15.2,23.9-15.2s4.5.3,6.8.8c12.8,2.8,20.4,10.9,27.7,18.7,1,1,2,2.1,3,3.1l18.1,18.9c1.9,1.9,1.9,5,0,7-4.2,4.3-8.6,8.8-12.9,13.3-1.5,1.6-3,3.2-4.6,4.9-9.6,10.5-20.4,22.3-36.8,23.3-.5,0-1,0-1.5,0Z",
'028': "M135.4,165c-2.2,0-4.5-.3-6.8-.8-12.8-2.8-20.4-10.9-27.7-18.7-1-1-2-2.1-3-3.1l-18.1-18.9c-1.9-1.9-1.9-5,0-7,4.2-4.3,8.6-8.8-12.9,13.3-1.5-1.6-3-3.2-4.6-4.9,9.6-10.5,20.4-22.3,36.8-23.3.5,0,1,0,1.5,0,13.9,0,25.1,10.5,26,24.4.5,7.4-2.3,14.7-7.8,20.7h.2c0,.2.2.3.3.4,7.5,8.5,9.5,19.7,5.2,29.3-4.2,9.4-13.4,15.2-23.9,15.2Z",
'029': "M112,161.9c-2.8,0-5-2.2-5-5v-33.8l-30.9-36.8c-1.2-1.5-1.5-3.6-.7-5.3.8-1.8,2.6-2.9,4.5-2.9h20.1c1.5,0,2.9.7,3.9,1.9,2.1,2.6,4.3,5.3,6.5,7.9,2.8,3.3,5.6,6.6,8.3,10l1.2,1.4c2.9-3.5,5.9-7,8.7-10.5,2.5-3,4.9-5.9,7.4-8.9.9-1.1,2.4-1.8,3.8-1.8h20c1.6,0,3,.7,4,2,.9,1.2,1.3,2.8.9,4.3-.3,1.2-1,1.9-1.2,2.2-.2.3-.9,1.1-.9,1.1-4.4,5.3-9,10.7-13.4,15.9-5.4,6.4-11,13-16.4,19.6v.2c0,3.1,0,6.2,0,9.3,0,2.5,0,5.1,0,7.6,0,5.5,0,10.9,0,16.4,0,.7-.2,1.5-.5,2.1v.2c-.9,1.7-2.7,2.9-4.6,2.9h-15.9Z",
'030': "M139.9,161.9c-1.5,0-2.9-.7-3.9-1.9-2.1-2.6-4.3-5.3-6.5-7.9-2.8-3.3-5.6-6.6-8.3-10l-1.2-1.4c-2.9,3.5-5.9,7-8.7,10.5-2.5-3-4.9-5.9-7.4-8.9-.9,1.1-2.4,1.8-3.8,1.8h-20c-1.6,0-3-.7-4-2-.9-1.2-1.3-2.8-.9-4.3.3-1.2,1-1.9,1.2-2.2.2-.3.9-1.1.9-1.1,4.4-5.3,9-10.7,13.4-15.9,5.4-6.4,11-13,16.4-19.6v-.2c0-3.1,0-6.2,0-9.3,0-2.5,0-5.1,0-7.6,0-5.5,0-10.9,0-16.4,0-.7.2-1.5.5-2.1v-.2c.9-1.7,2.7-2.9,4.6-2.9h15.9c2.8,0,5,2.2,5,5v33.8l30.9,36.8c1.2,1.5,1.5,3.6.7,5.3-.8,1.8-2.6,2.9-4.5,2.9h-20.1Z",
'031': "M83.1,165c-.7,0-1.4-.2-2.1-.5-1.8-.8-2.9-2.6-2.9-4.5v-20.1c0-1.5.7-2.9,1.9-3.9,2.6-2.1,5.3-4.3,7.9-6.5,3.3-2.8,6.6-5.6,10-8.3l1.4-1.2c-3.5-2.9-7-5.9-10.5-8.7-3-2.5-5.9-4.9-8.9-7.4-1.1-.9-1.8-2.4-1.8-3.8v-20c0-1.6.7-3,2-4,.9-.7,2-1,3-1s.9,0,1.3.2c1.2.3,1.9,1,2.2,1.2.3.2,1.1.9,1.1.9,5.3,4.4,10.7,9,15.9,13.4,6.4,5.4,13,11,19.6,16.4h.2c2.2,0,4.5,0,6.7,0h2.6c2.5,0,5.1,0,7.6,0,4.1,0,8.3,0,12.4,0s2.7,0,4,0c.7,0,1.5.2,2.1.5h.2c1.7.9,2.9,2.7,2.9,4.6v15.9c0,2.8-2.2,5-5,5h-33.8l-36.8,30.9c-.9.8-2.1,1.2-3.2,1.2Z",
'032': "M156.9,165c-.4,0-.9,0-1.3-.2-1.2-.3-1.9-1-2.2-1.2-.3-.2-1.1-.9-1.1-.9-5.3-4.4-10.7-9-15.9-13.4-6.4-5.4-13-11-19.6-16.4h-.2c-2.2,0-4.5,0-6.7,0h-2.6c-2.5,0-5.1,0-7.6,0-4.1,0-8.3,0-12.4,0s-2.7,0-4,0c-.7,0-1.5-.2-2.1-.5h-.2c-1.7-.9-2.9-2.7-2.9-4.6v-15.9c0-2.8,2.2-5,5-5h33.8l36.8-30.9c.9-.8,2.1-1.2,3.2-1.2s1.4.2,2.1.5c1.8.8,2.9,2.6,2.9,4.5v20.1c0,1.5-.7,2.9-1.9,3.9-2.3,1.8-4.8,3.9-7.9,6.5-3.3,2.8-6.6,5.6-10,8.3l-1.4,1.2c3.5,2.9,7,5.9,10.5,8.7,3,2.5,5.9,4.9,8.9,7.4,1.1.9,1.8,2.4,1.8,3.8v20c0,1.6-.7,3-2,4-.9.7-2,1-3,1Z",
'033': "M95.5,180c-1.3,0-5.7-.5-7.5-7.2-.8-2.9-.8-6.6,0-9.5l24.4-96.1c1.8-6.7,6.2-7.2,7.5-7.2s5.7.5,7.5,7.2l24.5,96.2c.8,2.9.8,6.5,0,9.4-1.8,6.7-6.2,7.2-7.5,7.2h-48.9Z",
'034': "M120,180c-1.3,0-5.7-.5-7.5-7.2l-24.5-96.2c-.8-2.9-.8-6.5,0-9.4,1.8-6.7,6.2-7.2,7.5-7.2h48.9c1.3,0,5.7.5,7.5,7.2.8,2.9.8,6.6,0,9.5l-24.4,96.1c-1.8,6.7-6.2,7.2-7.5,7.2Z",
'035': "M168.1,152.5c-1.7,0-3.3-.2-4.7-.6l-96.1-24.4c-6.7-1.8-7.2-6.2-7.2-7.5s.5-5.7,7.2-7.5l96.2-24.5c1.4-.4,3-.6,4.7-.6s3.3.2,4.7.6c6.7,1.8,7.2,6.2,7.2,7.5v48.9c0,1.3-.5,5.7-7.2,7.5-1.4.4-3.1.6-4.7.6Z",
'036': "M71.9,152.5c-1.7,0-3.3-.2-4.7-.6-6.7-1.8-7.2-6.2-7.2-7.5v-48.9c0-1.3.5-5.7,7.2-7.5,1.4-.4,3.1-.6,4.7-.6s3.3.2,4.7.6l96.1,24.4c6.7,1.8,7.2,6.2,7.2,7.5s-.5,5.7-7.2,7.5l-96.2,24.5c-1.4.4-3,.6-4.7.6Z",
'037': "M108,165c-2.5,0-4.6-1.9-5-4.3,0-.2,0-.5,0-.7h0c0-1.7.8-3.3,2.1-4.2.4-.3.8-.6,1.2-.9-1,.1-2.1.2-3.1.2-11.3,0-21-8.1-23.2-19.2-3-15.8,8.6-26.6,17.9-35.3,1.7-1.5,3.2-3,4.6-4.4,5.3-5.3,9.1-10.5,11.7-15.9,0-.2.2-.4.3-.6.2-.5.4-1,.7-1.6,1.3-2.5,3.2-3,4.6-3s3,.7,3.9,1.9c.4.6.8,1.2.9,1.9,2.2,5,5.5,9.9,9.8,14.6,2,2.2,4.4,4.4,6.9,6.7,10,9.3,22.4,20.9,18,37.4-2.7,10.3-12.1,17.6-22.9,17.6-1,0-2,0-2.9-.2l1.4,1.2c1.6,1.3,2.2,3.6,1.5,5.5-.7,2-2.6,3.3-4.7,3.3h-23c-.3,0-.6,0-.9,0Z",
'038': "M120,165c-1.5,0-3-.7-3.9-1.9-.4-.6-.8-1.2-.9-1.9-2.2-5-5.5-9.9-9.8-14.6-2-2.2-4.4-4.4-6.9-6.7-10-9.3-22.4-20.9-18-37.4,2.7-10.3,12.1-17.6,22.9-17.6s2,0,2.9.2l-1.4-1.2c-1.6-1.3-2.2-3.6-1.5-5.5.7-2,2.6-3.3,4.7-3.3h23c.3,0,.6,0,.9,0,2.5,0,4.6,1.9,5,4.3,0,.2,0,.5,0,.7h0c0,1.7-.8,3.3-2.1,4.2-.4.3-.8.6-1.2.9,1-.1,2.1-.2,3.1-.2,11.3,0,21,8.1,23.2,19.2,3,15.8-8.6,26.6-17.9,35.3-1.7,1.5-3.2,3-4.6,4.4-5.3,5.3-9.1,10.5-11.7,15.9,0,.2-.2.4-.3.6-.2.5-.4,1-.7,1.6-1.3,2.5-3.2,3-4.6,3h0Z",
'039': "M130.9,160.4c-13.2,0-22.7-10.2-30.3-18.4-1.5-1.7-3-3.2-4.4-4.7-5.3-5.3-10.5-9.1-15.9-11.7-.2,0-.4-.2-.6-.3-.5-.2-1-.4-1.6-.7-3.6-1.9-3-5.2-2.9-5.8.5-1.8,1.9-3.2,3.7-3.7,5-2.2,9.9-5.5,14.6-9.8,2.2-2,4.4-4.4,6.7-6.9,8.3-8.9,17.6-18.9,30.8-18.9s4.4.3,6.6.9c7.5,2,13.6,7.6,16.2,15,1.3,3.5,1.6,7.3,1.2,10.9l1.2-1.5c1-1.2,2.4-1.8,3.9-1.8s1.1,0,1.7.3c2,.7,3.3,2.6,3.3,4.7v23c.1.8.1,1.5-.1,2.3-.5,1.9-2.2,3.3-4.1,3.6-.2,0-.5,0-.7,0h-.1c-1.6,0-3.2-.8-4.1-2.1-.3-.4-.6-.8-.9-1.2.7,5.7-.5,11.3-3.7,16.1-3.5,5.3-9,8.9-15.3,10.1-1.7.3-3.3.5-5,.5Z",
'040': "M109.1,160.4c-2.2,0-4.4-.3-6.6-.9-7.5-2-13.6-7.6-16.2-15-1.3-3.5-1.6-7.3-1.2-10.9l-1.2,1.5c-1,1.2-2.4,1.8-3.9,1.8s-1.1,0-1.7-.3c-2-.7-3.3-2.6-3.3-4.7v-23c-.1-.8-.1-1.6.1-2.3.5-1.9,2.2-3.3,4.1-3.6.2,0,.5,0,.7,0h.1c1.6,0,3.2.8,4.1,2.1.3.4.6.8.9,1.2-.7-5.7.5-11.3,3.7-16.1,3.5-5.3,9-8.9,15.3-10.1,1.7-.3,3.3-.5,5-.5,13.2,0,22.7-10.2,30.3-18.4,1.5,1.7,3,3.2,4.4,4.6,5.3,5.3,10.5,9.1,15.9,11.7.2,0,.4.2.6.3.5.2,1,.4,1.6.7,3.6,1.9,3,5.2,2.9,5.8-.5,1.8-1.9,3.2-3.7,3.7-5,2.2-9.9,5.5-14.6,9.8-2.2,2-4.4,4.4-6.7,6.9-8.3,8.9-17.6,18.9-30.8,18.9h0Z",
'041': "M119.9,165c-.5,0-.9,0-1.4-.2-.3,0-.7-.2-1-.4-11.4-6-20.5-14.5-26.4-24.6-5.6-9.8-7.7-19.9-9-28.6-.9-6-1.5-12.4-1.9-19.5,0-1.4.4-2.8,1.5-3.8.6-.6,1.5-1.1,2.3-1.3,11.5-2.9,23.1-6.2,34.4-9.8.5-.2,1.1-.2,1.6-.2s.9,0,1.4.2l34.7,10c2.3.7,3.8,2.8,3.6,5.2-.6,8.5-1.3,16.9-2.9,25.2-2.2,11.4-5.8,20.3-11.5,28.1-5.6,7.6-13.6,14.5-22.1,18.9-.7.4-1.8,1-3.2,1Z",
'042': "M120,165c-.5,0-.9,0-1.4-.2l-34.7-10c-2.3-.7-3.8-2.8-3.6-5.2.6-8.5,1.3-16.9,2.9-25.2,2.2-11.4,5.8-20.3,11.5-28.1,5.6-7.6,13.6-14.5,22.1-18.9.7-.4,1.8-1,3.2-1s.9,0,1.3.2c.3,0,.7.2,1,.4,11.4,6,20.5,14.5,26.4,24.6,5.6,9.8,7.7,19.9,9,28.6.9,6,1.5,12.4,1.9,19.5,0,1.4-.4,2.8-1.5,3.8-.6.6-1.5,1.1-2.3,1.3-11.6,2.9-23.1,6.2-34.4,9.8,0,0,0,0,0,0-.5.2-1,.2-1.5.2Z",
'043': "M90.6,160.5c-1.3,0-2.6-.5-3.5-1.5h0c-.6-.6-1.1-1.4-1.3-2.3-2.9-11.5-6.2-23.1-9.8-34.4-.2-.5-.3-1.1-.3-1.6s0-.9.2-1.4l10-34.7c.6-2.2,2.6-3.6,4.8-3.6s.2,0,.4,0c8.5.6,16.9,1.3,25.2,2.9,11.4,2.2,20.3,5.8,28.1,11.5,7.6,5.6,14.5,13.6,18.9,22.1.5.9,1.4,2.5.8,4.6,0,.3-.2.7-.4,1-6,11.4-14.5,20.5-24.6,26.4-9.8,5.6-19.9,7.7-28.6,9-6,.9-12.4,1.5-19.5,1.9,0,0-.2,0-.3,0Z",
'044': "M149.3,160.5c-.1,0-.2,0-.4,0-8.5-.6-16.9-1.3-25.2-2.9-11.4-2.2-20.3-5.8-28.1-11.5-7.6-5.6-14.5-13.6-18.9-22.1-.5-.9-1.4-2.5-.8-4.6,0,.3-.2.7-.4,1-6,11.4-14.5,20.5-24.6,26.4-9.8,5.6-19.9,7.7-28.6,9-6,.9-12.4,1.5-19.5,1.9,0,0-.2,0-.3,0,1.3,0,2.6.5,3.5,1.5.6.6,1.1,1.5,1.3,2.3,2.9,11.5,6.2,23.1,9.8,34.4.2.5.3,1.1.3,1.6s0,.9-.2,1.4l-10,34.7c-.6,2.2-2.6,3.6-4.8,3.6Z",
'045': "M133.2,170c-.1,0-.3,0-.4,0h-25.8c-3.6,0-7.7-3.2-7.7-7.4v-36.8c-.6,0-1.2,0-1.8,0-1.8,0-3.6.1-5.4.1s-2.9,0-4.1-.1c-4.5-.4-6.4-2.8-7.1-4.2-1.3-2.6-.9-5.7,1-8.7.7-1.1,1.7-2.3,2.5-3.3.3-.4.7-.8,1-1.2,4.5-5.8,9-11.6,13.5-17.2,4.5-5.7,9.2-11.7,13.7-17.5,1.8-2.3,4.6-3.7,7.6-3.7s5.9,1.4,7.6,3.8l30,38.4c2.1,2.4,2.6,6.1,1.2,9-1.3,2.9-4,4.6-7.1,4.6h-10.9v36.6c0,4.3-4.1,7.5-7.8,7.5Z",
'046': "M119.8,170c-3,0-5.9-1.4-7.6-3.8l-30-38.4c-2.1-2.4-2.6-6.1-1.2-9,1.3-2.9,4-4.6,7.1-4.6h10.9v-36.6c0-4.3,4.1-7.5,7.8-7.5s.3,0,.4,0h25.8c3.6,0,7.7,3.2,7.7,7.4v36.8c.6,0,1.2,0,1.8,0,1.8,0,3.6-.1,5.4-.1s2.9,0,4.1.1c4.5.4,6.4,2.8,7.1,4.2,1.3,2.6.9,5.7-1,8.7-.7,1.1-1.7,2.3-2.5,3.3-.3.4-.7.8-1,1.2-4.5,5.8-9,11.6-13.5,17.2-4.5,5.7-9.2,11.7-13.7,17.5-1.8,2.3-4.6,3.7-7.6,3.7Z",
'047': "M118.4,159.8c-1.8,0-3.6-.6-5.4-1.7-1.1-.7-2.3-1.7-3.3-2.5-.4-.3-.8-.7-1.2-1-5.8-4.5-11.6-9-17.2-13.5-5.7-4.5-11.7-9.2-17.5-13.7-2.3-1.8-3.7-4.7-3.7-7.7,0-3,1.5-5.8,3.8-7.5l38.4-30c1.5-1.3,3.5-2,5.5-2,4.6,0,8.2,3.5,8.2,7.9v10.9h36.6c2,0,3.9.9,5.4,2.6,1.4,1.6,2.2,3.7,2.1,5.6v25.8c0,3.6-3.2,7.7-7.4,7.7h-36.8c0,.6,0,1.2,0,1.8.1,3.2.2,6.5,0,9.5-.4,5.4-4.1,7.8-7.5,7.8Z",
'048': "M122.3,159.8c-4.6,0-8.2-3.5-8.2-7.9v-10.9h-36.6c-2,0-3.9-.9-5.4-2.6-1.4-1.6-2.2-3.7-2.1-5.6v-25.8c0-3.6,3.2-7.7,7.4-7.7h36.8c0-.6,0-1.2,0-1.8-.1-3.2-.2-6.5,0-9.5.4-5.4,4.1-7.8,7.5-7.8s3.6.6,5.4,1.7c1.1.7,2.3,1.7,3.3,2.5.4.3.8.7,1.2,1,5.8,4.5,11.6,9,17.2,13.5,5.7,4.5,11.7,9.2,17.5,13.7,2.3,1.8,3.7,4.7,3.7,7.7,0,3-1.5,5.8-3.8,7.5l-38.4,30c-1.5,1.3-3.5,2-5.5,2Z",
'049': "M111,164c-2.8,0-5-2.2-5-5v-33.1l-33.7-28.7c-.6-.5-1-1.1-1.3-1.8l-.4-.9c-.3-.8-.5-1.6-.4-2.4.1-1.2,0-2.6,0-4.1,0-2-.2-4,0-6,.4-3.4,3.3-5.9,6.7-6h86.5c.4,0,.9,0,1.3.2,2.9.8,5,3.2,5.3,6.2,0,.2,0,.5,0,.7,0,1.2,0,2.4,0,3.8v.3c0,.8,0,2.4,0,4.7,0,2.4-.9,4.3-2.4,5.7-.3.2-.6.4-.9.6l-32.7,27.7v21.4c0,.1,0,.3,0,.4-.3,3.3-2.2,4.7-3.2,5.4-2.8,1.9-5.8,3.6-8.6,5.2-2.8,1.6-5.4,3-7.8,4.7-.5.3-1,.6-1.6.7h-.4c-.4.2-.8.3-1.3.3h0Z",
'050': "M76.6,164c-.4,0-.9,0-1.3-.2-2.9-.8-5-3.2-5.3-6.2,0-.2,0-.5,0-.7,0-1.2,0-2.4,0-3.8v-.3c0-.8,0-2.4,0-4.7,0-2.4.9-4.3,2.4-5.7.3-.2.6-.4.9-.6l32.7-27.7v-21.4c0-.1,0-.3,0-.4.3-3.3,2.2-4.7,3.2-5.4,2.8-1.9,5.8-3.6,8.6-5.2,2.8-1.6,5.4-3,7.8-4.7.5-.3,1-.6,1.6-.7h.4c.4-.2.8-.3,1.3-.3,2.8,0,5,2.2,5,5v33.1l33.7,28.7c.6.5,1,1.1,1.3,1.8l.4.9c.3.8.5,1.6.4,2.4-.1,1.2,0,2.6,0,4.1,0,2,.2,4,0,6-.4,3.4-3.3,5.9-6.7,6h-86.5Z",
'051': "M84.8,170c-1.1,0-2,0-2.8-.2-3.4-.4-5.9-3.3-6-6.7v-86.5c0-.4,0-.9.2-1.3.8-2.9,3.2-5,6.2-5.3.2,0,.3,0,.5,0s.1,0,.2,0c.4,0,.8,0,1.2,0,.8,0,1.7,0,2.5,0h.3c.3,0,.7,0,1.4,0s1.8,0,3.3,0c2.4,0,4.3.9,5.7,2.4.2.3.4.6.6.9l27.7,32.7h21.4c.1,0,.3,0,.4,0,3.3.3,4.7,2.2,5.4,3.2,1.9,2.8,3.6,5.8,5.2,8.6,1.6,2.8,3,5.4,4.7,7.8.3.5.6,1,.7,1.6v.4c.2.4.3.8.3,1.3,0,2.8-2.2,5-5,5h-33.1l-28.7,33.7c-.5.6-1.1,1-1.8,1.3l-.9.4c.6-.3,1.3-.4,2-.4s-.3,0-.5,0c-.4,0-.8,0-1.4,0-.8,0-1.8,0-2.7,0-1,0-2.1.1-3.2.1Z",
'052': "M151.5,170c-.8,0-1.8,0-3.3,0-2.4,0-4.3-.9-5.7-2.4-.2-.3-.4-.6-.6-.9l-27.7-32.7h-21.4c-.1,0-.3,0-.4,0-3.3-.3-4.7-2.2-5.4-3.2-1.9-2.8-3.6-5.8-5.2-8.6-1.6-2.8-3-5.4-4.7-7.8-.3-.5-.6-1-.7-1.6v-.4c-.2-.4-.3-.8-.3-1.3,0-2.8,2.2-5,5-5h33.1l28.7-33.7c.5-.6,1.1-1,1.8-1.3l.9-.4c.6-.3,1.3-.4,2-.4s.3,0,.5,0c.4,0,.8,0,1.4,0,.8,0,1.8,0,2.7,0,1,0,2.1-.1,3.2-.1s2,0,2.8.2c3.4.4,5.9,3.3,6,6.7v86.5c0,.4,0,.9-.2,1.3-.8,2.9-3.2,5-6.2,5.3-.2,0-.3,0-.5,0s-.1,0-.2,0c-.4,0-.8,0-1.2,0-.8,0-1.7,0-2.5,0h-.3c-.3,0-.7,0-1.4,0Z",
'053': "M106.1,175c-4.1,0-7.8-2.7-9-6.7-1.3-4.2.3-8.5,4.1-11,1.1-.7,2.2-1.3,3.3-1.9.9-.5,1.7-.9,2.4-1.4,9.4-6.2,15.8-14.6,18.3-23.8-1.2.2-2.3.4-3.5.5-1.1,0-2.1.1-3.2.1-9.6,0-18.2-3.5-24.3-10-6.1-6.4-9.2-15.3-8.8-24.9.9-17.6,15.2-30.9,33.2-30.9s12.7,1.8,18.2,5.2c23.7,14.8,20.4,52,8.8,73.2-9.8,17.9-16.4,21.2-25.5,25.8-1.2.6-2.5,1.2-3.8,2l-.6.3c-1.9,1-4.4,2.3-6.4,2.9-1,.3-2.1.5-3.1.5Z",
'054': "M121.3,175c-6.4,0-12.7-1.8-18.2-5.2-23.7-14.8-20.4-52-8.8-73.2,9.8-17.9,16.4-21.2,25.5-25.8,1.2-.6,2.5-1.2,3.8-2l.6-.3c1.9-1,4.4-2.3,6.4-2.9,1-.3,2.1-.5,3.1-.5,4.1,0,7.8,2.7,9,6.7,1.3,4.2-.3,8.5-4.1,11-1.1.7-2.2,1.3-3.3,1.9-.9.5-1.7.9-2.4,1.4-9.4,6.2-15.8,14.6-18.3,23.8,1.2-.2,2.3-.4,3.5-.5,1.1,0,2.1-.1,3.2-.1,9.6,0,18.2,3.5,24.3,10,6.1,6.4,9.2,15.3,8.8,24.9-.9,17.6-15.2,30.9-33.2,30.9Z",
'055': "M97.9,154.5c-.6,0-1.3,0-1.9,0-11.5-.6-21.6-7-27-17.3-5.6-10.7-5.1-23.8,1.3-34.1,7.1-11.4,20.4-17.6,37.4-17.6s25.6,3.3,35.8,8.9c17.9,9.8,21.2,16.4,25.8,25.5.6,1.2,1.2,2.5,2,3.8l.3.6c1,1.9,2.3,4.4,2.9,6.4,1,3.1.5,6.2-1.3,8.7-1.8,2.4-4.6,3.8-7.7,3.8s-6.3-1.6-8.2-4.5c-.7-1.1-1.3-2.2-1.9-3.3-.5-.9-.9-1.7-1.4-2.4-6.2-9.4-14.6-15.8-23.8-18.3.2,1.2.4,2.3.5,3.5.8,10-2.2,19.3-8.4,26.1-6.1,6.6-14.7,10.2-24.4,10.2Z",
'056': "M132.4,154.5c-12.2,0-25.6-3.3-35.8-8.9-17.9-9.8-21.2-16.4-25.8-25.5-.6-1.2-1.2-2.5-2-3.8l-.3-.6c-1-1.9-2.3-4.4-2.9-6.4-1-3.1-.5-6.2,1.3-8.7,1.8-2.4,4.6-3.8,7.7-3.8s6.3,1.6,8.2,4.5c.7,1.1,1.3,2.2,1.9,3.3.5.9.9,1.7,1.4,2.4,6.2,9.4,14.6,15.8,23.8,18.3-.2-1.2-.4-2.3-.5-3.5-.8-10,2.2-19.3,8.4,26.1,6.1,6.6-14.7,10.2,24.4-10.2s1.3,0,1.9,0c11.5.6,21.6,7,27,17.3,5.6,10.7,5.1,23.8-1.3,34.1-7.1,11.4-20.4,17.6-37.4,17.6h0Z",
'057': "",
'058': "",
'059': "",
'060': "",
};
const key = Object.keys(d).find(k => symbolInfo.info.includes(k));
if (key) {
if (key === '三角') baseArtworkSize = 80;
shape.setAttribute('d', d[key]);
} else {
baseArtworkSize = 240;
shape = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
shape.setAttribute('x', '20');
shape.setAttribute('y', '20');
shape.setAttribute('width', '200');
shape.setAttribute('height', '200');
}
const scale = size / baseArtworkSize;
g.setAttribute('transform', `scale(${scale}) translate(-120, -120)`);
shape.setAttribute('fill', symbolInfo.symbolFill);
shape.setAttribute('stroke', symbolInfo.symbolStroke);
shape.setAttribute('stroke-width', strokeWidth);
g.appendChild(shape);
return g;
}
function findConnectedComponents(points, maxDist) {
const adj = new Map();
points.forEach((_, i) => adj.set(i, []));
for (let i = 0; i < points.length; i++) {
for (let j = i + 1; j < points.length; j++) {
const dist = Math.sqrt(Math.pow(points[i].x - points[j].x, 2) + Math.pow(points[i].y - points[j].y, 2));
if (dist <= maxDist * 2) {
adj.get(i).push(j);
adj.get(j).push(i);
}
}
}
const visited = new Set();
const components = [];
for (let i = 0; i < points.length; i++) {
if (!visited.has(i)) {
const component = [];
const stack = [i];
visited.add(i);
while (stack.length > 0) {
const u = stack.pop();
component.push(points[u]);
for (const v of adj.get(u)) {
if (!visited.has(v)) {
visited.add(v);
stack.push(v);
}
}
}
components.push(component);
}
}
return components;
}
function getConvexHull(points) {
if (points.length <= 2) return points;
points.sort((a, b) => a.x - b.x || a.y - b.y);
const cross = (o, a, b) => (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
const lower = [];
for (const p of points) {
while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], p) <= 0) {
lower.pop();
}
lower.push(p);
}
const upper = [];
for (let i = points.length - 1; i >= 0; i--) {
const p = points[i];
while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], p) <= 0) {
upper.pop();
}
upper.push(p);
}
return lower.slice(0, -1).concat(upper.slice(0, -1));
}
function downloadFile(content, fileName, contentType) {
const a = document.createElement("a");
const file = new Blob([content], { type: contentType });
a.href = URL.createObjectURL(file);
a.download = fileName;
a.click();
URL.revokeObjectURL(a.href);
}
function downloadSvg() {
const svgEl = document.querySelector('#svgPreview svg');
if (!svgEl) {
console.error('プレビューがありません。');
return;
}
const englishTitleText = state.titles.find(t => t.id === 'english')?.text || 'Untitled';
const formattedTitle = englishTitleText
.replace(/[^a-zA-Z\s]/g, '')
.split(' ')
.filter(word => word)
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
.join('');
const filename = `MapOfAinuLanguage-${formattedTitle}.svg`;
const serializer = new XMLSerializer();
let source = serializer.serializeToString(svgEl);
source = '<?xml version="1.0" standalone="no"?>\r\n' + source;
downloadFile(source, filename, 'image/svg+xml;charset=utf-8');
}
function downloadLua() {
const luaCode = luaCodeOutputEl.value;
if (!luaCode) {
alert('先にデータを処理してLuaコードを生成してください。');
return;
}
const symbol1 = state.symbols.find(s => s.id === 1);
let filename = 'module.lua';
if (symbol1 && symbol1.word) {
const { katakana } = getKatakanaConversion(symbol1.word);
if (katakana) {
filename = `${katakana}.lua`;
}
}
downloadFile(luaCode, filename, 'text/lua;charset=utf-8');
}
init();
});
</script>
</body>
</html>