- スキャンID:
- e633e7fe-98db-4eee-8fc4-4cfe35b4af12終了
- 送信済みURL:
- https://t.co/0wxMpjrDXq
- レポート終了日:
リンク · 0件検出
ページから特定された発信リンク
JavaScript変数 · 131件検出
ページのウィンドウオブジェクトにロードされたグローバルのJavaScript変数は関数以外の場所で宣言された変数で、現在のスコープ内であればコードのどこからでもアクセス可能です
名前 | 規模 |
---|---|
onbeforetoggle | object |
documentPictureInPicture | object |
onscrollend | object |
RemoteStorage | function |
Widget | function |
gtag | function |
dataLayer | object |
science | function |
Pickr | function |
JSZip | function |
コンソールログメッセージ · 1件検出
Webコンソールにログ記録されたメッセージ
規模 | 分類 | ログ |
---|---|---|
warning | other |
|
HTML
未加工のHTMLページ本文
<!DOCTYPE html><html style="--readerBg: #000000; --sidebarCol: #28292B; --accentCol: #B73636; --textCol: #EEEEEE; --icoCol: #EEEEEE; --sidebarColDark: #191a1c; --sidebarColDarkA: #191a1c00; --prevCol: #212224; --accentSelected: #ffffff; --accentSelectedInvert: #444444; --borderColor: rgba(0,0,0,0.7); --blackLight: rgba(0,0,0,0.2); --sidebarColFocus: #0d0e10; --rescueShade: unset; --rdrBorderL: 1px; --rdr-wb: 2px; --blackFlag: rgba(0,0,0,0.7); --rdrAncBottomWhite: rgba(255,255,255,0.35); overflow: auto;"><head>
<meta charset="UTF-8">
<meta name="theme-color" content="#2b2f33">
<title>xx30 | Chapter 1 | Cubari</title>
<meta name="twitter:title" content="xx30 | Chapter 1 | Cubari">
<meta property="og:title" content="xx30 | Chapter 1 | Cubari">
<meta name="description" content="Read chapter 1 of xx30 | Cubari">
<meta name="twitter:card" content="summary">
<meta property="og:description" content="Read the xx30 manga series.">
<meta name="twitter:description" content="Read the xx30 manga series.">
<meta property="og:image" content="https://cdn.imgchest.com/files/l7lxcmlmb67.png">
<meta name="twitter:image" content="https://cdn.imgchest.com/files/l7lxcmlmb67.png">
<meta property="og:url" content="https://cubari.moe/read/imgchest/o24av9o3e4l/1/1/">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" href="/static/css/pickr.css?v=29a9e3e
">
<link rel="canonical" href="https://cubari.moe/read/imgchest/o24av9o3e4l/1/1/">
<link rel="stylesheet" type="text/css" href="/static/css/reader.css?v=29a9e3e
">
<link rel="manifest" href="/static/manifest.json?v=29a9e3e
">
<link rel="shortcut icon" sizes="128x128" type="image/png" href="/static/favicon.png?v=29a9e3e
" defer="">
<link rel="icon" sizes="128x128" type="image/png" href="/static/favicon.png?v=29a9e3e
">
<link rel="icon" sizes="512x512" type="image/png" href="/static/favicon.png?v=29a9e3e
">
<link rel="apple-touch-icon" sizes="128x128" href="/static/favicon.png?v=29a9e3e
">
<link rel="apple-touch-icon" sizes="256x256" href="/static/favicon.png?v=29a9e3e
">
<link rel="apple-touch-icon" sizes="512x512" href="/static/favicon.png?v=29a9e3e
">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="theme-color" content="#2b2f33">
<meta name="format-detection" content="telephone=no">
<meta name="referrer" content="same-origin">
<script src="/static/js/remotestorage.min.js"></script>
<script src="/static/js/widget.min.js"></script>
<script id="history_coverUrl" type="application/json">"https://cdn.imgchest.com/files/l7lxcmlmb67.png"</script>
<script id="history_source" type="application/json">"read/imgchest"</script>
<script id="history_slug" type="application/json">"o24av9o3e4l"</script>
<script id="history_url" type="application/json">"read/imgchest/o24av9o3e4l"</script>
<script id="history_title" type="application/json">"xx30"</script>
<script>
// remoteStorage backend that'll be our plugged in module
// This should be abstracted from what actually handles updates,
// since this'll give us the ability to pull this out in the future
const RS_PATH = "cubari";
const remoteStorage = (() => {
// Define the schema for our history
const Model = {name: RS_PATH, builder: (private) => {
const SERIES_META = "series";
const REPLACEMENT_STR = "{SOURCE_SLUG_REPLACEMENT}";
const SERIES_META_PATH_BASE = "series/";
const SERIES_META_PATH = `${SERIES_META_PATH_BASE}${REPLACEMENT_STR}`;
private.declareType(SERIES_META, {
type: "object",
properties: {
slug: {
type: "string"
},
coverUrl: {
type: "string"
},
source: {
type: "string"
},
url: {
type: "string"
},
title: {
type: "string"
},
timestamp: {
type: "number"
},
chapters: {
type: "array",
default: [] // Note that these aren't validated by our schema handler
},
pinned: {
type: "boolean",
default: false // Thus it's documenting only; handle it
}
},
required: ["slug", "source", "url", "title", "timestamp", "chapters", "pinned"]
});
let firstPartyValidator = (source) => {
return (source === "manga" || source === "series" || source === "default");
};
let pathBuilder = (path, slug, source) => {
if (!source) source = "default";
if (firstPartyValidator(source)) source = "default";
source = source.replace(" ", "_");
return path.replace(REPLACEMENT_STR, `${source}-${slug}`);
};
let seriesBuilder = (slug, coverUrl, source, url, title, pinned, chapters) => {
source = source.replace(" ", "_");
if (firstPartyValidator(source)) {
source = "default";
pinned = true; // First party chapters always pinned
}
return {
slug: slug,
coverUrl: coverUrl || "",
source: source,
url: url,
title: title,
timestamp: Date.now(),
chapters: chapters || [],
pinned: (pinned === undefined) ? false : pinned
};
};
return {
exports: {
firstPartyHandler: (source) => {
return firstPartyValidator(source) ? "default" : source;
},
slugBuilder: (slug, source) => {
return `${source}-${slug}`;
},
addSeries: (slug, coverUrl, source, url, title, pinned, chapters) => {
let toStore = seriesBuilder(slug, coverUrl, source, url, title, pinned, chapters);
return private.storeObject(
SERIES_META,
pathBuilder(SERIES_META_PATH, slug, source),
toStore);
},
editSeries: async (slug, coverUrl, source, url, title, pinned, chapters) => {
let obj = await private.getObject(pathBuilder(SERIES_META_PATH, slug, source));
if (obj) {
let toStore = seriesBuilder(
slug || obj.slug,
coverUrl || obj.coverUrl,
source || obj.source,
url || obj.url,
title || obj.title,
(pinned !== undefined) ? pinned : obj.pinned,
chapters || obj.chapters // Empty array is truthy
);
return private.storeObject(
SERIES_META,
pathBuilder(SERIES_META_PATH, slug, source),
toStore
)
} else {
// Fail-fast instead of adding the series
throw new Error("Cannot edit a non-existent series.");
}
},
getSeries: (slug, source) => {
return private.getObject(pathBuilder(SERIES_META_PATH, slug, source));
},
removeSeries: (slug, source) => {
return private.remove(pathBuilder(SERIES_META_PATH, slug, source));
},
getAllSeries: () => {
// Note for the future: getAll gives you the objects within, while
// getListing gives you just a list of files; thus, this gives you the
// metadata within
if (private.storage.connected) {
// maxAge cache in millis
return private.getAll(SERIES_META_PATH_BASE, 30000);
} else {
// Promise resolves immediately if no storage is connected
// https://remotestoragejs.readthedocs.io/en/v1.2.3/js-api/base-client.html#caching-logic-for-read-operations
return private.getAll(SERIES_META_PATH_BASE);
}
}
}
}
}};
let remoteStorage = new RemoteStorage({cache: true, modules: [Model]});
remoteStorage.access.claim(RS_PATH, "rw");
remoteStorage.caching.enable(`/${RS_PATH}/`);
return remoteStorage;
})();
// This will be the main handler that deals with both
// chapter and series history. All logic should be here
// and abstracted from the rest of the code
const globalHistoryHandler = (() => {
const STORAGE_KEY = "proxyHistory";
const SORT_KEY = "timestamp";
const MAX_VALUES = 20;
// Helper to return an array of objects from a nested object, sorted by key
let sortObjectByKey = (obj, key) => {
let sortable = [];
for (let k in obj) {
sortable.push(obj[k]);
}
sortable.sort((f, s) => s[key] - f[key]);
return sortable;
};
const sync = async () => {
// Sync operation ensures the local cache doesn't have any dangling objects.
// We'll sort for the timestamp key since that's what we use everywhere else
let allSeries = await remoteStorage[RS_PATH].getAllSeries();
for (const [key, value] of Object.entries(allSeries)) {
try {
if (!value[SORT_KEY]) {
// We don't use split here since the slug can potentially include "-"
let separatorIndex = key.indexOf("-");
let slug = key.slice(separatorIndex + 1);
let source = key.slice(0, separatorIndex);
await remoteStorage[RS_PATH].removeSeries(slug, source);
}
} catch (e) {
console.error("[Global History] Sync error, continuing.");
}
}
};
const enabled = () => {
return localStorage.getItem(STORAGE_KEY) ? true : false;
};
const enable = () => {
let settings = localStorage.getItem("settings");
let redirected = localStorage.getItem("redirected");
let storageOnce = localStorage.getItem("storageOnce");
localStorage.clear();
if (settings) localStorage.setItem("settings", settings);
if (redirected) localStorage.setItem("redirected", redirected);
if (storageOnce) localStorage.setItem("storageOnce", storageOnce);
localStorage.setItem(STORAGE_KEY, true);
};
const disable = () => {
let settings = localStorage.getItem("settings");
let redirected = localStorage.getItem("redirected");
let storageOnce = localStorage.getItem("storageOnce");
localStorage.clear();
if (settings) localStorage.setItem("settings", settings);
if (redirected) localStorage.setItem("redirected", redirected);
if (storageOnce) localStorage.setItem("storageOnce", storageOnce);
};
const pushSeries = async (slug, coverUrl, source, url, title) => {
await sync();
source = remoteStorage[RS_PATH].firstPartyHandler(source);
let allCurrentSeries = sortObjectByKey(await remoteStorage[RS_PATH].getAllSeries() || {}, SORT_KEY);
let existingSeries = allCurrentSeries.find((e) => e.slug === slug && e.source === source.replace(" ", "_"));
allCurrentSeries = allCurrentSeries.filter(e => !e.pinned);
// Be mindful of the cap regardless of the state of the tree
while ((allCurrentSeries.length + ((existingSeries) ? 0 : 1)) > MAX_VALUES) {
let last = allCurrentSeries.pop();
await remoteStorage[RS_PATH].removeSeries(last.slug, last.source);
}
if (existingSeries) {
// Effectively this updates the timestamp of the series, pushing it to the top
return remoteStorage[RS_PATH].editSeries(slug, coverUrl, source, url, title, existingSeries.pinned, existingSeries.chapters);
} else {
return remoteStorage[RS_PATH].addSeries(slug, coverUrl, source, url, title, undefined, undefined);
}
};
const removeSeries = async (slug, source) => {
await sync();
return remoteStorage[RS_PATH].removeSeries(slug, source);
};
const removeAllUnpinnedSeries = async () => {
let series = await globalHistoryHandler.getAllUnpinnedSeries();
if(series) {
Array.prototype.forEach.call(series, srs => {
removeSeries(srs.slug, srs.source)
})
}
};
const addChapters = async (slug, source, chapters) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
chapters = [...new Set([...chapters, ...existingSeries.chapters])];
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, undefined, chapters);
} else {
console.error("[Global History] addChapters - Series didn't exist.");
}
};
const addChapter = async (slug, source, chapter) => {
return addChapters(slug, source, [chapter]);
};
const removeChapter = async (slug, source, chapter) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
chapters = existingSeries.chapters.filter(e => e !== chapter);
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, undefined, chapters);
} else {
console.error("[Global History] removeChapter - Series didn't exist.");
}
};
const removeAllChapters = async (slug, source) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, undefined, []);
} else {
console.error("[Global History] removeAllChapters - series didn't exist.");
}
};
const getReadChapters = async (slug, source) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
return existingSeries.chapters;
} else {
console.error("[Global History] getReadChapters - series didn't exist.");
}
};
const pinSeries = async (slug, source) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, true, undefined);
} else {
console.error("[Global History] pinSeries - series didn't exist.");
}
};
const unpinSeries = async (slug, source) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, false, undefined);
} else {
console.error("[Global History] unpinSeries - series didn't exist.");
}
};
const getAllPinnedSeries = async () => {
await sync();
return sortObjectByKey(await remoteStorage[RS_PATH].getAllSeries() || {}, SORT_KEY).filter(e => e.pinned);
};
const getAllUnpinnedSeries = async () => {
await sync();
return sortObjectByKey(await remoteStorage[RS_PATH].getAllSeries() || {}, SORT_KEY).filter(e => !e.pinned);
};
return {
max: MAX_VALUES,
enabled,
pushSeries,
removeSeries,
removeAllUnpinnedSeries,
addChapters,
addChapter,
removeChapter,
removeAllChapters,
getReadChapters,
pinSeries,
unpinSeries,
getAllPinnedSeries,
getAllUnpinnedSeries,
toggle: {
enable,
disable
}
};
})();
const tag = () => {
try {
let coverUrl = JSON.parse(document.getElementById("history_coverUrl").textContent);
let source = JSON.parse(document.getElementById("history_source").textContent);
if (!source) {
source = window.location.pathname
.split("/")
.filter(e => e)[1]
.replace("_", " ");
} else {
source = source.split("/")[1];
}
let slug = JSON.parse(document.getElementById("history_slug").textContent);
let url = JSON.parse(document.getElementById("history_url").textContent);
if (url) {
url = `/${url}`.split(slug)[0] + slug;
}
let title = JSON.parse(document.getElementById("history_title").textContent);
if (source && slug && url && title) {
remoteStorage.on("ready", async () => {
await globalHistoryHandler.pushSeries(slug, coverUrl, source, url, title);
window.dispatchEvent(new CustomEvent("history-ready"));
});
}
} catch (e) {
// Do nothing, silently fail.
}
};
window.addEventListener("load", async () => {
if((await localStorage.getItem('storageOnce')) == "1") return;
if (!globalHistoryHandler.enabled()) {
globalHistoryHandler.toggle.enable();
localStorage.setItem('storageOnce', "1")
}
})
</script>
<script>
// Seed the values from the template for the reader API calls
const BASE_API_PATH = "/read/api/imgchest/series/";
const IS_FIRST_PARTY = false;
const IS_INDEXED = false;
const IMAGE_PROXY_URL = "https://services.f-ck.me";
</script></head>
<body class="fit-width_limit direction-ltr gap-false theme-Cubari reset-false spread-1 spreadCount-1 spreadOffset-0 selectorAnchor-left selPinned-false selNum-true hoverinos-true sidebar-true previews-false clickTurnPage-true arrowTurnPage-false swipeGestures-true parallelDownloads-5 zoom-100">
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async="" src="https://www.googletagmanager.com/gtag/js?id=G-ZX1TZQKKPL"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-ZX1TZQKKPL');
</script>
<script>
const science = (measurePerformance = false) => {
const scienceEndpoint = "https://obs.f-ck.me/ingest";
const proxyBasePath = "read";
const pathFragments = location.pathname.split("/");
const proxyMetadata = pathFragments[pathFragments.findIndex(e => e === proxyBasePath) + 1];
if (!proxyMetadata) {
return;
}
const sciencePayload = {
"p": "cubari.moe",
"m": proxyMetadata,
};
if (measurePerformance) {
const navPerf = performance.getEntriesByType("navigation");
if (navPerf.length === 1) {
sciencePayload["t"] = navPerf[0].duration;
}
}
fetch(`${scienceEndpoint}`, {
method: "POST",
mode: "no-cors",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(sciencePayload),
});
};
window.science = science;
// Science once when the page is loaded
window.addEventListener("load", () => {
// We need to add this to the event loop so that the load
// event can be properly hydrated in the performance object
setTimeout(() => {
science(true);
}, 0);
});
</script>
<main id="rdr-main" class="UI Reader last-chapter" tabindex="-1" data-preload="3">
<aside class="">
<div class="hide-side UI Button MultiStateButton" data-bind="sidebar_button" data-tip="Show/hide sidebar [S]" data-tip-align="right" data-apr.sidebar="true">
<div class="hide-side-actual ico-btn"></div>
</div>
<header>
<a href="/" class="ico-btn guya"></a>
<h1 data-bind="title"><a href="/read/imgchest/o24av9o3e4l/">xx30</a></h1>
<button class="ico-btn"></button>
</header>
<div class="rdr-aside-buffer" data-bind="rdr_aside_buffer"></div>
<div class="rdr-aside-content" data-bind="rdr_aside_content">
<section class="rdr-selector" data-bind="rdr_selector">
<div class="rdr-selector-top">
<button data-bind="vol_next" class="rdr-selector-vol ico-btn prev disabled" data-tip="Next volume [.]"></button>
<div class="flex-spacer UI MessageBox" data-bind="message"></div>
<button data-bind="download_chapter" class="ico-btn download" data-tip="Download chapter in the background"></button>
<div class="download-anchor">
<div class="download-wrapper hidden" data-bind="download_wrapper">
<button data-bind="downloading_chapter" class="ico-btn downloading" disabled=""></button>
<button data-bind="download_cancel" class="ico-btn download-cancel"></button>
</div>
</div>
<a data-bind="share_button" data-tip="Copy short link [R]" class="rdr-share ico-btn "></a>
<!-- <a data-bind='comment_button' data-tip="Comments" class="rdr-comment ico-btn"></a> -->
<button data-bind="jump" class="ico-btn jump" data-tip="Jump to chapter... [J]"></button>
<button data-bind="search" class="ico-btn search" data-tip="Search the manga... [Ctrl]+[F]" style="display: none;"></button>
</div>
<div class="rdr-selector-mid">
<button data-bind="chap_prev" class="rdr-selector-chap ico-btn prev disabled" data-tip="Previous chapter [[]"></button>
<div class="rdr-vol-wrap UI FauxDrop" data-bind="selector_vol">
<label>1</label>
<select id="rdr-vol" class="UI List SimpleList"><option class="UI SimpleListItem" value="1">1</option></select>
</div>
<div class="rdr-chap-wrap UI FauxDrop" data-bind="selector_chap">
<label>1 - xx30</label>
<select id="rdr-chap" class="UI List SimpleList"><option class="UI SimpleListItem" value="1">1 - xx30</option></select>
</div>
<button data-bind="chap_next" class="rdr-selector-chap ico-btn next disabled" data-tip="Next chapter []]"></button>
</div>
<div class="rdr-selector-bot">
<button data-bind="vol_prev" class="rdr-selector-vol ico-btn next disabled" data-tip="Previous volume [,]"></button>
<div class="flex-spacer"></div>
<button data-bind="preload_button" class="ico-btn hidden UI Button MultiStateButton" data-tip="Change preload [L]" data-bhv.preload="3"></button>
<button data-bind="fit_button" class="ico-btn UI Button MultiStateButton" data-tip="Change fit mode [F]" data-lyt.fit="width_limit"></button>
<button data-bind="layout_button" class="ico-btn UI Button MultiStateButton" data-tip="Change layout direction [D]" data-lyt.direction="ltr"></button>
<button data-bind="spread_button" class="ico-btn UI Button MultiStateButton" data-tip="Change two-page mode [Q]" data-lyt.spread="1"></button>
<button data-bind="sel_pin_button" class="ico-btn UI Button MultiStateButton" data-tip="Pin page selector [N]" data-apr.selpinned="false"></button>
<button data-bind="settings_button" class="ico-btn" data-tip="Advanced settings... [O]"></button>
</div>
</section>
<section class="rdr-groups UI List Selector Tabs" data-bind="groups">
<div class="is-active UI SimpleListItem" data-list-id="1">imgchest</div></section>
<section class="rdr-previews" style="display: none;">
<div class="header UI Button MultiStateButton" data-bind="previews_button" data-apr.previews="false">
<span>Previews</span>
<div class="ico-btn expander" data-tip="Show previews [P]"></div>
</div>
<div data-bind="previews" class="rdr-previews-gallery UI List Selector Tabs">
</div>
</section>
<section class="rdr-description">
<div data-bind="image_description"></div>
</section>
</div>
</aside>
<div class="rdr-page-selector UI PageSelector" data-bind="page_selector">
<div class="rdr-page-selector-counter" data-bind="page_keys_count">1/14</div>
<div class="rdr-page-selector-keys UI List Selector Tabs" data-bind="page_keys">
<div class="UI Dummy is-active shown preloaded">1</div><div class="UI Dummy preloaded">2</div><div class="UI Dummy preloaded">3</div><div class="UI Dummy">4</div><div class="UI Dummy">5</div><div class="UI Dummy">6</div><div class="UI Dummy">7</div><div class="UI Dummy">8</div><div class="UI Dummy">9</div><div class="UI Dummy">10</div><div class="UI Dummy">11</div><div class="UI Dummy">12</div><div class="UI Dummy">13</div><div class="UI Dummy">14</div></div>
</div>
<content data-bind="image_viewer" class="rdr-area UI ReaderImageView">
<div class="preload-entity" data-bind="preload_entity">
<img src="https://cdn.imgchest.com/files/84jdcd8dpj4.png"><img><img><img>
</div>
<div class="rdr-image-wrap UI List Selector Tabs" data-bind="image_container" tabindex="-1" style="margin-left: 0%;">
<div tabindex="-1" class="UI List ReaderImageWrapper"><img src="https://cdn.imgchest.com/files/l7lxcmlmb67.png" class="UI ReaderImage" loading="eager"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="https://cdn.imgchest.com/files/84jdcd8dpj4.png" class="UI ReaderImage" loading="eager"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="https://cdn.imgchest.com/files/pyq9crmrqv4.png" class="UI ReaderImage" loading="eager"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div></div>
<div class="zoom-level refresh-chapter is-hidden" data-bind="random_chapter">
<div class="refresh-chapter-note">This is the Blu-ray extras "random chapter".<br>Click this button to
reshuffle the chapter.</div>
<div class="ico-btn" data-bind="random_chapter_button">↻</div>
</div>
<div class="hover-prev" data-bind="hover_prev">
<div class="hover-wrap">
<div class="hover-arrow"></div>
<div class="hover-sub"></div>
</div>
</div>
<div class="hover-next" data-bind="hover_next">
<div class="hover-wrap">
<div class="hover-arrow"></div>
<div class="hover-sub"></div>
</div>
</div>
<div dir="ltr" class="resize-sensor" style="pointer-events: none; position: absolute; inset: 0px; overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%;"><div class="resize-sensor-expand" style="pointer-events: none; position: absolute; inset: 0px; overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%;"><div style="position: absolute; left: 0px; top: 0px; transition: all 0s ease 0s; width: 503px; height: 610px;"></div></div><div class="resize-sensor-shrink" style="pointer-events: none; position: absolute; inset: 0px; overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%;"><div style="position: absolute; left: 0px; top: 0px; transition: all 0s ease 0s; width: 200%; height: 200%;"></div></div></div></content>
<div class="zoom-level" data-bind="zoom_level">
<div class="ico-btn" data-bind="zoom_level_plus"></div>
<div class="ico-btn" data-bind="zoom_level_minus"></div>
</div>
</main>
<div class="Tooltippy UI" style="display: none;"></div>
<div class="Tooltippy Error UI"></div>
<div class="LodaManager hidden UI" tabindex="-1">
</div>
<script src="/static/js/pickr.min.js?v=29a9e3e
"></script>
<script src="/static/js/jszip.min.js?v=29a9e3e
"></script>
<script type="text/javascript" src="/static/js/ResizeSensor.js?v=29a9e3e
"></script>
<script type="text/javascript" src="/static/js/alg_lib.js?v=29a9e3e
"></script>
<script type="text/javascript" src="/static/js/UI2.js?v=29a9e3e
"></script>
<script type="text/javascript" src="/static/js/init.js?v=29a9e3e
"></script><div style="display: none;"></div><div class="pcr-app" data-theme="nano" aria-label="color picker dialog" role="window" tabindex="-1" style="left: 0px; top: 8px;">
<div class="pcr-selection">
<div class="pcr-color-preview" style="display:none" hidden="">
<button type="button" class="pcr-last-color" aria-label="use previous color" style="color: rgb(255, 255, 255);"></button>
<div class="pcr-current-color" style="color: rgb(58, 63, 68);"></div>
</div>
<div class="pcr-color-palette">
<div class="pcr-picker" style="left: calc(14.7059% - 9px); top: calc(73.3333% - 9px); background: rgb(58, 63, 68);"></div>
<div class="pcr-palette" tabindex="0" aria-label="color selection area" role="listbox" style="background: linear-gradient(to top, rgb(0, 0, 0), transparent), linear-gradient(to left, rgb(0, 128, 255), rgb(255, 255, 255));"></div>
</div>
<div class="pcr-color-chooser">
<div class="pcr-picker" style="left: calc(58.3333% - 9px); background-color: rgb(0, 128, 255);"></div>
<div class="pcr-hue pcr-slider" tabindex="0" aria-label="hue selection slider" role="slider"></div>
</div>
<div class="pcr-color-opacity" style="display:none" hidden="">
<div class="pcr-picker"></div>
<div class="pcr-opacity pcr-slider" tabindex="0" aria-label="selection slider" role="slider"></div>
</div>
</div>
<div class="pcr-swatches "></div>
<div class="pcr-interaction">
<input class="pcr-result" type="text" spellcheck="false" aria-label="color input field">
<input class="pcr-type active" data-type="HEXA" value="HEXA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="RGBA" value="RGBA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSLA" value="HSLA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSVA" value="HSVA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="CMYK" value="CMYK" type="button" style="display:none" hidden="">
<input class="pcr-save" value="Save" type="button" aria-label="save and close">
<input class="pcr-cancel" value="Cancel" type="button" style="display:none" hidden="" aria-label="cancel and close">
<input class="pcr-clear" value="Clear" type="button" style="display:none" hidden="" aria-label="clear and close">
</div>
</div><div class="pcr-app" data-theme="nano" aria-label="color picker dialog" role="window" tabindex="-1" style="left: 0px; top: 8px;">
<div class="pcr-selection">
<div class="pcr-color-preview" style="display:none" hidden="">
<button type="button" class="pcr-last-color" aria-label="use previous color" style="color: rgb(255, 255, 255);"></button>
<div class="pcr-current-color" style="color: rgb(238, 238, 238);"></div>
</div>
<div class="pcr-color-palette">
<div class="pcr-picker" style="left: calc(0% - 9px); top: calc(6.66667% - 9px); background: rgb(238, 238, 238);"></div>
<div class="pcr-palette" tabindex="0" aria-label="color selection area" role="listbox" style="background: linear-gradient(to top, rgb(0, 0, 0), transparent), linear-gradient(to left, rgb(255, 0, 0), rgb(255, 255, 255));"></div>
</div>
<div class="pcr-color-chooser">
<div class="pcr-picker" style="left: calc(0% - 9px); background-color: rgb(255, 0, 0);"></div>
<div class="pcr-hue pcr-slider" tabindex="0" aria-label="hue selection slider" role="slider"></div>
</div>
<div class="pcr-color-opacity" style="display:none" hidden="">
<div class="pcr-picker"></div>
<div class="pcr-opacity pcr-slider" tabindex="0" aria-label="selection slider" role="slider"></div>
</div>
</div>
<div class="pcr-swatches "></div>
<div class="pcr-interaction">
<input class="pcr-result" type="text" spellcheck="false" aria-label="color input field">
<input class="pcr-type active" data-type="HEXA" value="HEXA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="RGBA" value="RGBA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSLA" value="HSLA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSVA" value="HSVA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="CMYK" value="CMYK" type="button" style="display:none" hidden="">
<input class="pcr-save" value="Save" type="button" aria-label="save and close">
<input class="pcr-cancel" value="Cancel" type="button" style="display:none" hidden="" aria-label="cancel and close">
<input class="pcr-clear" value="Clear" type="button" style="display:none" hidden="" aria-label="clear and close">
</div>
</div><div class="pcr-app" data-theme="nano" aria-label="color picker dialog" role="window" tabindex="-1" style="left: 0px; top: 8px;">
<div class="pcr-selection">
<div class="pcr-color-preview" style="display:none" hidden="">
<button type="button" class="pcr-last-color" aria-label="use previous color" style="color: rgb(255, 255, 255);"></button>
<div class="pcr-current-color" style="color: rgb(178, 223, 251);"></div>
</div>
<div class="pcr-color-palette">
<div class="pcr-picker" style="left: calc(29.0837% - 9px); top: calc(1.56863% - 9px); background: rgb(178, 223, 251);"></div>
<div class="pcr-palette" tabindex="0" aria-label="color selection area" role="listbox" style="background: linear-gradient(to top, rgb(0, 0, 0), transparent), linear-gradient(to left, rgb(0, 157, 255), rgb(255, 255, 255));"></div>
</div>
<div class="pcr-color-chooser">
<div class="pcr-picker" style="left: calc(56.3927% - 9px); background-color: rgb(0, 157, 255);"></div>
<div class="pcr-hue pcr-slider" tabindex="0" aria-label="hue selection slider" role="slider"></div>
</div>
<div class="pcr-color-opacity" style="display:none" hidden="">
<div class="pcr-picker"></div>
<div class="pcr-opacity pcr-slider" tabindex="0" aria-label="selection slider" role="slider"></div>
</div>
</div>
<div class="pcr-swatches "></div>
<div class="pcr-interaction">
<input class="pcr-result" type="text" spellcheck="false" aria-label="color input field">
<input class="pcr-type active" data-type="HEXA" value="HEXA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="RGBA" value="RGBA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSLA" value="HSLA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSVA" value="HSVA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="CMYK" value="CMYK" type="button" style="display:none" hidden="">
<input class="pcr-save" value="Save" type="button" aria-label="save and close">
<input class="pcr-cancel" value="Cancel" type="button" style="display:none" hidden="" aria-label="cancel and close">
<input class="pcr-clear" value="Clear" type="button" style="display:none" hidden="" aria-label="clear and close">
</div>
</div><div class="pcr-app" data-theme="nano" aria-label="color picker dialog" role="window" tabindex="-1" style="left: 0px; top: 8px;">
<div class="pcr-selection">
<div class="pcr-color-preview" style="display:none" hidden="">
<button type="button" class="pcr-last-color" aria-label="use previous color" style="color: rgb(255, 255, 255);"></button>
<div class="pcr-current-color" style="color: rgb(39, 43, 48);"></div>
</div>
<div class="pcr-color-palette">
<div class="pcr-picker" style="left: calc(18.75% - 9px); top: calc(81.1765% - 9px); background: rgb(39, 43, 48);"></div>
<div class="pcr-palette" tabindex="0" aria-label="color selection area" role="listbox" style="background: linear-gradient(to top, rgb(0, 0, 0), transparent), linear-gradient(to left, rgb(0, 113, 255), rgb(255, 255, 255));"></div>
</div>
<div class="pcr-color-chooser">
<div class="pcr-picker" style="left: calc(59.2593% - 9px); background-color: rgb(0, 113, 255);"></div>
<div class="pcr-hue pcr-slider" tabindex="0" aria-label="hue selection slider" role="slider"></div>
</div>
<div class="pcr-color-opacity" style="display:none" hidden="">
<div class="pcr-picker"></div>
<div class="pcr-opacity pcr-slider" tabindex="0" aria-label="selection slider" role="slider"></div>
</div>
</div>
<div class="pcr-swatches "></div>
<div class="pcr-interaction">
<input class="pcr-result" type="text" spellcheck="false" aria-label="color input field">
<input class="pcr-type active" data-type="HEXA" value="HEXA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="RGBA" value="RGBA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSLA" value="HSLA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSVA" value="HSVA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="CMYK" value="CMYK" type="button" style="display:none" hidden="">
<input class="pcr-save" value="Save" type="button" aria-label="save and close">
<input class="pcr-cancel" value="Cancel" type="button" style="display:none" hidden="" aria-label="cancel and close">
<input class="pcr-clear" value="Clear" type="button" style="display:none" hidden="" aria-label="clear and close">
</div>
</div>
<script type="text/javascript">
// History tagging
tag();
</script>
</body></html>