Greasy Fork

web漫画にショートカットキーを追加

←→:前/次のページ S:スクロール速度変更 Shift+A:頭出しオンオフ f [:全画面化 Shift+←→か ] Enter:前の話/次の話に移動 Shift+↑:作品情報ページに戻る (ニコニコ静画のみ)C:コメントオンオフ H:ヘッダ固定追従変更 (作品情報ページで)→:第1話に移動、Enter:最新話に移動、Shift+↑:パンくずリスト1つ上に移動 Shift+@:インスタントsibling登録

目前为 2020-05-08 提交的版本。查看 最新版本

// ==UserScript==
// @name         web漫画にショートカットキーを追加
// @description  ←→:前/次のページ S:スクロール速度変更 Shift+A:頭出しオンオフ f [:全画面化 Shift+←→か ] Enter:前の話/次の話に移動 Shift+↑:作品情報ページに戻る (ニコニコ静画のみ)C:コメントオンオフ H:ヘッダ固定追従変更 (作品情報ページで)→:第1話に移動、Enter:最新話に移動、Shift+↑:パンくずリスト1つ上に移動 Shift+@:インスタントsibling登録
// @version      0.1.15
// @run-at document-end
// @match *://www.comic-valkyrie.com/*
// @match *://webcomic.ohtabooks.com/*
// @match *://comicride.jp/*
// @match *://*.5ch.net/*
// @match *://*.yucl.net/*
// @match *://arklightbooks.com/comics/*
// @match *://bokete.jp/*
// @match *://cakes.mu/*
// @match *://cho-animedia.jp/comic_category/*
// @match *://cho-animedia.jp/comic/*
// @match *://ci.nii.ac.jp/*
// @match *://comic-days.com/episode/*
// @match *://tonarinoyj.jp/episode/*
// @match *://shonenjumpplus.com/episode/*
// @match *://kuragebunch.com/episode/*
// @match *://pocket.shonenmagazine.com/episode/*
// @match *://viewer.heros-web.com/episode/*
// @match *://comic-fuz.com/*
// @match *://comic-meteor.jp/*
// @match *://comic-trail.jp/*
// @match *://comic-walker.com/*
// @match *://comic.mag-garden.co.jp/*
// @match *://comic.pixiv.net/works/*
// @match *://comic.pixiv.net/viewer/*
// @match *://comic.webnewtype.com/contents/*
// @match *://comicawa.com/TitleDetail/*
// @match *://comicpash.jp/*
// @match *://curazy.com/*
// @match *://cycomi.com/fw/cycomibrowser/chapter/*
// @match *://daysneo.com/works/*
// @match *://ebookjapan.yahoo.co.jp/*
// @match *://gammaplus.takeshobo.co.jp/*
// @match *://ganma.jp/*
// @match *://grapee.jp/*
// @match *://hanatsubaki.shiseidogroup.jp/comic*
// @match *://kawaii2ch.com/*
// @match *://leedcafe.com/*
// @match *://manga-park.com/title/*
// @match *://manga.line.me/*
// @match *://mangacross.jp/comics/*
// @match *://mangahack.com/comics/*
// @match *://matogrosso.jp/*
// @match *://news.mynavi.jp/series/*
// @match *://news.mynavi.jp/article/*
// @match *://note.mu/*
// @match *://online.ichijinsha.co.jp/*
// @match *://rookie.shonenjump.com/series/*
// @match *://rookie.shonenjump.com/users/*
// @match *://ruijianime.com/*
// @match *://sai-zen-sen.jp/comics/twi4/*
// @match *://seiga.nicovideo.jp/watch/*
// @match *://seiga.nicovideo.jp/comic/*
// @match *://souffle.life/author/*
// @match *://souffle.life/manga/*
// @match *://storia.takeshobo.co.jp/manga/*
// @match *://sukupara.jp/*
// @match *://to-ti.in/*
// @match *://urasunday.com/*
// @match *://watamote.com/*
// @match *://web-ace.jp/*
// @match *://webcomicgamma.takeshobo.co.jp/*
// @match *://webcomics.jp/*
// @match *://www.alphapolis.co.jp/manga/*
// @match *://www.comic-earthstar.jp/*
// @match *://www.comic-essay.com/episode/*
// @match *://www.comic-essay.com/neko/*
// @match *://www.comicbunch.com/manga/*
// @match *://www.comico.jp/challenge/*
// @match *://www.comico.jp/articleList*
// @match *://www.comico.jp/detail*
// @match *://www.comico.jp/challenge/detail*
// @match *://www.ebigcomic4.jp/title/*
// @match *://www.ganganonline.com/*
// @match *://www.jstage.jst.go.jp/*
// @match *://www.mangabox.me/reader/*
// @match *://www.moae.jp/comic/*
// @match *://*.moae.jp/lineup/*
// @match *://www.nicovideo.jp/search/*
// @match *://www.sunday-webry.com/detail*
// @match *://www.tatan.jp/*
// @match *://www.zenyon.jp/lib/*
// @match *://yasudadou.futene.net/*
// @match *://yawaspi.com/*
// @match *://yomitai.jp/*
// @match *://yusb.net/*
// @match *://comic-boost.com/*
// @match *://futabanet.jp/*
// @match *://hobbyjapan.co.jp/*
// @match *://comip.jp/*
// @match *://comic-action.com/episode/*
// @match *://www.comic-ryu.jp/*
// @match *://ashitano.tonarinoyj.jp/*
// @match *://debut.shonenmagazine.com/*
// @match *://medibang.com/*
// @match *://mangalifewin.takeshobo.co.jp/*
// @match *://nikkangecchan.jp/*
// @match *://www.mangabox.me/special/*
// @match *://www.gamespark.jp/*
// @match *://kodansha-cc.co.jp/*
// @match *://kinmaweb.jp/*
// @match *://pachikuri.jp/*
// @match *://comici.jp/*
// @match *://books.vipdoor.info/*
// @match *://mankai.jp/*
// @match *://cbiz.shueisha.co.jp/*
// @match *://comic-gardo.com/episode/*
// @match *://sokuyomi.jp/*
// @match *://bunshun.jp/*
// @match *://comic-polaris.jp/*
// @match *://www.yatate.net/*
// @match *://sonorama.asahi.com/*
// @match *://csbs.shogakukan.co.jp/book*
// @match *://www.comic-medu.com/*
// @match *://comic-zenon.com/episode/*
// @match *://sportsbull.jp/*
// @match *://magcomi.com/episode/*
// @match *://omocoro.jp/writer*
// @match *://www.sukima.me/book/title/*
// @match *://ddnavi.com/serial/*
// @match *://www.gentosha.jp/series/*
// @match *://www.gentosha.jp/article/*
// @match *://crea.bunshun.jp/*
// @match *://booklive.jp/*
// @match *://kansai.mag-garden.co.jp/*
// @match *://getnavi.jp/*
// @match *://mavo.takekuma.jp/*
// @match *://curazy.com/manga/*
// @match *://margaretbookstore.com/*
// @match *://4komagram.com/*
// @match *://kidsna.com/*
// @match *://dot.asahi.com/*
// @match *://animesoku.com/*
// @grant GM_addStyle
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_deleteValue
// @require https://code.jquery.com/jquery-3.3.1.min.js
// @namespace https://greasyfork.org/users/181558
// ==/UserScript==
// @match *://*/*

(function() {
  const PopupHelpMS = 4000; // ポップアップの表示時間
  const debug = 0; // verbose console.log dc()
  const LogMatch = 0; // 1でメタデータブロックを生成(開発用)

  const ButtonBG = "background-color:#3050f0;";

  const SITEINFO = [{ //
    url: '//animesoku.com/',
    sibling: '//div[@class="t_h"]/div[@class="t_b"]/span[1]/..',
  }, {
    url: '//dot.asahi.com/',
    firstEpisode: '//li[last()]/article/div/a/h2[@class="comicAuthorListTitle"]/..',
    lastEpisode: '//li[1]/article/div/a/h2[@class="comicAuthorListTitle"]',
    sibling: '//div[@class="comicAtclAreaPhoto"]/img/..',
    nextEpisode: '//li[@class="comicArticlePagerNext"]/a',
    prevEpisode: '//li[@class="comicArticlePagerPrev"]/a',
    pankuzuUp: '//li[@class="comicArticlePagerTop"]/a',
    author: '//div[@class="articlProfileInfo"]/p[@class="articlProfileNameTxt"]/a|//p[@class="comicAuthorNameTxt"]',
  }, {
    url: '//kidsna.com/',
    lastEpisode: '//ul/li[1]/div[@class="articlelist-content"]/div/a/h2',
    firstEpisode: '//ul/li[last()]/div[@class="articlelist-content"]/div/a/h2',
    author: '//div[@class="article-item-kidsna-link-publisher"]/div/div[@class="article-item-kidsna-link-title"]/p',
  }, { //
    url: '//4komagram.com/',
    sibling: '//div[@class="p-users-profile__posts"]/article',
    header: '//header',
    disableSnapWhenPageIsClicked: 1,
    author: '//h2[@class="p-users-profile__head__title u-align-center"]',
  }, {
    url: '//margaretbookstore.com/',
    firstEpisode: '//li[last()]/div[@class="bookItemStory"]/div[last()]/a',
    lastEpisode: '//li[1]/div[@class="bookItemStory"]/div/a',
  }, {
    url: '//curazy.com/manga/',
    firstEpisode: '//ul[@class="manga_tabContent_list"]/li[1]/a[@class="list_item_episode_stories"]/span[2]',
    lastEpisode: '//ul[@class="manga_tabContent_list"]/li[last()]/a/span[2]',
    author: '//div[@class="manga_mainContent manga_mainContent_basicInfoWrap"]/dl[1]/dd/a/span',
  }, {
    url: '//mavo.takekuma.jp/',
    firstEpisode: '//a[last()]/li/div/p[@class="mangatitle"]',
    lastEpisode: '//ul[@class="manga"]/a[1]/li/div/p[@class="mangatitle"]',
    sibling: '//img[@class="protector"]/..',
    header: '//html/body/nav[@id="header"]/div[@id="menu"]',
    pankuzuUp: '//div[@id="slide"]/div/a/img[@alt="タイトルへ戻る"]',
  }, {
    url: '//getnavi.jp/category/comic/|//getnavi.jp/comic/',
    firstEpisode: '//div[last()]/div[@class="category-color-before-comic"]/div[2]/a',
    lastEpisode: '//div[1]/div[@class="category-color-before-comic"]/div[2]/a',
    sibling: '//img/..',
    author: '//p[@class="name"]/a[@rel="author"]',
    pankuzuUp: '//div[@class="inner"]/div[@class="entry-content more"]/blockquote/p/a',
  }, {
    url: '//kansai.mag-garden.co.jp/',
    firstEpisode: '//div[@class="entry_contents multiple"]/div[2]/div[2]/ul[@class="btn"]/li[1]/a/span/..|//div[@id="back_number"]/div[last()]/div/ul/li/a',
    lastEpisode: '//div/div[@class="entry_box"]/div[2]/div[last()]/div[last()]/ul/li[1]/a/span',
  }, {
    url: '//booklive.jp/',
    firstEpisode: '//a/span[text()="まるごと無料試し読み"]/..',
    //  author: '//dl[@class="author clearfix"]/dd/a',
  }, { // ニコニコ静画(漫画)
    url: '//seiga.nicovideo.jp/watch/|//seiga.nicovideo.jp/comic/',
    sibling: '//div[@class="pages"]/ul/li', // //ul[contains(@id,"page_")]/..',// '//div[@class="note"]/..|//div[@class="note balloon_disabled"]/..|//div[@class="pages"]/ul/li',
    header: '//div[@id="siteHeaderInner"]',
    atamadashi: '//div[@class="note"]|//div[@class="note balloon_disabled"]|//img[@class="lazyload"]|//div[@class="pages"]/ul/li',
    author: '//div[@class="author"]/h3/span|//span[@class="author_name"]', // Amazonを基点に~の管轄
    firstEpisode: '//a[@class="first"]',
    lastEpisode: '//a[@class="last"]',
    prevEpisode: '//p[@class="prev"]/a',
    nextEpisode: '//span[@class="next_text"]|//a[@class="next"]',
    pankuzuUp: '//ul[@class="sg_pankuzu"]/li[last()-1]/a'
  }, {
    url: '//crea.bunshun.jp/',
    firstEpisode: '//div[@class="item cf"]/div[@class="box-right"]/div[last()]/a/p[@class="title"]/..',
    lastEpisode: '//div[@class="box-right"]/div[2]/a/p[@class="title"]',
    author: '//div[@class="box cf"]/div/h2[@class="name"]',
    sibling: '//figure[@class="image-area figure-center"]',
    header: '//header[@id="header"]',
  }, {
    url: '//www.gentosha.jp/series/|//www.gentosha.jp/article/',
    firstEpisode: '//div[@class="btnStyle01"]/a[text()="第1回から読む"]',
    lastEpisode: '//article[1]/a/div/h2[@class="title"]',
    author: '//ul[@class="authorList"]/li/label/cite',
    sibling: '//div[@id="content"]/div/div[1]/p/img/..|//div[@class="figure-center"]/img/..',
    nextEpisode: '//div[contains(@class,"seriesLink")]/ul/li[last()]/a',
    prevEpisode: '//div/div[contains(@class,"seriesLink")]/ul/li[1]/a',
    pankuzuUp: '//div[@id="container"]/div[@id="topicPath"]/ol/li[3]/a',
  }, {
    url: '//ddnavi.com/serial',
    sibling: '//article/div[2]/div/figure/img[contains(@class,"lazy")]/../..',
    nextEpisode: '//p[@class="buttonlink"]/a[contains(text(),">> 次のページに続く")]|//a[@class="next" and text()="次の回"]',
    prevEpisode: '//a[@class="prev" and contains(text(),"前の回")]',
    firstEpisode: '//ul/li[last()]/div[@class="archives-list__info fr"]/div/div/a[text()="続きを見る"]|//ul/li[last()-1]/div/div/div[@class="archives-list__link fr"]/a',
    lastEpisode: '//ul/li[1]/div/div[@class="clearfix"]/div/a[text()="続きを見る"]',
    author: '//span[@itemprop="author"]/span',
  }, {
    url: '//www.sukima.me/book/title/',
    firstEpisode: '//div[text()="最初から読む"]',
  }, {
    url: '//omocoro.jp/writer',
    lastEpisode: '//div[@class="details"]/div[3]/a[contains(text(),"漫画")]',
    firstEpisode: '//div[last()]/div[last()]/div[3]/a[contains(text(),"漫画")]',
  }, {
    url: '//sportsbull.jp/',
    firstEpisode: '//div[last()]/ul/li[last()]/div/div[2]/a[contains(text(),"読む!")]',
    lastEpisode: '//a[@data-is-free="1" and @class="comics_btn" and text()="読む!"]',
  }, {
    url: '//comic-zenon.com/episode/',
    author: '//h2[@class="series-header-author"]',
  }, {
    url: '//www.comic-medu.com/',
    firstEpisode: '//div[@class="btDetail"]/a[1]',
    lastEpisode: '//div[@class="btDetail"]/a[last()]',
    author: '//div[@class="author"]/div/h3',
  }, {
    url: '//csbs.shogakukan.co.jp/book',
    firstEpisode: '//a[@class="button is-link"]/span[contains(text(),"試し読み")]|//a[@class="button is-link"]/span/em[contains(text(),"まるごと試し読み")]',
  }, {
    url: '//sonorama.asahi.com/',
    firstEpisode: '//li[last()]/div[@class="series_comic_btn"]/a',
    lastEpisode: '//li[1]/div[@class="series_comic_btn"]/a',
    author: '//div[@class="m10 comic"]/div/a',
  }, {
    url: '//www.yatate.net/',
    firstEpisode: '//li[last()]/article/div[@class="detail"]/h1/a',
    lastEpisode: '//li[1]/article/div[@class="detail"]/h1/a',
  }, {
    url: '//comic-polaris.jp/',
    firstEpisode: '//a[text()="第1話を読む"]',
    lastEpisode: '//a[text()="最新話を読む"]',
  }, {
    url: '//bunshun.jp/',
    firstEpisode: '//li[last()]/div/h3[@class="title"]/a',
    lastEpisode: '//p[@class="latest-link"]/a',
    author: '//div/p[@class="name"]|//div/div[@class="author-box"]/p[@class="author"]/a',
    sibling: '//div[@class="image-with-link"]/a/img/../../..',
    nextEpisode: '//a[@class="arrow" and text()="NEXT"]',
    prevEpisode: '//div[@class="prev"]/a[@class="arrow"]',
    pankuzuUp: '//div[@class="series-title"]/h2/a',
  }, {
    url: '//sokuyomi.jp/',
    firstEpisode: '//div[2]/a[contains(text(),"無料で読む")]',
    //author: '//div[@class="author"]/a',
  }, {
    url: '//cbiz.shueisha.co.jp/',
    firstEpisode: '//ul[@class="pageLink"]/li/a[text()="第1話を読む"]',
    lastEpisode: '//ul[@class="pageLink"]/li/a[contains(text(),"最新話を読む")]',
    author: '//main[@class="sblab"]/section[@class="read"]/em',
  }, {
    url: '//mankai.jp/',
    firstEpisode: '//ul/li[1]/a[@class="js-viewerlink"]/h3/..',
    lastEpisode: '//ul/li[last()]/a[@class="js-viewerlink"]/h3',
    pankuzuUp: '//button[@value="作品一覧に戻る"]|//a[@class="gbFooterListLink" and contains(text(),"作品一覧")]',
    author: '//p[@class="modProfileArtistName"]',
  }, {
    url: '//books.vipdoor.info/',
    firstEpisode: '//dl[@id="comic-parts"]/dd[1]/ol/li[1]/a',
    lastEpisode: '//dd[last()]/ol[@class="comic-part-pages"]/li[last()]/a',
    nextEpisode: '//a[@rel="next"]',
    prevEpisode: '//a[@rel="prev"]',
    sibling: '//div[@id="article"]/ol/li/a/img',
    pankuzuUp: '//a[@class="page-nav-link"]',
  }, {
    url: '//comici.jp/',
    author: '//a[@class="prof-h-name-name"]|//div[@class="manga-info-userbox"]/div/div/a',
    pankuzuUp: '//div/a/span[@class="a-username"]',
    sibling: '//div[contains(@class,"manga-area")]/img',
    firstEpisode: '//div[last()]/h3[@class="manga-list-h"]/a|//div[last()]/h3[@class="rensai-list-h"]/a|//a[@class="btn" and text()="第1話から読む"]',
    lastEpisode: '//div[1]/h3[@class="manga-list-h"]/a|//div[1]/h3[@class="rensai-list-h"]/a|//a[@class="btn" and text()="最新話を読む"]',
    nextEpisode: '//div[@class="series-next-btn"]/a[@class="btn"]',
    prevEpisode: '//div[2]/div[@class="article-btn"]/a[contains(text(),"前話")]',
  }, {
    url: '//pachikuri.jp/',
    firstEpisode: '//div[@class="sakuhinFuncs__btnFirst"]/a',
    lastEpisode: '//div[@class="sakuhinFuncs__btnLatest"]/a',
    sibling: '//main[@id="js-manga"]/img|//main/span[@class="not_resizing"]/img',
    author: '//span[@class="sakuhinDtails__author"]|//div[@class="headline__txt__author--mangaHead"]',
    nextEpisode: '//a[contains(text(),"次の話へ")]',
    prevEpisode: '//a[@class="mangaFuncs__btn mangaFuncs__btn--prev"]',
    pankuzuUp: '//a[contains(text(),"作品紹介ページへもどる")]',
  }, {
    url: '//kinmaweb.jp/',
    sibling: '//div/a[@class="no-icon"]/img/..',
  }, { //
    url: '//kodansha-cc.co.jp/',
    firstEpisode: '//dl[last()]/dd/div/div[@class="pcv"]/a/div[@class="comic-more"]',
    lastEpisode: '//dl[1]/dd/div[@class="smanone2"]/div/a/div[@class="comic-more"]',
    author: '//div[@id="seriesHeader"]/ul/li'
  }, {
    url: '//www.gamespark.jp/',
    firstEpisode: '//div[@class="news-list"]/section[last()]/a[@class="link"]',
    lastEpisode: '//div[@class="news-list"]/section[1]/a[@class="link"]',
    sibling: '//article/div[@class="txt-center"]/a/img/..|//a/img[@class="inbody-img"]/..|//article/div[@class="txt-center"]',
    header: '//header[@class="thm-header"]/nav',
    pankuzuUp: '//div/article[contains(@class,"arti-body cf cXenseParse")]/div/a/b',
    disableSnapWhenPageIsClicked: 1,
  }, {
    url: '//www.mangabox.me/special/',
    firstEpisode: '//ul[@class="episodes_list"]/li[1]/a/div/div/span[1]',
    lastEpisode: '//li[last()]/a/div/div/span[@class="episodes_strong_text is_new"]',
  }, {
    url: '//nikkangecchan.jp/',
    firstEpisode: '//div[@class="button"]/a[text()="1話から読む"]',
    lastEpisode: '//div[contains(@class,"btnBox")]/div/a[text()="最新話を読む"]',
    author: '//div[@class="author"]'
  }, {
    url: '//mangalifewin.takeshobo.co.jp/',
    firstEpisode: '//div/div[contains(@class,"extMdlSeriesMngrBookInner")]/ul[last()]/li[last()]/div[@class="bookR"]/table[@cellpadding="5"]/tbody/tr[2]/td[1]/a',
    lastEpisode: '//ul[@class="bookul"]/li[1]/div[@class="bookR"]/table[@width="100%" and @cellpadding="5"]/tbody/tr[last()]/td[last()]/a',
    sibling: '//div[@class="extMdlSeriesMngrArticleMargin"]/a/img/..|//div[@class="extMdlSeriesMngrArticle-inner"]/div/img',
    author: '//p[@class="cAuthorName"]'
  }, {
    url: '//medibang.com/',
    firstEpisode: '//div[last()]/div/div[last()]/a[@class="btn read"]|//li/div/a[@class="jq_readFixed" and contains(text(),"WEBで読む")]',
    lastEpisode: '//div[1]/div/div[@class="btn_area"]/a[@class="btn read"]',
  }, {
    url: '//debut.shonenmagazine.com/',
    firstEpisode: '//div[last()]/div/div[@class="card-cmn-comic-in"]/div[@class="box-detail"]/div/a[@class="box-detail__link-group"]/h3/span',
    lastEpisode: '//div[1]/div/div[@class="card-cmn-comic-in"]/div/div/a[@class="box-detail__link-group"]/h3/span',
    author: '//div[@class="box-profile-small-01"]/div[@class="txt-normal"]/a'
  }, {
    url: '//ashitano.tonarinoyj.jp/',
    firstEpisode: '//div[@id="contributor-work-list-theme-item-wrap"]/section[last()]/a/h3/span/../..|//section[1]/a/div/p[@class="series-episode-number"]|//div[last()]/section[@class="contributor-work-item"]/a/div/div[1]/h3/span',
    lastEpisode: '//section[@id="contributor-work-list"]/div[1]/section/a/div/div/h3/span|//section[last()]/a/div[@class="series-item-status"]/p',
    author: '//section[@class="contributor-profile js-contributor-profile"]/h1|//div/div[@class="series-contributor"]/a/p[@class="series-profile-name"]/span'
  }, {
    url: '//www.comic-ryu.jp/',
    firstEpisode: '//li[last()]/p[@class="readbtn"]/a',
    lastEpisode: '//li[2]/p[@class="readbtn"]/a/span',
    nextPage: '//a[@id="NextLink" and @title="次ページ"]',
    prevPage: '//a[@id="PrevLink" and @title="前ページ"]',
    nextEpisode: '//div[@id="NextGo"]/a[@id="nextLast"]',
    pankuzuUp: '//div[@id="toback"]/a[text()="作品ページへ戻る"]',
    author: '//div/div[@class="namebox"]/p[@class="name"]/span',
  }, {
    url: '//comip.jp/',
    firstEpisode: '//div[@class="column_main"]/ul/li[last()]/div[@class="thumb"]/a',
    lastEpisode: '//div[@class="column_main"]/ul/li[1]/div[@class="thumb"]/a',
    author: '//div[@class="creator"]'
  }, { // ツイ4(1)
    url: '//sai-zen-sen.jp/comics/twi4/',
    sibling: '//article',
    //    header: '//body/header/div[1]',
    atamadashi: '//article[last()]',
    author: '//h3[1]/span[@class="work-author"]',
    lastEpisode: '//article[last()]/header/div/h3',
  }, { // 花椿
    url: '//hanatsubaki.shiseidogroup.jp/comic',
    sibling: '//div/figure/img/../../../../../../../..', //'|//section/div',
    header: '//div[@class="controller"]/div[1]',
    author: '//div[@class="row text-center"]/div[@class="col col-8 col-sm-12 person"]/div[@class="grid"]/div[@class="row text-left"]/div[last()]/h4[1]'
  }, { // web漫画アンテナ
    url: '//webcomics.jp/',
    sibling: '//div[@class="entry"]',
    header: '//div[@id="header"]',
    disableSnapWhenPageIsClicked: 1,
  }, { // bokete
    url: '//bokete.jp/',
    sibling: '//div/div/div[@class="boke"]',
    header: '//div/div[@id="top-bar"]',
    disableSnapWhenPageIsClicked: 1,
  }, { //
    url: '//ruijianime.com/',
    sibling: '//div[@class="sm_one_tag_search recent_tag"]|//div[@class="sm_one"]',
    disableSnapWhenPageIsClicked: 1,
  }, { // コミックぜにょん
    url: '//www.zenyon.jp/lib/',
    sibling: '//div[@id="viewer_content"]/img',
    nextEpisode: '//a/img[@class="btn_next"]/..',
    author: '//p[@class="author"]',
    firstEpisode: '//div/ul[@id="sakuhin_backnumber_ul"]/li[last()]/a[text()="1"]',
    lastEpisode: '//p[@class="sakuhin_btn_new"]/a/img/..',
    pankuzuUp: '//a/img[@alt="作品ページへ" and @class="btn_sakuhin"]/..',
  }, { //
    url: '//souffle.life/manga/',
    sibling: '//div[@class="sf-content_img"]/img',
    header: '//div[@id="sf-scroll_header"]',
    nextEpisode: '//span[@class="sf-next_btn"]/a',
    prevEpisode: '//span[@class="sf-before_btn"]/a',
    firstEpisode: '//section[1]/div[@class="sf-content sf-authors"]/section[@class="sf-content_books_related"]/div/article[3]/div/div[@class="sf-contents_book_read"]/a', ////article[last()]/div/div[@class="sf-contents_book_read"]/a',
    lastEpisode: '//div[@class="alm-reveal"]/article[1]/div[@class="sf-content_book_description"]/div/a',
    pankuzuUp: '//p[@class="sf-content_book_name"]/a',
    author: '//span[@class="sf-author_name"]',
  }, { //
    url: '//souffle.life/author/',
    firstEpisode: '//section[1]/div[@class="sf-content sf-authors"]/section[@class="sf-content_books_related"]/div/article[3]/div/div[@class="sf-contents_book_read"]/a', ////article[last()]/div/div[@class="sf-contents_book_read"]/a',
    lastEpisode: '//div[@class="alm-reveal"]/article[1]/div[@class="sf-content_book_description"]/div/a',
    author: '//span[@class="sf-author_name"]',
  }, { //
    url: '//www.moae.jp/comic/|.moae.jp/lineup/',
    sibling: '//div[@class="img"]/a/img/../..',
    lastEpisode: '//ul[@class="detail-trial"]/li[1]/a',
    author: '//section/section[@class="mod-profile-block"]/dl/dt',
    pankuzuUp: '//li[@class="lineup"]/a/img'
  }, { // コミックエッセイ劇場
    url: '//www.comic-essay.com/episode/',
    sibling: '//div[@class="manga-imgs"]/img',
    prevEpisode: '//ul/li[@class="prev"]/a',
    nextEpisode: '//li[@class="next"]/a',
    firstEpisode: '//div[@class="cell a_t"]/p[@class="ro_t abg_text"]',
    lastEpisode: '//a[@class="ro"]/p[last()]',
    author: '//p[@class="author"]|//a/span[@class="name"]',
    pankuzuUp: '//ul[@class="breadcrumb wrap c-fix"]/li[last()-1]/a'
  }, { //
    url: '//www.comic-essay.com/neko/',
    sibling: '//article/div[@class="scene"]/img',
    header: '//body/div[@id="pagetop"]/header',
    nextEpisode: '//div[2]/ul/li[last()]/a[text()="次の話"]',
    prevEpisode: '//div[@class="pagenation pc"]/ul/li/a[contains(text(),"前の話")]',
    disableSnapWhenPageIsClicked: 1,
    author: '//div[@class="txtarea"]/h4[@class="ttl-name"]',
    firstEpisode: '//li[1]/a[@class="btn-episode"]/p/..',
    lastEpisode: '//div[@class="episode-new"]/a/p|//li[last()]/a[@class="btn-episode"]/p/..',
    pankuzuUp: '//div[@id="pagetop"]/ul/li[last()-1]/a',
  }, { // 裏サンデー
    url: '//urasunday.com/',
    sibling: '//img[@class="dumimg"]/..',
    //      nextEpisode: '//div[@id="prBanner"]/a[contains(text(),"次の話を今すぐ読む!! →")]',
    firstEpisode: '//div[@class="comicInner"]/ul[2]/li[1]/a',
    lastEpisode: '//div[@class="comicButtonDateBox"]/a',
    author: '//li[@class="detailComicTitle"]/h2|//div[@id="comicDetail"]/h2|//div[@class="author"]',
    pankuzuUp: '//li/a[@href="../index.html"]',
    func: function() { $(eleget0('//div[@id="btn-scale"]/div[1]/div[text()="拡大"]')).click(); }
  }, { // やわらかスピリッツ
    url: '//yawaspi.com/',
    sibling: '//div/div[@class="page__detail__vertical"]/div/ul/li/img/..|//section[@class="comicContainer"]/a/img[1]/..|//div[@class="vertical__inner"]/ul/li/img',
    firstEpisode: '//section[@class="page__detail"]/div[@class="page__detail__inner"]/div[@class="detail__image"]/span|//ul[@class="inner__content"]/li[last()]/a/dl/dt',
    lastEpisode: '//ul[@class="inner__content"]/li/a/dl/dt|//li[@class="-new"]/a/dl/dt',
    author: '//li[@class="comicDetails"]/hgroup[1]/h2|//header[@class="header -page"]/div[@class="page__header"]/p/strong',
    pankuzuUp: '//li[@class="browserCtrlLeft"]/a'
  }, { // コミックバンチ
    url: '//www.comicbunch.com/manga/',
    sibling: '//div[@class="view"]/a/img/..|.//span[@class="guard_np"]/../..',
    nextEpisode: '//ul[@class="btn cf"]/li/a[text()="次の話"]',
    prevEpisode: '//ul[@class="btn cf"]/li/a[text()="前の話"]',
    firstEpisode: '//div[@class="backnumber cf"]/ul/li[last()]/a',
    lastEpisode: '//div[@class="backnumber cf"]/ul[@class="cf"]/li[1]/a',
    author: '//div[@id="comics"]/h4|//div[@class="title"]/h3',
    pankuzuUp: '//a[text()="作品紹介"]'
  }, { // コミックDAYS他
    url: '//comic-days.com/episode/|//tonarinoyj.jp/episode/|//shonenjumpplus.com/episode/|//kuragebunch.com/episode/|//pocket.shonenmagazine.com/episode/|//viewer.heros-web.com/episode/|//comic-action.com/episode/|//comic-gardo.com/episode/|//magcomi.com/episode/',
    author: '//h2[@class="series-header-author"]', //'//div/h2[@class="series-header-author"]'
  }, { //
    url: '//ganma.jp/',
    author: '//h4[@class="ng-binding"]',
    firstEpisode: '//a[@class="detail-action-some"]',
    lastEpisode: '//ol[@class="story"]/li/a/div/time[not(contains(text(),"配信予定"))]/../..',
  }, { //
    url: '//www.sunday-webry.com/detail',
    author: '//div[@class="detail-block__image--author"]',
    firstEpisode: '//a[last()]/div/div[@class="detail-block__item--title"]',
    lastEpisode: '//div[@class="detail-block__item--latest"]',
  }, { //
    url: '//rookie.shonenjump.com/series/|//rookie.shonenjump.com/users/',
    //    sibling: '//p[@class="page-area js-page-area"]/img/..',
    //    header: '//header[@id="header"]/div/h2',
    //nextEpisode: '//a[contains(text(),"続きを読む")]',
    author: '//span[@class="user-name"]/a/strong|//h2[@class="user-name"]|//p[2]/a/span[@class="user-name"]',
    firstEpisode: '//li[1]/a/p[1]/span/../..',
    lastEpisode: '//li[last()]/a/p[1]/span/../..',
    pankuzuUp: '//a[contains(text(),"作品ページへ")]|//a/span[@class="series-title"]',
  }, { //
    url: '//www.comico.jp/challenge/|//www.comico.jp/articleList',
    author: '//p[contains(@class,"__author")]/a',
    firstEpisode: '//div[contains(@class,"list-episode02__body")]/p[text()="第1話"]/../..|//a[@class="list-episode02__item-inner _articleListItem" and @data-articleno="1"]/div/div[1]/div[@class="list-episode02__label-group  "]|//ul/li[1]/a/div/p[contains(@class,"list-episode")]',
    lastEpisode: '//ul[@class="list-episode02__list _articleList"]/li[last()]/a[@data-is-sell="true"]/div/p/../..|//a[text()="続きから読む"]|//ul/li[last]/a/div/p[contains(@class,"list-episode")]',
  }, { //
    url: '//www.comico.jp/detail|//www.comico.jp/challenge/detail',
    prevEpisode: '//a/img[@alt="前の話"]/..',
    nextEpisode: '//a/img[@alt="次の話"]/..',
    author: '//p[contains(@class,"__author")]/a',
    pankuzuUp: '//a/img[@alt="話一覧"]/..',
  }, { //
    url: '//daysneo.com/works/',
    author: '//div/p[@class="author"]/a[1]',
    firstEpisode: '//li[1]/div[last()]/dl/dt/strong/a',
    lastEpisode: '//li[last()]/div[last()]/dl/dt/strong/a',
    pankuzuUp: '//a[text()="作品詳細ページへ"]',
    nextEpisode: '//span[text()="次の話へ"]',
  }, { //
    url: '//ebookjapan.yahoo.co.jp/',
    disableSnapWhenPageIsClicked: 1,
    author: '//p[@class="book-main__author"]/a|//p[@class="book-main__author underline"]/a',
    //    firstEpisode: '//a[@class="btn btn--primary btn--read btn--sub-text" and contains(text(),"無料")]|//a[@class="btn btn--primary btn--read btn--sub-text" and contains(text(),"試し読み")]',
    //    lastEpisode: '',
    firstEpisode: '//a[@class="btn btn--primary btn--read" and text()="始めから読む"]|//a[@class="btn btn--primary btn--read btn--sub-text" and contains(text(),"無料")]|//a[@class="btn btn--primary btn--read btn--sub-text" and contains(text(),"試し読み")]|//li[last()]/div/div[@class="book-item__actions"]/a[contains(@class,"btn")]/strong[text()="無料"]',
    lastEpisode: '//li[1]/div[@class="book-item book-item--disp-list book-item--btn-include-single"]/div[2]/a/strong',
  }, { //
    url: '//mangacross.jp/comics/',
    author: '//div[@class="comic-area__author"]|//p[@class="viewer-page__author"]',
    firstEpisode: '//a[text()="1話から読む"]|//a[text()="第1話を読む"]',
    lastEpisode: '//a[text()="最新話を読む"]|//ul[@class="episode-list"]/li[1]/a/div[2]'
  }, { //
    url: '//comic.mag-garden.co.jp/',
    author: '//div/div[@class="inner"]/h3'
  }, { //
    url: '//www.mangabox.me/reader/',
    author: '//div/p[@class="episodes_author"]',
    lastEpisode: '//SPAN[@class="episodes_strong_text is_new"]/../..',
    firstEpisode: '//li[last()]/a/div/div[@class="episodes_item_detail"]/span'
  }, { //
    url: '//cycomi.com/fw/cycomibrowser/chapter/',
    firstEpisode: '//a[1]/div/p[@class="chapter-title"]',
    lastEpisode: '//a[last()]/div/p[@class="chapter-title"]',
    author: '//p[@class="title-author"]',
    pankuzuUp: '//a[text()="作品TOP"]',
  }, { //
    url: '//mangahack.com/comics/',
    sibling: '//div[@class="comic_img"]/img/..',
    header: '//header[1]',
    nextEpisode: '//li[@class="right"]/a',
    author: '//div[@class="nameArea cf"]/div[@class="official"]/a|//div/div[@class="comicTitle cf"]/ul/li/span[@class="c_name"]/a',
    firstEpisode: '//a[text()="はじめから読む"]',
    lastEpisode: '//li[last()]/a[text()="最新話を読む"]',
    prevEpisode: '//li[@class="left"]/a',
    pankuzuUp: '//div[1]/ul[@class="cf"]/li/span[1]/a',
  }, { //
    url: '//manga-park.com/title/',
    author: '//p[@class="author txtColorSubject"]',
  }, { //
    url: '//www.alphapolis.co.jp/manga/',
    author: '//div/div[@class="author"]/span/a[1]|//div[@class="mangaka"]/a|//div[@class="author-label"]/div[2]/a',
    firstEpisode: '//div[@class="first-time-free"]/a[contains(text(),"第1回を無料で読む")]|//section/div[@class="manga-detail-toc section"]/div[@class="toc"]/div[contains(@class,"episode-list")]/a[last()]/div[2]/div[1]',
    lastEpisode: '//div[@class="episode-list"]/a[1]/div/div[1]/../..',
  }, { //
    url: '//web-ace.jp/',
    sibling: '//div[@class="box inner viewerImageBox"]/a/img[1]/../../..',
    nextEpisode: '//section/div/div/a[text()="次の話へ"]',
    prevEpisode: '//a[text()="前の話へ"]',
    firstEpisode: '//a[contains(text(),"最初から読む")]',
    lastEpisode: '//ul/li[1]/a/div/div[@class="media-body"]/p[@class="text-bold"]',
    pankuzuUp: '//a[text()="作品TOPへ"]',
  }, { //
    url: '//comic.webnewtype.com/contents/',
    sibling: '//div[@id="viewerContainer"]/div/div[@class="box inner viewerImageBox"]/a/img[1]/../../..',
    nextEpisode: '//a/img[@alt="次の話"]/..',
    prevEpisode: '//header[@class="ViewerHeader"]/nav/a/img[@alt="前の話へ"]/..',
    author: '//span[@class="WorkSummary-headerinfo"]',
    firstEpisode: '//a[contains(text(),"最初から読む")]|//ul[@id="episodeList"]/li[last()]/a/div/div[last()]/p',
    lastEpisode: '//section/ul/li[1]/a/div/h3[@class="ListCard-title"]/../..|//li[1]/a/div[2]/div[2]/p[@class="number"]',
    pankuzuUp: '//h1[@class="ViewerHeader-title"]/a',
    atamadashiDelay: 600
  }, { //
    url: '//www.ebigcomic4.jp/title/',
    lastEpisode: '//span[@class="episodeName"]',
  }, { //
    url: '.5ch.net/',
    sibling: '//div[@class="post"]', //'//dl[@class="thread"]/dt|//span[@class="number"]/../..',
    header: '//nav[@class="navbar-fixed-top search-header"]/div',
    disableSnapWhenPageIsClicked: 1,
  }, { //
    url: '//www.ganganonline.com/',
    firstEpisode: '//ul[@class="past_2c"]/li[1]/a/span/strong|//a[@class="gn_link_list"]/span/strong[contains(text(),"第1話")]|//a[@class="gn_link_list"]/span/strong[contains(text(),"第一話")]|//a[@class="gn_link_list"]/span/strong[contains(text(),"第1章")]',
    lastEpisode: '//li[5]/a[@class="gn_link_btn"]/img[@alt="読む"]/..|//dl[@class="clearfix"]/dd/ul/li[@class="gn_detail_story_btn"]/a[@class="gn_link_btn"]/img[@alt="読む"]',
  }, { //
    url: '//watamote.com/',
    sibling: '//span[@class="res"]/..',
    disableSnapWhenPageIsClicked: 1,
  }, { //
    url: '//news.mynavi.jp/series/|//news.mynavi.jp/article/',
    sibling: '//img[@class="photo_table__img lazyload"]|//td/img[@class="lazyload" and @src="images/001.jpg"]',
    author: '//a[@class="article-author__name"]|//div[@class="article-author"]/a',
    firstEpisode: '//div/section[last()]/div[@class="tile3__link js-link"]/div[@class="tile3__thumb"]/div/img[@class="tile3__img"]|//div/main[@class="main"]/section/table[@class="table"]/tbody/tr[last()]/td/a[@class="table__link"]',
    lastEpisode: '//section[1]/div/div/div[@class="tile3__img-wrap"]/img|//main[@class="main"]/section[@class="box"]/table[@class="table"]/tbody/tr[1]/td[@class="table__td"]/a',
  }, { //
    url: '//matogrosso.jp/',
    sibling: '//div[@class="asset-body"]/div/img|//div[@class="asset-body"]/img|//div[@class="asset-body"]/div/div/img|//div[@class="asset-content entry-content"]/img',
    author: '//h3[@class="widget-header"]/a',
    firstEpisode: '//div[@class="asset-content"]/div[@class="asset-body"]/dl/dd[last()]/a',
    lastEpisode: '//div[@class="asset-body"]/dl/dd[1]/a',
    pankuzuUp: '//h3[@class="widget-header"]/a[1]',
  }, { //
    url: '//sukupara.jp/',
    sibling: '//div[@class="magarea"]/img/..',
    //    nextEpisode: '//li[@id="next-page-btn"]/a/img', //uAutoPagerizeを使うべき
    //    prevEpisode: '//li[@id="prev-page-btn"]/a/img', //uAutoPagerizeを使うべき
    author: '//div[@id="artist"]/dl/dt',
    firstEpisode: '//a/img[@alt="第1回はコチラから"]',
    lastEpisode: '//p[@class="newest-story-tit"]/a',
    pankuzuUp: '//ul[@class="menulist clearfix"]/li[last()-1]/a',
  }, { //
    url: '//cho-animedia.jp/comic_category/|//cho-animedia.jp/comic/',
    sibling: '//div[@class="contents"]/p/img', //'//section[@class="contents_area"]/div[@class="contents"]', //
    header: '//html/body/header[@class="fixed"]',
    nextEpisode: '//dl[last()]/dt/a/img[@class="attachment-full size-full wp-post-image"]/..',
    prevEpisode: '//dl[1]/dt/a/img[@class="attachment-full size-full wp-post-image"]/..',
    firstEpisode: '//li[last()]/a/div[@class="photo"]/img/../..',
    lastEpisode: '//li[1]/a/div[@class="photo"]/img/../..',
    pankuzuUp: '//div[@class="breadcrumbs"]/ul/li[last()-1]/a',
  }, { //
    url: '//leedcafe.com/',
    author: '//div[@class="creator-header clearfix"]/h2/a',
    lastEpisode: '//div[1]/div/div/div/p/a[@class="btn btn-default"]',
    firstEpisode: '//div[last()]/div/div[@class="inner"]/div/p/a[@class="btn btn-default" and text()="この話を読む"]',
  }, { //
    url: '//storia.takeshobo.co.jp/manga/',
    author: '//div[@class="name_intro_author"]',
    firstEpisode: '//div[last()]/div[@class="box_episode_text"]/a[@class="btn"]',
    lastEpisode: '//div[last()]/div[1]/div[@class="box_episode_text"]/a[1]',
    pankuzuUp: '//a[text()="作品ページへ"]',
  }, { //
    url: '//www.tatan.jp/',
    sibling: '//div[@id="viewer_content"]/img',
    nextEpisode: '//a/img[@class="btn_next"]',
    prevEpisode: '//a/img[@class="btn_prev"]',
    author: '//p[@class="author"]',
    firstEpisode: '//ul[@id="sakuhin_backnumber_ul"]/li/a[text()="1"]',
    lastEpisode: '//a/img[@alt="最新話を読む"]/..',
    pankuzuUp: '//a/img[@class="btn_sakuhin"]/..',
  }, { //
    url: '//cakes.mu/',
    sibling: '//img[@class="dropshadow"]/..|.//div[5]/p/img/..|//div[4]/div[@class="article-content"]/h1', //|//div[@class="article-content"]/h1',
    header: '//header[@class="postHeader"]',
    nextEpisode: '//li[@class="navi-items next"]/a[@data-ga="post:header:next"]',
    prevEpisode: '//li[@class="navi-items prev"]/a[@data-ga="post:header:previous"]',
    author: '//div/p[@class="post-author"]/span|//div[@data-cakes-amazon=""]/div[@id="container_right"]/div/h3/a',
    firstEpisode: '//li[last()]/h3[@class="post-title-full"]/a',
    lastEpisode: '//li[1]/h3[@class="post-title-full"]/a',
    pankuzuUp: '//h2[@class="post-title"]/a',
  }, { //
    url: '//kawaii2ch.com/',
    sibling: '//div[contains(@class,"t_h")]/div/..|//a[@class="related-entry-title-link"]/../../../..',
    disableSnapWhenPageIsClicked: 1,
  }, { //
    url: '//comicpash.jp/',
    sibling: '//main[@class="manga row"]/img',
    author: '//p[@class="mangaMainTitle__name"]',
    firstEpisode: '//a[contains(text(),"第1話を読む")]',
    lastEpisode: '//a/em[contains(text(),"最新話")]/..',
    pankuzuUp: '//section[@typeof="BreadcrumbList"]/div[@class="row"]/span[2]/a/span/..',
  }, { //
    url: '//www.nicovideo.jp/search/',
    sibling: '//li[@class="item nrn-thumb-info-done"]',
    header: '//div[@id="siteHeader"]',
    disableSnapWhenPageIsClicked: 1,
  }, { //
    url: '//www.jstage.jst.go.jp/',
    sibling: '//ul[@class="search-resultslisting"]/li',
    header: '//body/span[@class="noprint"]/header/nav',
    disableSnapWhenPageIsClicked: 1,
  }, { //
    url: '//ci.nii.ac.jp/',
    sibling: '//div[@class="listitem xfolkentry"]/..',
    header: '//div[@id="nav-content"]',
    disableSnapWhenPageIsClicked: 1,
  }, { //
    url: '//comic.pixiv.net/viewer/',
    pankuzuUp: '//div[@class="series-summary"]/div/a',
    prevEpisode: '//li[@class="prev-story story-navigation"]/a',
    nextEpisode: '//li[@class="next-story story-navigation"]/a',
  }, { //
    url: '//comic.pixiv.net/works/',
    author: '//div[@class="works-author"]',
    firstEpisode: '//a[text()="最初から読む"]',
    lastEpisode: '//a[1]/div/div[@class="episode-num"]/../..',
  }, { //
    firstEpisode: '//div[@id="product_state"]/ul/li[1]/a',
    lastEpisode: '//li[last()]/a[@class="link-over"]',
    url: '//comic-fuz.com/',
    disableSnapWhenPageIsClicked: 1,
    author: '//div/div[contains(@class,"author")]/div/p/a',
    pankuzuUp: '//button[@title="閲覧をやめる"]',
  }, { //
    url: '//comicawa.com/TitleDetail/',
    firstEpisode: '//div[@role="button" and text()="はじめから読む"]',
    lastEpisode: '//div[@role="button" and text()="最新話を読む"]',
  }, {
    url: '//manga.line.me/',
    firstEpisode: '//li[1]/a[@data-action="read" and @data-is_rich=""]/span/..|//a[@class="MdBtn03Read01" and contains(text(),"最初から読む")]|//div[last()]/div[@class="mdIND13Txt"]/a/h3',
    lastEpisode: '//li[3]/a[@data-action="read" and @data-is_rich=""]/span/..|//div[@class="fnAutoPagingContainer"]/div[1]/div/a/h3',
    nextEpisode: '//a[@class="fnButtonNextChapter"]'
  }, { //
    url: '//to-ti.in/',
    disableSnapWhenPageIsClicked: 1,
    firstEpisode: '//div[@class="page_pager"]/p[@class="prev"]/a/span',
    lastEpisode: '//div[@class="page_pager"]/p[@class="next"]/a/span',
    author: '//div[@class="profile"]/div/div/p[@class="name"]',
    nextEpisode: '//a[@class="next" and text()="次のエピソード"]',
    prevEpisode: '//a[@class="prev" and text()="前のエピソード"]',
    pankuzuUp: '//div[@class="content"]/h2/a',
  }, { //
    url: '//yomitai.jp/',
    sibling: '//li[@class=""]/figure/img/../..',
    nextEpisode: '//li[@id="article-nav-next"]/a',
    prevEpisode: '//li[@class="series-prev"]/a',
    disableSnapWhenPageIsClicked: 1,
    author: '//figcaption[@class="author-name"]',
    firstEpisode: '//ul[@class="list"]/li[last()]/div/h3/a',
    lastEpisode: '//ul[@class="list"]/li[1]/div/h3/a',
    pankuzuUp: '//a/figure/figcaption[text()="連載の一覧はこちら"]',
  }, { //
    url: '//comic-trail.jp/',
    disableSnapWhenPageIsClicked: 1,
    author: '//div[@class="series-detail"]/h2',
    firstEpisode: '//a[contains(text(),"1話を読む")]',
    lastEpisode: '//a[contains(text(),"最新話を読む")]',
  }, { //
    url: '//gammaplus.takeshobo.co.jp/',
    disableSnapWhenPageIsClicked: 1,
    author: '//div[@class="name_intro_author"]',
    firstEpisode: '//div[last()]/div[last()-1]/div/a[contains(text(),"読む")]',
    lastEpisode: '//a[@class="btn" and text()="最新エピソードを読む"]|.//section[@class="episode"]/div/div[1]/div/a[1]',
  }, { // note
    url: '//note.mu/',
    sibling: '//a[@rel="noopener noreferrer" and @class="o-noteContentImage__itemLink a-link"]/img/../..',
    header: '//div[@id="__layout"]/div/header',
    nextEpisode: '//a[@class="o-sliblingNote__link o-sliblingNote__link--next a-link"]/div',
    prevEpisode: '//a[@class="o-sliblingNote__link o-sliblingNote__link--prev a-link"]/div',
    disableSnapWhenPageIsClicked: 1,
    author: '//div[@class="o-noteContentHeader__name"]/a',
  }, { // コミックアース・スター
    url: '//www.comic-earthstar.jp/',
    disableSnapWhenPageIsClicked: 1,
    author: '//section[@id="comic_info"]/span[@class="title_span"]',
    firstEpisode: '//li[last()]/span/a[@class="on_m readbtn2"]',
    lastEpisode: '//td/a[@class="new_read_btn"]',
  }, { //
    url: '//comic-walker.com/',
    disableSnapWhenPageIsClicked: 1,
    firstEpisode: '//ul[@class="acBacknumber-list first-preview clearfix"]/li[1]/a[@target="_self"]',
    lastEpisode: '//div[@class="container"]/div/p[@class="btn-detailLink link-p"]/a',
  }, { //
    url: '//webcomicgamma.takeshobo.co.jp/',
    disableSnapWhenPageIsClicked: 1,
    author: '//div[@class="name_intro_author"]',
    firstEpisode: '//div[@class="box_episode"]/div[last()]/div/a[contains(text(),"このエピソードを読む")]|//div[last()]/div[@class="box_episode_text"]/a[contains(text(),"このエピソードを読む")]',
    lastEpisode: '//a[contains(text(),"最新エピソードを読む")]|//div[1]/div[@class="box_episode_text"]/a[text()="このエピソードを読む"]',
  }, { //
    url: '//online.ichijinsha.co.jp/',
    disableSnapWhenPageIsClicked: 1,
    firstEpisode: '//li[last()]/ul/li/a[@class="pc"]',
    lastEpisode: '//div[contains(@class,"read")]/a[@class="pc corner"]',
  }, { //
    url: '//comic-meteor.jp/',
    author: '//div[@class="work_author_intro_name"]',
    firstEpisode: '//div[last()]/div/div[2]/a[text()="読む"]|//a[text()="第1話を読む"]',
    lastEpisode: '//a[text()="最新話を読む"]|//div[@class="latest_info_link_btn01"]/a',
    pankuzuUp: '//div[@class="topics d-none d-sm-block"]/ul/li[last()-1]/a|//div[@class="leaflet-inner"]/a[@alt="作品ページに戻る"]',
  }, { //
    url: '//yasudadou.futene.net/',
    sibling: '//tr',
    nextEpisode: '//a/img[@src="http://yasudadou.futene.net/kyoutuu4_next.png"]/..',
    prevEpisode: '//a/img[@src="http://yasudadou.futene.net/kyoutuu2_back.png"]/..',
    disableSnapWhenPageIsClicked: 1,
  }, { //
    url: '//curazy.com/',
    sibling: '//div/div/p/img/..',
    header: '//body/div[@id="page"]/header/div',
    nextEpisode: '//span[contains(text(),"次ページ:")]|//span[@class="curazy-link-btn__paging"]/i[@class="fa fa-arrow-circle-right"]',
    disableSnapWhenPageIsClicked: 1,
  }, { //
    url: '.yucl.net/',
    sibling: '//div[@class="clearfix"]/p/a/img/../..|//div[last()]/div[1]/figure/img/..',
    nextEpisode: '//div[@class="next-arrow"]/..',
    prevEpisode: '//div[@class="prev-arrow"]/..',
    lastEpisode: '//div[@class="clearfix"]/ul/li[1]/a|//li[1]/div/div[last()]/a',
  }, { //
    url: '//yusb.net/',
    sibling: '//p/img/..',
    nextEpisode: '//div[@class="next-arrow"]/..',
    prevEpisode: '//div[@class="prev-arrow"]/..',
  }, { //
    url: '//grapee.jp/',
    sibling: '//div[@class="image"]/img/..',
    disableSnapWhenPageIsClicked: 1,
    pankuzuUp: '//ul[@typeof="BreadcrumbList"]/li[last()-1]/*',
  }, { //
    url: '//arklightbooks.com/comics/',
    firstEpisode: '//dl[1]/dd/p[@class="arrow jp_bold"]/a',
    lastEpisode: '//dl[last()]/dd/p[@class="arrow jp_bold"]/a',
  }, {
    url: '//comic-boost.com/',
    firstEpisode: '//ul/li[last()]/div/ul/li/a[@class="button button_ico_cart" and contains(text(),"読む")]',
    lastEpisode: '//a[@class="button button_ico_cart" and contains(text(),"読む")]',
    author: '//div[@class="detail"]/p/a[@class="author_name"]',
  }, {
    url: '//futabanet.jp/',
    firstEpisode: '//div[last()]/a[@rel="noopener"]/span',
    lastEpisode: '//div[1]/a[@rel="noopener"]/span[2]',
    author: '//div[@class="detail-ex__writer"]',
  }, {
    url: '//hobbyjapan.co.jp/',
    firstEpisode: '//ul[last()]/li[3]/a[@class="btn_readcomic"]',
    lastEpisode: '//div[@class="page_container series_detail"]/div/div[2]/ul[1]/li[3]/a',
    author: '//ul[@class="book_intro_list"]/li/a'
  }, {
    url: '//comicride.jp/',
    firstEpisode: '//div[@id="contents"]/div/div[1]/div[1]/a[@data-wpel-link="internal"]/img/..',
    lastEpisode: '//div[@id="main"]/div[1]/div[last()]/a/img',
    author: '//div[@id="nav"]/ul/li[1]'
  }, {
    url: '//www.comic-valkyrie.com/',
    firstEpisode: '//div[@class="box_wrap"]/div[last()]/div[@class="right"]/a[@class="read_bt" and text()="読む"]',
    lastEpisode: '//div[@id="new_story"]/div/a',
    author: '//div[@id="writer"]/p'
  }, {
    url: '//webcomic.ohtabooks.com/',
    firstEpisode: '//li[last()]/a[@class="btn icon arrow"]',
    lastEpisode: '//div[4]/ul/li[@class="wide"]/a',
    author: '//div/div[@class="author"]/span[@itemprop="name"]'
  }, { //
    url: '',
    sibling: '',
    header: '',
    nextEpisode: '',
    prevEpisode: '',
    disableSnapWhenPageIsClicked: 0,
    author: '',
    firstEpisode: '',
    lastEpisode: '',
    pankuzuUp: '',
  }, { //
    url: '',
    sibling: '',
    header: '',
    nextEpisode: '',
    prevEpisode: '',
    disableSnapWhenPageIsClicked: 0,
    author: '',
    firstEpisode: '',
    lastEpisode: '',
    pankuzuUp: '',
  }]

  var marginu = 3;
  var isChrome = window.navigator.userAgent.toLowerCase().indexOf("chrome") != -1;
  var scrollSpeed = pref("scrollSpeed") || (isChrome ? 1.5 : 1.5);
  var atamadashi = pref("atamadashi") || "false";
  var sscrollY = 0;
  var sscrollDY = 0;
  var scrint = 0;

  // match文を生成
  if (LogMatch) {
    let matchlist = ""
    for (let s of SITEINFO.slice().sort(function(a, b) { return a.url > b.url ? 1 : -1 })) {
      if (s.url != "")
        for (let s2 of s.url.split("|")) {
          matchlist += "// @match *:" + s2.replace(/\.\*/gm, "*").replace(/^\./, "//*.") + "*\n";
        }
    }
    alert(matchlist);
  }

  var customsib = pref("wcs_siblingXPath") || "";
  if (customsib) {
    SITEINFO.length = 0;
    SITEINFO.push({ "url": "//" + location.href.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1] + "/", "sibling": customsib, "disableSnapWhenPageIsClicked": 1 })
  }

  document.addEventListener('keydown', function f(e) {
    if (/input|textarea/i.test(e.target.tagName) == false) {
      if (!e.getModifierState("Alt") && !e.getModifierState("Control") && e.getModifierState("Shift") && (e.key == "\`")) {
        //        e.preventDefault();
        var copipe = customsib ? "現在の設定:\n\n// @match *://" + location.href.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1] + "/*\n  { // \n    url: '//" + location.href.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1] + "/',\n    sibling: '" + customsib + "',\n    header: '',\n    nextEpisode: '',\n    prevEpisode: '',\n    disableSnapWhenPageIsClicked: 1,\n    author: '',\n    firstEpisode: '',\n    lastEpisode: '',\n    pankuzuUp: '',\n  },\n\n" : "";
        //console.log("livedoor:" + (document.body.innerHTML.match(/\livedoor\./gmi) || [1]).length + " @class=t_H:" + elegeta('//div[contains(@class,"t_h")]').length);
        let defsib = ((document.body.innerHTML.match(/\livedoor\./gmi) || [1]).length >= 5 && elegeta('//div[contains(@class,"t_h")]').length > 4) ? '//div[contains(@class,"t_h")]' : '';
        var sib = prompt(copipe + "Enter Sibling XPath\n空欄にすると設定を削除します", customsib || defsib);
        pref("wcs_siblingXPath", null);
        if (!sib || !eleget0test(sib)) {
          alert("空欄、またはXPathとして1つ以上ヒットしないので、設定を削除します");
        } else {
          pref("wcs_siblingXPath", sib);
        }
        location.reload();
        return;
      }
    }
  }, false);

  $('a[target="_blank"]').removeAttr("target");
  setTimeout(() => $('a[target="_blank"]').removeAttr("target"), 500);
  setTimeout(() => $('a[target="_blank"]').removeAttr("target"), 1500);

  var thissite = null;
  //  for(let si of SITEINFO){for (let pro in si){if(si[pro])console.log(pro+" : "+si[pro])}}
  for (var i = 0; i < SITEINFO.length; i++) {
    if (SITEINFO[i].url == "") continue;
    if (location.href.match(SITEINFO[i].url)) {
      thissite = i;
      var SITE = Object.create(SITEINFO[thissite]);
      break;
    }
  }
  if (thissite === null) return;

  setTimeout(() => {
    var j = 0;
    for (let pro in SITE) {
      if (SITE[pro]) {
        //console.log(pro + " : " + SITE[pro])
        var str1 = ["url:", "sibling:", "sibling:", "header:", "nextEpisode:", "prevEpisode:", "disableSnapWhenPageIsClicked:", "author:", "firstEpisode:", "lastEpisode:", "pankuzuUp:"];
        var str2 = ["", "←→:前次ページ", "Shift+A:頭出し", "", "Enter:次の話", "]:前の話", "", "", "→:第1話", "Enter:最新話", "Shift+↑:上階層"];
        for (var k = 0; k < str1.length; k++) {
          if (pro + ":" == str1[k] && str2[k] && eleget0(SITE[pro])) {
            if (PopupHelpMS) {
              let node = document.body.appendChild(document.createElement('span'));
              node.innerHTML = str2[k]; //+" : "+SITE[pro];
              node.setAttribute("style", "max-width:95%; right:0; bottom:" + (j * 21) + "px; z-index:2147483647; opacity:" + 1 + "; text-align:left; line-height:1.1; position:fixed; font-size:11px; font-weight:bold; margin:2px;  text-decoration:none; padding:2px 5px; border-radius:15px; color:#ffffff; " + (ButtonBG)); //" box-shadow:3px 3px 3px #0004;");
              $(node).hide(0);
              setTimeout(() => { $(node).slideDown('fast'); }, 67 * j); //fadeIn('fast')
              setTimeout(() => { $(node).hide(400).queue(function() { this.remove(); }) }, PopupHelpMS + 67 * j); //fadeOut('fast')
            }
            j++;
          }
        }
      }
    }
    addHelp(SITE.firstEpisode, "→");
    addHelp(SITE.lastEpisode, "Enter");
    addHelp(SITE.prevEpisode, " ] ");
    addHelp(SITE.nextEpisode, "Enter");
    if (SITE.nextEpisode > "") {
      var ele = eleget0(SITE.nextEpisode);
      if (ele && ele.tagName === "A") {
        $("head").append("<link rel='prefetch' href='" + ele.href + "'>").append("<link rel='prerender' href='" + ele.href + "'>"); //.append("<link rel='next' href='" + ele.href + "'>")
      }
    }
    addHelp(SITE.pankuzuUp, "Shift+↑");
  }, 500);

  function getArrowedGap() {
    // ヘッダのy下端を計算
    var arrowedGap = marginu;
    if (SITE.header) {
      var seigaheader = eleget0(SITE.header);
      if (seigaheader) {
        var tmp = seigaheader.getBoundingClientRect().bottom; // - window.pageYOffset
        //        console.log(tmp);
        if (seigaheader && tmp >= 0) {
          var arrowedGap = marginu + tmp;
          //          console.log("ヘッダあり");//+window.pageYOffset;
        }
      }
    }
    dc("arrowedGap:" + arrowedGap);
    //      console.log("ArrowedGap:"+arrowedGap+"\nMarginU:"+ marginu+"\nseigaH:"+seigaheader.getBoundingClientRect().bottom,"\noffset:"+window.pageYOffset);
    return arrowedGap;
  }

  //console.log(SITE)
  document.addEventListener("keydown", function(e) {
      if (/input|textarea/i.test(e.target.tagName)) return;
      var arrowedGap = getArrowedGap();
      var pressed = (e.ctrlKey ? 'c' : '') + (e.altKey ? 'a' : '') + (e.shiftKey ? 's' : '') + String(e.which); {

        if (SITE.pankuzuUp && pressed == "s38")
          if (moveClick(SITE.pankuzuUp)) { e.preventDefault(); return; } // Shift上

        if (SITE.sibling && (pressed == "39" || pressed == "37") && eleget0test(SITE.sibling)) { //左右
          e.preventDefault();

          // もっとも接近しているページ=今見ているページをfoundeleに入れる
          var ele = eleget(SITE.sibling);
          var minGap = 9999;
          var foundele = null;
          var nh = getNowHeaderHeight();
          for (var i = 0; i < ele.snapshotLength; i++) {
            var ele0 = ele.snapshotItem(i);
            var eley = ele0.getBoundingClientRect().top - nh - marginu;
            if (Math.abs(eley) < minGap && ($(ele0).is(":visible"))) {
              minGap = Math.abs(eley);
              foundele = ele0;
              if (minGap <= (arrowedGap - nh + marginu + 2)) {
                dc("nearest:" + foundele.tagName + "." + foundele.className + "#" + foundele.id + "\n" + "minGap:" + minGap + "  aGap:" + (arrowedGap - nh + marginu) + "  break at " + i);
                break;
              }
            }
          }
          snap(foundele, pressed == 37 ? "prev" : "next", arrowedGap, SITE.sibling);
          return;
        }
        if (SITE.nextEpisode && (pressed == "s39" || pressed == "13")) // Shift右 enter
          if (moveClick(SITE.nextEpisode)) { e.preventDefault(); return; }

        if (SITE.prevEpisode && (pressed == "s37" || pressed == "221"))
          if (moveClick(SITE.prevEpisode)) { e.preventDefault(); return; } //Shift左 ]

        if (SITE.firstEpisode && pressed == "39")
          if (moveClick(SITE.firstEpisode)) { e.preventDefault(); return; } // 右
        if (SITE.lastEpisode && (pressed == "s39" || pressed == "13"))
          if (moveClick(SITE.lastEpisode)) { e.preventDefault(); return; } // Shift右 enter

        if (pressed == "s83") { // shift+s スクロール速度
          e.preventDefault();
          scrollSpeed = proInput("スクロール速度を入力してください(0:API使用、1:瞬間移動、1.01~:速度指定)", scrollSpeed, 0, 30);
          pref("scrollSpeed", scrollSpeed);
        }
        if (pressed == "s65") { // Shift+a 頭出しオンオフ
          e.preventDefault();
          atamadashi = atamadashi === "true" ? "false" : "true";
          alert("[Shift+a] 頭出し機能を" + atamadashi + "にしました");
          pref("atamadashi", atamadashi);
        }

        if (location.href.match("/seiga.nicovideo.jp/watch/|//seiga.nicovideo.jp/comic/")) {
          if (pressed == "67") { // c コメントオンオフ
            e.preventDefault();
            eleget0('//li[@id="show_comment"]/span').click();
            return;
          }
          if (pressed == "72") { // h ヘッダー固定追従
            e.preventDefault();
            eleget0('//li[@id="siteHeaderRightMenuUnfix" and @style="display: block;"]/a/span|//li[@id="siteHeaderRightMenuFix" and @style="display: block;"]/a/span').click();
            return;
          }
        }

        if (pressed == "70" || pressed == "219") { // f [ 全画面化
          e.preventDefault();
          var y = window.pageYOffset;
          var doc = window.document;
          var docEl = doc.documentElement;
          var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen;
          var cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen;
          if (!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) { requestFullScreen.call(docEl); } else { cancelFullScreen.call(doc); }
          setTimeout(window.scroll, 100, 0, y);
        }
        if (SITE.nextPage && pressed == "37" && eleget0test(SITE.nextPage))
          if (moveClick(SITE.nextPage)) { e.preventDefault(); return; }
        if (SITE.prevPage && pressed == "39" && eleget0test(SITE.prevPage))
          if (moveClick(SITE.prevPage)) { e.preventDefault(); return; }

      }
    },
    false);

  // ページクリックでスナップ
  if (!SITE.disableSnapWhenPageIsClicked && SITE.sibling) {
    setTimeout(() => {
      var ele = eleget(SITE.sibling);
      for (var i = ele.snapshotLength; i--;)
        ele.snapshotItem(i).addEventListener("click", function(e) { snap(this, "next", getArrowedGap(), SITE.sibling); }, false);
    }, 500);
  }

  // 作者名でWeb漫画アンテナ
  if (SITE.author) {
    setTimeout(() => { sakushaantenna(document) }, 500);
    document.body.addEventListener('AutoPagerize_DOMNodeInserted', function(evt) { sakushaantenna(evt.target) }, false);
  }

  // 頭出し
  if (atamadashi == "true" && SITE.atamadashi) {
    setTimeout(() => { loadfocus(0, SITE.atamadashi) }, 16)
    setTimeout(() => { loadfocus(0, SITE.atamadashi) }, 600)
  } else
  if (atamadashi == "true" && SITE.sibling) {
    setTimeout(() => { loadfocus(0, SITE.sibling) }, 16)
    setTimeout(() => { loadfocus(0, SITE.sibling) }, SITE.atamadashiDelay || 333)
  }

  if (SITE.func) { SITE.func(); }
  return;

  function sakushaantenna(node) {
    for (let ele of elegeta(SITE.author, node)) {
      $('<a style="' + "-moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; font-size:11px; font-weight:bold; margin:0px 5px; text-decoration:none !important; text-align:center; padding:1px 7px 1px; border-radius:15px; " + (ButtonBG) + " white-space: nowrap" + '"href="https://webcomics.jp/search?q=***" rel=\"noopener noreferrer nofollow\"><font color="#ffffff" style="text-decoration:none !important;">Web漫画アンテナ</font></a>'.replace("***", ele.innerText.replace(/\/|/|\,/gmi, " OR ").replace(/ ?先生[::\//・]?|原作[::\//・]|原案[::\//・]|脚本[::\//・]|著[::\//・]|著者[::\//・]|漫画[::\//・]|作画[::\//・]|イラスト[::\//・]|キャラクター(原案)?[::\//・]|画[::\//・]|作[::\//・]|絵[::\//・]|構成[::\//・]|協力[::\//・]|[::・]|[\((][^)\)]*[)\)]|=/gmi, " ").replace(/  |・| /g, " ").replace(/^ OR | OR $/gmi, "").trim())).insertAfter(ele);
    }
  }

  function loadfocus(times = 0, atamadashi) {
    let xp = atamadashi;
    if (!xp || times > 10000) return false;
    //    if (eleget0(xp)) { setTimeout(() => { loadfocus2(atamadashi); }, 200); return; } else setTimeout(() => { loadfocus(times + 200, atamadashi); }, 200)
    if (eleget0(xp)) { setTimeout(() => { loadfocus2(atamadashi); }, 100); return; } else setTimeout(() => { loadfocus(times + 100, atamadashi); }, 100)
  }

  function loadfocus2(atamadashi) {
    var xp = atamadashi;
    var ele = eleget0(xp);
    if (ele) {
      sscroll(ele.getBoundingClientRect().top + window.pageYOffset - marginu - getNowHeaderHeight());
    }
    return ele;
  }

  function getNextSib(ele, xpath) { // xpathに適合する弟ノードを走査
    do {
      if (!ele.nextElementSibling) return null;
      ele = ele.nextElementSibling;
      if ($(ele).is(":visible")) {
        for (let ele2 of elegeta(xpath)) {
          if (ele === ele2) return ele;
        }
      }
    } while (ele.nextElementSibling);
    return null;
  }

  function getPrevSib(ele, xpath) { // xpathに適合する兄ノードを走査
    do {
      if (!ele.previousElementSibling) return null;
      ele = ele.previousElementSibling;
      if ($(ele).is(":visible")) {
        for (let ele2 of elegeta(xpath)) {
          if (ele === ele2) return ele;
        }
      }
    } while (ele.previousElementSibling);
    return null;
  }

  function snap(targetele, pn, arrowedGap, xpath) {
    if (!targetele) return;
    var headery = getNowHeaderHeight();
    var nowpagey = targetele.getBoundingClientRect().top + window.pageYOffset - marginu;
    var nextpage = (pn == "next" ? getNextSib(targetele, xpath) : getPrevSib(targetele, xpath));
    if (nextpage) dc("nextpage:" + nextpage.tagName + "." + nextpage.className + "#" + nextpage.id);
    if (nextpage == null) {
      if (SITE.nextEpisode)
        if (eleget0(SITE.nextEpisode)) { var nextpagey = eleMiddleY(SITE.nextEpisode); } else return;
      else return;
    } else {
      var nextpagey = nextpage.getBoundingClientRect().top + window.pageYOffset - marginu;
      dc("nextpagey:" + nextpagey);
    }
    if (nextpage === null && pn == "prev") {
      nextpagey = 0;
      nowpagey = 0;
      if (window.pageYOffset < 2) {
        if (SITE.prevEpisode) moveClick(SITE.prevEpisode);
      }
    }
    var nowy = window.pageYOffset + headery;
    dc(Math.abs(nowy - nowpagey) + " present gap");
    dc(arrowedGap + " allowed gap");
    if (Math.abs(nowy - nowpagey) <= arrowedGap) {
      sscroll(nextpagey - headery);
      if (nextpage === null) {
        if (pn == "next") {
          if (SITE.nextEpisode) moveClick(SITE.nextEpisode);
        }
      }
    } else {
      targetele.focus();
      sscroll(nowpagey - headery);
    }
    return;
  }

  function getNowHeaderHeight() {
    if (SITE.header == "") { return marginu; }
    var header1y = 0;
    var seigaheader = eleget0(SITE.header)
    if (seigaheader === null) header1y = 0;
    else {
      var seigaheaderpos = seigaheader.getBoundingClientRect();
      header1y = seigaheaderpos.bottom;
    }
    var headery = Math.max(header1y, 0);
    return headery + marginu;
  }

  function eleMiddleY(xpath) {
    var el2 = eleget0(xpath);
    if (el2) {
      return (el2.getBoundingClientRect().top + window.pageYOffset +
        eleget0(xpath).getBoundingClientRect().height -
        window.innerHeight / 2);
    } else return 0;
  }

  function moveClick(xpath) {
    if (!eleget0(xpath)) return false;
    GM_addStyle(":focus { box-shadow: 0px 0px 10px 10px rgba(0, 250, 0, 0.5), inset 0 0 100px rgba(0, 250, 0, 0.1) !important; outline: rgba(0, 250,0,0.7) solid 4px !important; outline-offset: 1px !important; }")
    eleget0(xpath).focus();
    eleget0(xpath).click();
    sscroll(eleMiddleY(xpath));
    return true;
  }

  function eleget0(xpath) {
    var ele = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    return ele.snapshotLength > 0 ? ele.snapshotItem(0) : null;
  }

  function eleget(xpath) {
    return document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  }

  function elegeta(xpath, node = document) {
    var ele = document.evaluate("." + xpath, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    var array = [];
    for (var i = 0; i < ele.snapshotLength; i++) array[i] = ele.snapshotItem(i);
    return array;
  }

  function sscroll(dy) {
    if (scrollSpeed < 1) { //APIでスクロール
      //      console.log("api使用");
      window.scroll({ left: 0, top: dy, behavior: "smooth" });
      return;
    }
    if (scrollSpeed == 1) { window.scroll({ left: 0, top: dy, behavior: "instant" }); return; }
    sscrollY = window.pageYOffset; //chrome
    sscrollDY = dy;
    scrint = 0;
    setTimeout(sscrollInt, 16);
    return;
  }

  function sscrollInt() {
    scrint++;
    sscrollY = sscrollY + (sscrollDY - sscrollY) / scrollSpeed;
    window.scroll(0, sscrollY);
    //    if (Math.abs(sscrollY - sscrollDY) > 2) setTimeout(sscrollInt, 16);
    if (Math.abs(sscrollY - sscrollDY) >= 1) { setTimeout(sscrollInt, 16); } else window.scroll(0, sscrollDY);
    //    else console.log("スクロールに掛かった回数(最短1/60秒)…" + scrint + "回");
    return;
  }

  function proInput(prom, defaultval, min, max = Number.MAX_SAFE_INTEGER) {
    return Math.min(Math.max(
      Number(window.prompt(prom, defaultval).replace(/[A-Za-z0-9.]/g, function(s) {
        return String.fromCharCode(s.charCodeAt(0) - 65248);
      }).replace(/[^-^0-9^\.]/g, "")), min), max);
  }

  function addHelp(xpath, help) {
    if (!xpath) return;
    let ele = eleget0(xpath);
    if (ele) {
      ele.appendChild(document.createElement("span")).innerHTML = "<small> (" + help + ")</small>";
      //console.log("Found:" + xpath);
    }
    return;
  }

  function eleget0test(xpath) {
    try { var ele = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null) } catch (err) { return ""; }
    var ele = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    return ele.snapshotLength > 0 ? ele.snapshotItem(0) : "";
  }

  function dc(str) {
    if (debug) console.log(str);
  }

  function pref(name, store = undefined) { // pref(name,data)で書き込み(数値でも文字列でも配列でもオブジェクトでも可)、pref(name)で読み出し
    var domain = (location.href.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1] || location.href);
    if (store === undefined) { // 読み出し
      let data = GM_getValue(domain + " ::: " + name)
      if (data == undefined) return store; // 値がないなら終わり
      if (data.substr(0, 1) === "[") { // 配列なのでJSONで返す
        try { return JSON.parse(data || '[]'); } catch (e) {
          console.log("データベースがバグってるのでクリアします\n" + e);
          pref(name, []);
          return;
        }
      } else return data;
    }
    if (store === "" || store === [] || store === null) { // 書き込み、削除
      GM_deleteValue(domain + " ::: " + name);
      return store;
    } else if (typeof store === "string") { // 書き込み、文字列
      GM_setValue(domain + " ::: " + name, store);
      return store;
    } else { // 書き込み、配列
      try { GM_setValue(domain + " ::: " + name, JSON.stringify(store)); } catch (e) {
        console.log("データベースがバグってるのでクリアします\n" + e);
        pref(name, "");
      }
      return store;
    }
  }

})();