diff --git a/#movie.bat b/#movie.bat new file mode 100644 index 0000000..7de6d76 --- /dev/null +++ b/#movie.bat @@ -0,0 +1,13 @@ + @ECHO OFF +ECHO Put Netflix Id here : +set /p MPD= + +ECHO Quality Select : +set /p qu= +NFripper.py %MPD% -o Downloads -q %qu% --main --prv ca-tor.pvdata.host --alang hin eng + +echo +pause + + +@ECHO OFF \ No newline at end of file diff --git a/#series.bat b/#series.bat new file mode 100644 index 0000000..a421a61 --- /dev/null +++ b/#series.bat @@ -0,0 +1,16 @@ +@ECHO OFF +ECHO Put Netflix Id here : +set /p MPD= + +ECHO Season No : +set /p se= + +ECHO Quality Select : +set /p qu= +NFripper.py %MPD% -o Downloads -q %qu% -s %se% --main --prv ca-tor.pvdata.host --alang hin eng + +echo +pause + + +@ECHO OFF \ No newline at end of file diff --git a/NFripper.py b/NFripper.py new file mode 100644 index 0000000..653adb6 --- /dev/null +++ b/NFripper.py @@ -0,0 +1,128 @@ +import argparse, json, os, logging +from configs.config import tool +from helpers.proxy_environ import proxy_env +from datetime import datetime +from services.netflix import netflix + +script_name = "NF Ripper" +script_ver = "2.0.1.0" + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description=f">>> {script_name} {script_ver} <<<") + parser.add_argument("content", nargs="?", help="Content URL or ID") + parser.add_argument("-q", dest="customquality", nargs=1, help="For configure quality of video.", default=[]) + parser.add_argument("-o", dest="output", help="download all assets to directory provided.") + parser.add_argument("-f", dest="output_folder", help="force mux .mkv files to directory provided", action="store", default=None) + parser.add_argument("--nv", dest="novideo", help="dont download video", action="store_true") + parser.add_argument("--na", dest="noaudio", help="dont download audio", action="store_true") + parser.add_argument("--ns", dest="nosubs", help="dont download subs", action="store_true") + parser.add_argument("-e", dest="episodeStart", help="it will start downloading the season from that episode.", default=None) + parser.add_argument("-s", dest="season", help="it will start downloading the from that season.", default=None) + parser.add_argument("--keep", dest="keep", help="well keep all files after mux, by default all erased.", action="store_true") + parser.add_argument("--only-2ch-audio", dest="only_2ch_audio", help="to force get only eac3 2.0 Ch audios.", action="store_true") + parser.add_argument("--alang", dest="audiolang", nargs="*", help="download only selected audio languages", default=[],) + parser.add_argument("--AD", '--adlang', dest="AD", nargs="*", help="download only selected audio languages", default=[],) + parser.add_argument("--slang", dest="sublang", nargs="*", help="download only selected subtitle languages", default=[],) + parser.add_argument("--flang", dest="forcedlang", nargs="*", help="download only selected forced subtitle languages", default=[],) + parser.add_argument('-t', "--title", dest="titlecustom", nargs=1, help="Customize the title of the show", default=[],) + parser.add_argument('-p', "--prompt", dest="prompt", help="will Enable the yes/no prompt when URLs are grabbed.", action="store_true") + parser.add_argument('-keys', "--license", dest="license", help="print all profiles keys and exit.", action="store_true") + parser.add_argument("--audio-bitrate", dest="custom_audio_bitrate", nargs=1, help="For configure bitrate of audio.", default=[]) + parser.add_argument("--aformat-2ch","--audio-format-2ch", dest="aformat_2ch",nargs=1, help="For configure format of audio.", default=[],) + parser.add_argument("--aformat-51ch","--audio-format-51ch", dest="aformat_51ch",nargs=1, help="For configure format of audio.", default=[],) + parser.add_argument("--android-login", dest="android_login", help="will log netflix using android api and save cookies nd build.", action="store_true",) + parser.add_argument("--search", action="store", dest="search", help="download using netflix search for the movie/show.", default=0,) + parser.add_argument("--hevc", dest="hevc", help="will return HEVC profile", action="store_true") + parser.add_argument("--hdr", dest="hdr", help="will return HDR profile", action="store_true") + parser.add_argument("--high", dest="video_high", help="return MSL High Video manifest for hpl videos, usually small size low bitrate.", action="store_true",) + parser.add_argument("--main", dest="video_main", help="return MSL Main Video manifest for mpl videos, usually Big size High bitrate.", action="store_true",) + parser.add_argument("--check", dest="check", help="hpl vs mpl.", action="store_true",) + parser.add_argument("--all-audios", dest="allaudios", help="all download audios of the movie/show", action="store_true",) + parser.add_argument("--all-forced", dest="allforcedlang", help="all download forced subs of the movie/show", action="store_true",) + parser.add_argument("--no-aria2c", dest="noaria2c", help="not use aria2c for download, will use python downloader.", action="store_true",) + + # PROXY + parser.add_argument("--nrd", action="store", dest="nordvpn", help="add country for nordvpn proxies.", default=0,) + parser.add_argument("--prv", action="store", dest="privtvpn", help="add country for privtvpn proxies.", default=0,) + parser.add_argument("--no-dl-proxy", dest="no_download_proxy", help="do not use proxy will downloading files", action="store_true", default=False,) + + # PACK + parser.add_argument("--gr", dest="muxer_group", help="add group name to use that will override the one in config", action="store", default=None) + parser.add_argument("--upload", dest="upload_ftp", help="upload the release after packing", action="store_true", default=None) + parser.add_argument("--pack", dest="muxer_pack", help="pack the release", action="store_true", default=None) + parser.add_argument("--confirm", dest="confirm_upload", help="ask confirming before upload the packed release", action="store_true", default=None) + parser.add_argument("--imdb", dest="muxer_imdb", help="add imdb for the title for packing", action="store", default=None) + parser.add_argument("--scheme", dest="muxer_scheme", help="set muxer scheme name", default=None) + # cleaner + parser.add_argument("--clean-add", dest="clean_add", nargs="*", help="add more extension of files to be deleted", default=[],) + parser.add_argument("--clean-exclude", dest="clean_exclude", nargs="*", help="add more extension of files to not be deleted", default=[],) + parser.add_argument("--log-level", default="info", dest="log_level", choices=["debug", "info", "error", "warning"], help="choose level") + parser.add_argument("--log-file", dest="log_file", help="set log file for debug", default=None) + args = parser.parse_args() + + start = datetime.now() + + if args.log_file: + logging.basicConfig( + filename=args.log_file, + format="%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s", + datefmt="%Y-%m-%d %I:%M:%S %p", + level=logging.DEBUG, + ) + + else: + if args.log_level.lower() == "info": + logging.basicConfig(format="%(message)s", level=logging.INFO) + elif args.log_level.lower() == "debug": + logging.basicConfig( + format="%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s", + datefmt="%Y-%m-%d %I:%M:%S %p", + level=logging.DEBUG, + ) + elif args.log_level.lower() == "warning": + logging.basicConfig( + format="%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s", + datefmt="%Y-%m-%d %I:%M:%S %p", + level=logging.WARNING, + ) + elif args.log_level.lower() == "error": + logging.basicConfig( + format="%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s", + datefmt="%Y-%m-%d %I:%M:%S %p", + level=logging.ERROR, + ) + + logging.getLogger(__name__) + + group = { + "UPLOAD": args.upload_ftp, + "IMDB": args.muxer_imdb, + "SCHEME": args.muxer_scheme, + "PACK": args.muxer_pack, + "GROUP": args.muxer_group, + "CONFIRM": args.confirm_upload, + "EXTRA_FOLDER": args.output_folder, + } + + # ~ commands + proxy, ip = proxy_env(args).Load() + commands = {"aria2c_extra_commands": proxy, "group": group} + logging.debug(commands) + + if args.license: + args.prompt = False + + l = "\n__________________________\n" + print( + f"\n-- {script_name} --{l}\nVERSION: {script_ver}{l}\nIP: {ip}{l}" + ) + + netflix_ = netflix(args, commands) + netflix_.main_netflix() + + print( + "\nNFripper took {} Sec".format( + int(float((datetime.now() - start).total_seconds())) + ) + ) # total seconds diff --git a/bin/BeHappy/plugins32/LSMASHSource.dll b/bin/BeHappy/plugins32/LSMASHSource.dll new file mode 100644 index 0000000..feeeeff Binary files /dev/null and b/bin/BeHappy/plugins32/LSMASHSource.dll differ diff --git a/bin/BeHappy/plugins32/TimeStretch.dll b/bin/BeHappy/plugins32/TimeStretch.dll new file mode 100644 index 0000000..d7ddc13 Binary files /dev/null and b/bin/BeHappy/plugins32/TimeStretch.dll differ diff --git a/bin/BeHappy/plugins32/desktop.ini b/bin/BeHappy/plugins32/desktop.ini new file mode 100644 index 0000000..787cdb4 Binary files /dev/null and b/bin/BeHappy/plugins32/desktop.ini differ diff --git a/bin/tools/MediaInfo.exe b/bin/tools/MediaInfo.exe new file mode 100644 index 0000000..9e70e20 Binary files /dev/null and b/bin/tools/MediaInfo.exe differ diff --git a/bin/tools/aria2c.exe b/bin/tools/aria2c.exe new file mode 100644 index 0000000..7de7a06 Binary files /dev/null and b/bin/tools/aria2c.exe differ diff --git a/bin/tools/ffmpeg.exe b/bin/tools/ffmpeg.exe new file mode 100644 index 0000000..8085a60 Binary files /dev/null and b/bin/tools/ffmpeg.exe differ diff --git a/bin/tools/ffplay.exe b/bin/tools/ffplay.exe new file mode 100644 index 0000000..91250fe Binary files /dev/null and b/bin/tools/ffplay.exe differ diff --git a/bin/tools/ffprobe.exe b/bin/tools/ffprobe.exe new file mode 100644 index 0000000..100a47f Binary files /dev/null and b/bin/tools/ffprobe.exe differ diff --git a/bin/tools/mkvmerge.exe b/bin/tools/mkvmerge.exe new file mode 100644 index 0000000..1fd3256 Binary files /dev/null and b/bin/tools/mkvmerge.exe differ diff --git a/bin/tools/mp4decrypt.exe b/bin/tools/mp4decrypt.exe new file mode 100644 index 0000000..4956c22 Binary files /dev/null and b/bin/tools/mp4decrypt.exe differ diff --git a/bin/tools/mp4dump.exe b/bin/tools/mp4dump.exe new file mode 100644 index 0000000..328c322 Binary files /dev/null and b/bin/tools/mp4dump.exe differ diff --git a/checker.bat b/checker.bat new file mode 100644 index 0000000..4a6fba1 --- /dev/null +++ b/checker.bat @@ -0,0 +1,13 @@ +@ECHO OFF +ECHO Put Netflix Id here : +set /p MPD= + +ECHO Quality Select : +set /p qu= +NFripper.py %MPD% -o Downloads -q %qu% --check + +echo +pause + + +@ECHO OFF \ No newline at end of file diff --git a/configs/Cookies/cookies_nf.txt b/configs/Cookies/cookies_nf.txt new file mode 100644 index 0000000..d5018de --- /dev/null +++ b/configs/Cookies/cookies_nf.txt @@ -0,0 +1,113 @@ +{ + "BUILD_IDENTIFIER": "v970d0ec4", + "cookies": { + "_ga": [ + "GA1.2.1140108570.1617215940", + 0 + ], + "NetflixId": [ + "v%3D2%26ct%3DBQAOAAEBEHOzu6KP28kdADXLobUUrROB0PoBjq3JxcX1vGfDcXUv4xVDQq5H6XsQyE1Frj5SPGO99pNqlZl9A5O3CZUdxiur6u9F5dqAyA0veRgT2bVpQnJ-h7kBmZdPSr3HyGHD9fMnj07AjgioUxeWFsJPky9pVuFRADdnSQXFFqK1NpW2TpDRpGEFRInaAZ9Hr-y6y4J7ggTgHQhbL8CI6NgAHFs8QgPEC9jcyvyFKQmRIBUeU-HS2-WSNlNwSxquZ4bNGBasoTIMGE_8A3R2Mo4lc-qio2Df8Qdv-elVwj8S6VeH8v-brCDpPk-VcDbQp1O2sPb9oKnbCS0DNYL3TqGXzMBNVrL_nHfxDEbPss8929Tc9Ra5HA3635DKbxEJc-tq3u9xUeb_DszXHIS5O-sg6595Pn-LPWBxphkPKdftdLYsQD1RzR0ena_UNrvr-8lIE5TxCXJhLXK0msAfypuevVH1XKXN2FsHJyR0JbbzkOYN2KNxCmRfNkYezY28fKRoufM1F6gF5HDMxuLzw_KjrDV6is18lbNbcmP32_TY2aJnWfHqSaGw5DWnQ3shDKo4SltLUjCuJzYGY7YJAEM-3ifbtwN-QgKyWTUsCwtrrYlDnpUy4rs3rnJyAu8EElWymMkV%26bt%3Ddbl%26ch%3DAQEAEAABABSprqjfXbW6YL0tVF0tz16hvWyTr9LF4jE.%26mac%3DAQEAEAABABRoyiGmz8qurX494b0O21l13oiiV94g9CU.", + 0 + ], + "OptanonConsent": [ + "isIABGlobal=false&datestamp=Fri+Jun+18+2021+07%3A58%3A49+GMT-0700+(Pacific+Daylight+Time)&version=6.6.0&consentId=a93027f9-5a1c-410f-8272-e0a1ea3e658d&interactionCount=1&landingPath=NotLandingPage&groups=C0001%3A1%2CC0002%3A1%2CC0004%3A0&hosts=H1%3A1%2CH12%3A1%2CH13%3A1%2CH27%3A0%2CH28%3A0%2CH30%3A0&AwaitingReconsent=false", + 0 + ], + "SecureNetflixId": [ + "v%3D2%26mac%3DAQEAEQABABS0Wg3y7pHcIuzNaFVA9OL1hOBszVcpdKc.%26dt%3D1623992368587", + 0 + ], + "cf_token": [ + "5d16d7e4-f422-4505-b81a-f13f81d06b71", + 0 + ], + "flwssn": [ + "f30c6737-15f8-4a97-8102-a0162bac69bc", + 0 + ], + "memclid": [ + "5eb11c58-f94f-46a1-9916-a877c78cc950", + 0 + ], + "nfvdid": [ + "BQFmAAEBEHVhRA5F47wt0VzEXxA4lotgv2JbGEnTuU3t2ACmhEmOKuDHWsixD22MEvRfk1SyBSysA4pNyu4UnaMbEBYYAAhCvmGD6sG8LGI_wNxCLpENpUPoF1FF8p3ZOUGBcLkMl5UDunPJGTSHibJ6rP5eZwgX", + 0 + ], + "pas": [ + "%7B%22supplementals%22%3A%7B%22muted%22%3Atrue%7D%7D", + 0 + ], + "playerPerfMetrics": [ + "%7B%22uiValue%22%3A%7B%22throughput%22%3A24045%2C%22throughputNiqr%22%3A0.1387332986123521%7D%2C%22mostRecentValue%22%3A%7B%22throughput%22%3A24044.9%2C%22throughputNiqr%22%3A0.1387332986123521%7D%7D", + 0 + ], + "profilesNewSession": [ + "0", + 0 + ], + "__cfduid": [ + "ddc5ba21ab87d546424a73381309e8af61619034211", + 0 + ], + "_admrla": [ + "2.0-a88ab21a-c44f-b78a-d6e3-05b3cde370fc", + 0 + ], + "_awl": [ + "2.1619452424.0.4-7dc0a353-a88ab21ac44fb78ad6e305b3cde370fc-6763652d617369612d6561737431-6086e208-1", + 0 + ], + "_gid": [ + "GA1.2.962657418.1619405560", + 0 + ], + "ccpaApplies": [ + "false", + 0 + ], + "ccpaUUID": [ + "e05cd352-14f3-4d80-9500-b1d81fee7cd0", + 0 + ], + "dnsDisplayed": [ + "true", + 0 + ], + "signedLspa": [ + "false", + 0 + ], + "thx_guid": [ + "8a067b33cfaa47539ea40975e2b80069", + 0 + ], + "_sp_v1_csv": [ + "null", + 0 + ], + "_sp_v1_data": [ + "2:334049:1619034213:0:9:0:9:0:0:_:-1", + 0 + ], + "_sp_v1_lt": [ + "1:", + 0 + ], + "_sp_v1_opt": [ + "1:", + 0 + ], + "_sp_v1_ss": [ + "1:H4sIAAAAAAAAAItWqo5RKimOUbKKhjHySnNydGKUUpHYJWCJ6traWFwSSjrUNwiffqVYAG6Fhl26AAAA", + 0 + ], + "_sp_v1_uid": [ + "1:365:378b6189-c59f-4807-abd1-95bcd2c5779d", + 0 + ], + "consentUUID": [ + "ef33150e-dde3-41af-b14c-18d858e5a51b", + 0 + ] + } +} \ No newline at end of file diff --git a/configs/KEYS/netflix.keys b/configs/KEYS/netflix.keys new file mode 100644 index 0000000..30d9655 --- /dev/null +++ b/configs/KEYS/netflix.keys @@ -0,0 +1,2025 @@ +[ + { + "NAME": "Nayattu 2021", + "PSSH": null, + "ID": 1, + "KID": "0000000006860f250000000000000000", + "KEY": "df64ee3c4342c096ad1595301615ef52" + }, + { + "NAME": "Rajma Chawal 2018", + "PSSH": null, + "ID": 1, + "KID": "00000000051f92e10000000000000000", + "KEY": "37ee4a3b53bc0f256ca6553ef9688034" + }, + { + "NAME": "Torbaaz 2020", + "PSSH": null, + "ID": 1, + "KID": "00000000063a93d80000000000000000", + "KEY": "6f1afa99d4fa960d53ad0b2bd5ec94b8" + }, + { + "NAME": "Sacred Games S01E01 Ashwathama", + "PSSH": null, + "ID": 1, + "KID": "0000000004d5e6510000000000000000", + "KEY": "d24a057efc785362d9bc7c1201901cfe" + }, + { + "NAME": "Sacred Games S01E02 Halahala", + "PSSH": null, + "ID": 1, + "KID": "0000000004d63ff50000000000000000", + "KEY": "30eb93ce2b208425c90ec312a9d92f8a" + }, + { + "NAME": "Sacred Games S01E03 Atapi Vatapi", + "PSSH": null, + "ID": 1, + "KID": "0000000004d5fe6d0000000000000000", + "KEY": "960869ab112f560a7b3c8a2c05abaf92" + }, + { + "NAME": "Sacred Games S01E04 Brahmahatya", + "PSSH": null, + "ID": 1, + "KID": "0000000004d6e5930000000000000000", + "KEY": "122b2ea2a89f0194bd77a9bf04dd1294" + }, + { + "NAME": "Sacred Games S01E05 Sarama", + "PSSH": null, + "ID": 1, + "KID": "0000000004d71c730000000000000000", + "KEY": "d38e103ae35ca99cdd68fd7da2a2c111" + }, + { + "NAME": "Sacred Games S01E06 Pretakalpa", + "PSSH": null, + "ID": 1, + "KID": "0000000004d73da90000000000000000", + "KEY": "5a45bb6db2c65bbef7f03bb080a446c5" + }, + { + "NAME": "Sacred Games S01E07 Rudra", + "PSSH": null, + "ID": 1, + "KID": "0000000004d797990000000000000000", + "KEY": "49c4368f385b7f421ade3dea286ce019" + }, + { + "NAME": "Sacred Games S01E08 Yayati", + "PSSH": null, + "ID": 1, + "KID": "0000000004d7bbd70000000000000000", + "KEY": "17d5412a106fd46777f130ff6f0975b6" + }, + { + "NAME": "Bard of Blood S01E01 What's Past Is Prologue", + "PSSH": null, + "ID": 1, + "KID": "00000000056c4f250000000000000000", + "KEY": "c513748194ad82d4fa6e5910703e6ec6" + }, + { + "NAME": "Bard of Blood S01E02 When Sorrows Come, They Come Not Single Spies, but in Battalions", + "PSSH": null, + "ID": 1, + "KID": "00000000056e738d0000000000000000", + "KEY": "3628c4c15a1714278b940765065ef451" + }, + { + "NAME": "Bard of Blood S01E03 So Quick Bright Things Come to Confusion", + "PSSH": null, + "ID": 1, + "KID": "00000000056fdd590000000000000000", + "KEY": "a4ad58ebe7a447ffb937f82fb9fa0ab6" + }, + { + "NAME": "Bard of Blood S01E04 Love All, Trust a Few, Do Wrong to None", + "PSSH": null, + "ID": 1, + "KID": "00000000056f53010000000000000000", + "KEY": "3ab894bff4d0667a63fcce7ac820ed0e" + }, + { + "NAME": "Bard of Blood S01E05 Fight Fire With Fire", + "PSSH": null, + "ID": 1, + "KID": "0000000005731ba50000000000000000", + "KEY": "0967bf63861923f8a3e7acf525299c06" + }, + { + "NAME": "Bard of Blood S01E06 Heat Not a Furnace for Your Foe So Hot That It Do Singe Yourself", + "PSSH": null, + "ID": 1, + "KID": "00000000057016a10000000000000000", + "KEY": "b55003c7df540d4c87c1daf8b9971fbd" + }, + { + "NAME": "Bard of Blood S01E07 My Stronger Guilt Defeats My Strong Intent", + "PSSH": null, + "ID": 1, + "KID": "000000000571979d0000000000000000", + "KEY": "3ef1b7721991d5c041964519075852e1" + }, + { + "NAME": "She S01E01 the Pickup", + "PSSH": null, + "ID": 1, + "KID": "00000000059355f10000000000000000", + "KEY": "3d7f38c26f6ebd610833218b5c68bace" + }, + { + "NAME": "She S01E02 the Proposal", + "PSSH": null, + "ID": 1, + "KID": "00000000059390190000000000000000", + "KEY": "054b864eaa58cd3252c60bc4d10d6cc7" + }, + { + "NAME": "She S01E03 the Pawn's Move", + "PSSH": null, + "ID": 1, + "KID": "000000000594ebd10000000000000000", + "KEY": "f013441061d70470d275ab2232ea2ecc" + }, + { + "NAME": "She S01E04 Night Walk", + "PSSH": null, + "ID": 1, + "KID": "0000000005993e950000000000000000", + "KEY": "f9e4fd62c8235f2bd4a2d9052557ce69" + }, + { + "NAME": "She S01E05 It's Time", + "PSSH": null, + "ID": 1, + "KID": "000000000595bbf10000000000000000", + "KEY": "fa3fb7d3c86d0add89be75e17f0b90a5" + }, + { + "NAME": "She S01E06 the Promise", + "PSSH": null, + "ID": 1, + "KID": "00000000059b902d0000000000000000", + "KEY": "69f2807dc5c7c64c10fd2e08e7b66f22" + }, + { + "NAME": "She S01E07 Devil's Share", + "PSSH": null, + "ID": 1, + "KID": "00000000059ee3210000000000000000", + "KEY": "a360133e17e499a5ede2316b102a8fff" + }, + { + "NAME": "Stranger Things S01E01 Chapter One - The Vanishing of Will Byers", + "PSSH": null, + "ID": 1, + "KID": "000000000598eed90000000000000000", + "KEY": "bab0ba4c4e587e820882558d9ec04672" + }, + { + "NAME": "Stranger Things S01E02 Chapter Two - The Weirdo on Maple Street", + "PSSH": null, + "ID": 1, + "KID": "000000000598f29d0000000000000000", + "KEY": "a5b1259bae6b78fabba66848ec3736cb" + }, + { + "NAME": "Stranger Things S01E03 Chapter Three - Holly, Jolly", + "PSSH": null, + "ID": 1, + "KID": "000000000598f6550000000000000000", + "KEY": "e38aad7ddcbb57ab67236c0a643f6d48" + }, + { + "NAME": "Stranger Things S01E04 Chapter Four - The Body", + "PSSH": null, + "ID": 1, + "KID": "000000000598f4cd0000000000000000", + "KEY": "c8787efdaf30a7c463c3b8b67e0a32d1" + }, + { + "NAME": "Stranger Things S01E05 Chapter Five - The Flea and the Acrobat", + "PSSH": null, + "ID": 1, + "KID": "000000000598f55d0000000000000000", + "KEY": "f7d3e1df13f180b8797ffb3cd366f983" + }, + { + "NAME": "Stranger Things S01E06 Chapter Six - The Monster", + "PSSH": null, + "ID": 1, + "KID": "000000000598f5e10000000000000000", + "KEY": "71220ae98efbb354578754490abf998e" + }, + { + "NAME": "Stranger Things S01E07 Chapter Seven - The Bathtub", + "PSSH": null, + "ID": 1, + "KID": "000000000598f4850000000000000000", + "KEY": "f275bf3f5e5e82fbb6b298a5859c3c15" + }, + { + "NAME": "Stranger Things S01E08 Chapter Eight - The Upside Down", + "PSSH": null, + "ID": 1, + "KID": "000000000598f5f10000000000000000", + "KEY": "178cd88de85dd4cdeaca2073a3b52b5a" + }, + { + "NAME": "Stranger Things S02E01 Chapter One - MADMAX", + "PSSH": null, + "ID": 1, + "KID": "0000000005656c680000000000000000", + "KEY": "f9f71daed086a7301c6a4511a4e34c78" + }, + { + "NAME": "Stranger Things S02E01 Chapter One - MADMAX", + "PSSH": null, + "ID": 2, + "KID": "0000000005656c660000000000000000", + "KEY": "c6b475226d6ee499de3e57be00c3a787" + }, + { + "NAME": "Stranger Things S02E01 Chapter One - MADMAX", + "PSSH": null, + "ID": 3, + "KID": "0000000005656c6a0000000000000000", + "KEY": "bdcd7a754440e3d972c84e1be043ca93" + }, + { + "NAME": "Narcos S03E01 the Kingpin Strategy", + "PSSH": null, + "ID": 1, + "KID": "00000000053311d30000000000000000", + "KEY": "88fd9ecf8a207d7a7c881bb2c11a9860" + }, + { + "NAME": "Narcos S03E02 the Cali KGB", + "PSSH": null, + "ID": 1, + "KID": "00000000053315d70000000000000000", + "KEY": "a99dd9848525f08e5a61815103922469" + }, + { + "NAME": "Narcos S03E03 Follow the Money", + "PSSH": null, + "ID": 1, + "KID": "00000000053315190000000000000000", + "KEY": "b27809c079a564cb9e9de8513e1f8d4d" + }, + { + "NAME": "Narcos S03E04 Checkmate", + "PSSH": null, + "ID": 1, + "KID": "00000000053315890000000000000000", + "KEY": "5e5cc5fa610ef8daade9741259ca626c" + }, + { + "NAME": "Narcos S03E05 Mro", + "PSSH": null, + "ID": 1, + "KID": "0000000005331d410000000000000000", + "KEY": "719e574a90e3f05f31d9afe20664b763" + }, + { + "NAME": "Narcos S03E06 Best Laid Plans", + "PSSH": null, + "ID": 1, + "KID": "00000000056079750000000000000000", + "KEY": "408e294be620b2cc39d9102a31540f01" + }, + { + "NAME": "Narcos S03E07 Sin Salida", + "PSSH": null, + "ID": 1, + "KID": "00000000056078990000000000000000", + "KEY": "aebf8a3374cb9ac3baaeadc5b5ef721f" + }, + { + "NAME": "Narcos S03E08 Convivir", + "PSSH": null, + "ID": 1, + "KID": "00000000056078060000000000000000", + "KEY": "23b7a5f27f32a07eef8146605df8fd0f" + }, + { + "NAME": "Narcos S03E09 Todos Los Hombres Del Presidente", + "PSSH": null, + "ID": 1, + "KID": "00000000056078f90000000000000000", + "KEY": "1acb7a8da7fc30abb07d3fd2e431ac35" + }, + { + "NAME": "Narcos S03E10 Going Back to Cali", + "PSSH": null, + "ID": 1, + "KID": "00000000056077c70000000000000000", + "KEY": "2d141e833098df1928d0416892830c71" + }, + { + "NAME": "Narcos S02E01 Free at Last", + "PSSH": null, + "ID": 1, + "KID": "0000000005635eb30000000000000000", + "KEY": "4cf9b0926567004208c5c9521f3bd800" + }, + { + "NAME": "Narcos S02E02 Cambalache", + "PSSH": null, + "ID": 1, + "KID": "00000000056367a10000000000000000", + "KEY": "27d0ef3d06fc7a74b85902904c90f765" + }, + { + "NAME": "Narcos S02E03 Our Man in Madrid", + "PSSH": null, + "ID": 1, + "KID": "00000000056369830000000000000000", + "KEY": "60f43b66a0ea0772d9598269aa87b281" + }, + { + "NAME": "Narcos S02E04 the Good, the Bad, and the Dead", + "PSSH": null, + "ID": 1, + "KID": "0000000005636b3a0000000000000000", + "KEY": "da9f6e1c3b5c3583d5dcd23c0b5f4607" + }, + { + "NAME": "Narcos S02E04 the Good, the Bad, and the Dead", + "PSSH": null, + "ID": 2, + "KID": "0000000005636b380000000000000000", + "KEY": "03bbc2cc1b6db80bda94b2cb41943e1e" + }, + { + "NAME": "Narcos S02E04 the Good, the Bad, and the Dead", + "PSSH": null, + "ID": 3, + "KID": "0000000005636b360000000000000000", + "KEY": "29b0c960076df6d7fbada002003e43b5" + }, + { + "NAME": "Betaal S01E01 the Tunnel", + "PSSH": null, + "ID": 1, + "KID": "00000000059434f00000000000000000", + "KEY": "43c9bbb1c37ea801aa6b7bb6c7ed82fb" + }, + { + "NAME": "Betaal S01E01 the Tunnel", + "PSSH": null, + "ID": 2, + "KID": "00000000059434ee0000000000000000", + "KEY": "545cbc3932be3546de282fb3ac3f8f18" + }, + { + "NAME": "Betaal S01E01 the Tunnel", + "PSSH": null, + "ID": 3, + "KID": "00000000059434f20000000000000000", + "KEY": "16ade1672d9abde370e08b4c0e3c854a" + }, + { + "NAME": "Betaal S01E01 the Tunnel", + "PSSH": null, + "ID": 1, + "KID": "00000000059434ee0000000000000000", + "KEY": "545cbc3932be3546de282fb3ac3f8f18" + }, + { + "NAME": "Betaal S01E01 the Tunnel", + "PSSH": null, + "ID": 2, + "KID": "00000000059434f00000000000000000", + "KEY": "43c9bbb1c37ea801aa6b7bb6c7ed82fb" + }, + { + "NAME": "Betaal S01E01 the Tunnel", + "PSSH": null, + "ID": 3, + "KID": "00000000059434f20000000000000000", + "KEY": "16ade1672d9abde370e08b4c0e3c854a" + }, + { + "NAME": "Ozark S01E01 Sugarwood", + "PSSH": null, + "ID": 1, + "KID": "0000000005a224d00000000000000000", + "KEY": "cbe405c5759d99a0d5149fa8d34f52e7" + }, + { + "NAME": "Ozark S01E01 Sugarwood", + "PSSH": null, + "ID": 2, + "KID": "0000000005a224ce0000000000000000", + "KEY": "9a6de08168fe83965425e7718ee44741" + }, + { + "NAME": "Ozark S01E01 Sugarwood", + "PSSH": null, + "ID": 3, + "KID": "0000000005a224d20000000000000000", + "KEY": "9ecf832af424aa826674324f5908db3e" + }, + { + "NAME": "Lust Stories 2018", + "PSSH": null, + "ID": 1, + "KID": "0000000004d5eb090000000000000000", + "KEY": "933aac254dd686dd629b41e04009e881" + }, + { + "NAME": "Chopsticks 2019", + "PSSH": null, + "ID": 1, + "KID": "0000000005339cfb0000000000000000", + "KEY": "e8027083cdcbdd7f85f862424b656c4a" + }, + { + "NAME": "Force 2 2016", + "PSSH": null, + "ID": 1, + "KID": "000000000492a97d0000000000000000", + "KEY": "62461ab74d683d0c9ce7ded602982d81" + }, + { + "NAME": "Serious Men 2020", + "PSSH": null, + "ID": 1, + "KID": "0000000005e0e1ca0000000000000000", + "KEY": "60a47bba09b0cdcc10f3d2c1c4281ff9" + }, + { + "NAME": "Choked - Paisa Bolta Hai 2020", + "PSSH": null, + "ID": 1, + "KID": "00000000059f40d60000000000000000", + "KEY": "2997d82d3bb71974af220a08de5e8f27" + }, + { + "NAME": "Choked - Paisa Bolta Hai 2020", + "PSSH": null, + "ID": 2, + "KID": "00000000059f40d40000000000000000", + "KEY": "c3df42e031cef3d6811eba40c9d73885" + }, + { + "NAME": "Choked - Paisa Bolta Hai 2020", + "PSSH": null, + "ID": 3, + "KID": "00000000059f3cea0000000000000000", + "KEY": "4c40aaa2ec94970b8de752b57ea2c568" + }, + { + "NAME": "Taj Mahal 1989 S01E01", + "PSSH": null, + "ID": 1, + "KID": "00000000059331b50000000000000000", + "KEY": "4b6cc05afe7c8e7fd59b9e906beb60ee" + }, + { + "NAME": "Taj Mahal 1989 S01E02", + "PSSH": null, + "ID": 1, + "KID": "000000000593657d0000000000000000", + "KEY": "441b5c97778515e94bf3b15fb44483ab" + }, + { + "NAME": "Taj Mahal 1989 S01E03", + "PSSH": null, + "ID": 1, + "KID": "0000000005939ab90000000000000000", + "KEY": "e3f79a1589071f6de13d57fb65c9b8c0" + }, + { + "NAME": "Taj Mahal 1989 S01E04", + "PSSH": null, + "ID": 1, + "KID": "00000000059411d50000000000000000", + "KEY": "f33a60c28faf72aae8ded9e52a5e6b83" + }, + { + "NAME": "Taj Mahal 1989 S01E05", + "PSSH": null, + "ID": 1, + "KID": "00000000059486a50000000000000000", + "KEY": "924f8b9dc168f74e2b7eef5489440f54" + }, + { + "NAME": "Taj Mahal 1989 S01E06", + "PSSH": null, + "ID": 1, + "KID": "000000000594ceed0000000000000000", + "KEY": "579e674e5f55f992f987cbe69979f6ea" + }, + { + "NAME": "Taj Mahal 1989 S01E07", + "PSSH": null, + "ID": 1, + "KID": "0000000005964a350000000000000000", + "KEY": "a366276b1d956fec0df5371a0e488b30" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E01 Chapter One - October Country", + "PSSH": null, + "ID": 1, + "KID": "0000000004dda1fb0000000000000000", + "KEY": "eb2c75d014b9e0d4a3e028eb1ca670eb" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E02 Chapter Two - The Dark Baptism", + "PSSH": null, + "ID": 1, + "KID": "0000000004dce2d70000000000000000", + "KEY": "f650127dee8309320a74466cdbffee8d" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E03 Chapter Three - The Trial of Sabrina Spellman", + "PSSH": null, + "ID": 1, + "KID": "0000000005182fb70000000000000000", + "KEY": "ddaeb92cbcb237f91f898469cdaff5d7" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E04 Chapter Four - Witch Academy", + "PSSH": null, + "ID": 1, + "KID": "0000000004df72a90000000000000000", + "KEY": "78e8d941d33ad9db26abcf0174d67427" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E05 Chapter Five - Dreams in a Witch House", + "PSSH": null, + "ID": 1, + "KID": "0000000004df93630000000000000000", + "KEY": "e3fcef235ce0db3fbe79d3d971be2ef1" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E06 Chapter Six - An Exorcism in Greendale", + "PSSH": null, + "ID": 1, + "KID": "0000000004dfffc50000000000000000", + "KEY": "810c84818c72f27ef9e6e558ecb3e815" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E07 Chapter Seven - Feast of Feasts", + "PSSH": null, + "ID": 1, + "KID": "0000000004e0e8f50000000000000000", + "KEY": "227b378f407e86522257e0db0f226529" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E08 Chapter Eight - The Burial", + "PSSH": null, + "ID": 1, + "KID": "000000000515eddd0000000000000000", + "KEY": "11148bce0a2f7744d536888537363c9a" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E09 Chapter Nine - The Returned Man", + "PSSH": null, + "ID": 1, + "KID": "00000000051620d10000000000000000", + "KEY": "ba4709ec9591430f4ac7d9cb99127d74" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E10 Chapter Ten - The Witching Hour", + "PSSH": null, + "ID": 1, + "KID": "00000000051830610000000000000000", + "KEY": "88688177fe22e35bd721aa079f4f8ea6" + }, + { + "NAME": "Chilling Adventures of Sabrina S01E11 Chapter Eleven - A Midwinter's Tale", + "PSSH": null, + "ID": 1, + "KID": "00000000051eaf570000000000000000", + "KEY": "52d77300ba270f3d0f96c99d52719235" + }, + { + "NAME": "Chilling Adventures of Sabrina S02E01 Chapter Twelve - The Epiphany", + "PSSH": null, + "ID": 1, + "KID": "00000000052357730000000000000000", + "KEY": "9e8d0bae58ee1f2e82f0ff6be51f0ba4" + }, + { + "NAME": "Chilling Adventures of Sabrina S02E02 Chapter Thirteen - The Passion of Sabrina Spellman", + "PSSH": null, + "ID": 1, + "KID": "00000000052356b90000000000000000", + "KEY": "b4f0b0ac66587ebaa79f3792730f5475" + }, + { + "NAME": "Chilling Adventures of Sabrina S02E03 Chapter Fourteen - Lupercalia", + "PSSH": null, + "ID": 1, + "KID": "000000000523dc0d0000000000000000", + "KEY": "c13e06dabc3872c8bec7274433ba456c" + }, + { + "NAME": "Chilling Adventures of Sabrina S02E04 Chapter Fifteen - Doctor Cerberus's House of Horror", + "PSSH": null, + "ID": 1, + "KID": "000000000524fd1f0000000000000000", + "KEY": "4d54446a34f3f5f42547b2e5546967a1" + }, + { + "NAME": "Chilling Adventures of Sabrina S02E05 Chapter Sixteen - Blackwood", + "PSSH": null, + "ID": 1, + "KID": "0000000005252f150000000000000000", + "KEY": "1c5cd19a34941653256c504fcf228cb5" + }, + { + "NAME": "Chilling Adventures of Sabrina S02E06 Chapter Seventeen - The Missionaries", + "PSSH": null, + "ID": 1, + "KID": "000000000528221b0000000000000000", + "KEY": "84e3cc78c97b7cee8d576d4472c8488d" + }, + { + "NAME": "Chilling Adventures of Sabrina S02E07 Chapter Eighteen - The Miracles of Sabrina Spellman", + "PSSH": null, + "ID": 1, + "KID": "00000000052c498d0000000000000000", + "KEY": "f25a5ca0c76f8e051ec55ebf2027998f" + }, + { + "NAME": "Chilling Adventures of Sabrina S02E08 Chapter Nineteen - The Mandrake", + "PSSH": null, + "ID": 1, + "KID": "00000000052c53d30000000000000000", + "KEY": "8212e11c29a94bd7348f92b2af1781ee" + }, + { + "NAME": "Chilling Adventures of Sabrina S02E09 Chapter Twenty - The Mephisto Waltz", + "PSSH": null, + "ID": 1, + "KID": "00000000052c8f290000000000000000", + "KEY": "d786eb79d08946a1d1ff6b4beabaefee" + }, + { + "NAME": "Chilling Adventures of Sabrina S03E01 Chapter Twenty-One - The Hellbound Heart", + "PSSH": null, + "ID": 1, + "KID": "000000000580032d0000000000000000", + "KEY": "b3e1e52c2377b62ed07d8a10ed91c407" + }, + { + "NAME": "Chilling Adventures of Sabrina S03E02 Chapter Twenty-Two - Drag Me to Hell", + "PSSH": null, + "ID": 1, + "KID": "00000000058003090000000000000000", + "KEY": "0eed2b23ef7ae52e554bf9853e25bcf5" + }, + { + "NAME": "Chilling Adventures of Sabrina S03E03 Chapter Twenty-Three - Heavy Is the Crown", + "PSSH": null, + "ID": 1, + "KID": "00000000058ab8cd0000000000000000", + "KEY": "6ea595a730ec6aacd44a94830dc4d31d" + }, + { + "NAME": "Chilling Adventures of Sabrina S03E04 Chapter Twenty-Four - The Hare Moon", + "PSSH": null, + "ID": 1, + "KID": "00000000058abd150000000000000000", + "KEY": "834785135ce2110da8f728b595032a54" + }, + { + "NAME": "Chilling Adventures of Sabrina S03E05 Chapter Twenty-Five - The Devil Within", + "PSSH": null, + "ID": 1, + "KID": "00000000058222a10000000000000000", + "KEY": "23953e24d78d53e80ab71c206f632f89" + }, + { + "NAME": "Chilling Adventures of Sabrina S03E06 Chapter Twenty-Six - All of Them Witches", + "PSSH": null, + "ID": 1, + "KID": "000000000586e97d0000000000000000", + "KEY": "19a7c34d51a290e6084279978828d186" + }, + { + "NAME": "Chilling Adventures of Sabrina S03E07 Chapter Twenty-Seven - The Judas Kiss", + "PSSH": null, + "ID": 1, + "KID": "00000000058894950000000000000000", + "KEY": "cc3a246d46be6d5705e31ccffd845c27" + }, + { + "NAME": "Chilling Adventures of Sabrina S03E08 Chapter Twenty-Eight - Sabrina Is Legend", + "PSSH": null, + "ID": 1, + "KID": "00000000058bedc90000000000000000", + "KEY": "97171df8e3ef1cbfdd6f282084b19a26" + }, + { + "NAME": "Chilling Adventures of Sabrina S04E01 Chapter Twenty-Nine - The Eldritch Dark", + "PSSH": null, + "ID": 1, + "KID": "00000000059271b90000000000000000", + "KEY": "3d121d7e3ae3863979ee0849b830fdfc" + }, + { + "NAME": "Chilling Adventures of Sabrina S04E02 Chapter Thirty - The Uninvited", + "PSSH": null, + "ID": 1, + "KID": "00000000059c4a9d0000000000000000", + "KEY": "4463b5b1e6dbfdd7777f2924d027492a" + }, + { + "NAME": "Chilling Adventures of Sabrina S04E03 Chapter Thirty-One - The Weird", + "PSSH": null, + "ID": 1, + "KID": "00000000059c49d50000000000000000", + "KEY": "d265194425cacf04e52b0148b02cf4ff" + }, + { + "NAME": "Chilling Adventures of Sabrina S04E04 Chapter Thirty-Two - The Imp of the Perverse", + "PSSH": null, + "ID": 1, + "KID": "0000000005a259b10000000000000000", + "KEY": "f974f7019a2e4c45b851174c19ffe76c" + }, + { + "NAME": "Chilling Adventures of Sabrina S04E05 Chapter Thirty-Three - Deus Ex Machina", + "PSSH": null, + "ID": 1, + "KID": "0000000005a604110000000000000000", + "KEY": "8704557ec589eb2be87e3b70a5b1ccf3" + }, + { + "NAME": "Chilling Adventures of Sabrina S04E06 Chapter Thirty-Four - The Returned", + "PSSH": null, + "ID": 1, + "KID": "0000000005c53b010000000000000000", + "KEY": "61419177b3313cb6e21747387388273b" + }, + { + "NAME": "Chilling Adventures of Sabrina S04E07 Chapter Thirty-Five - The Endless", + "PSSH": null, + "ID": 1, + "KID": "0000000005c72dae0000000000000000", + "KEY": "f3d64f82456dcf5a7ac4c4d0c84739c7" + }, + { + "NAME": "Chilling Adventures of Sabrina S04E08 Chapter Thirty-Six - At the Mountains of Madness", + "PSSH": null, + "ID": 1, + "KID": "0000000005ccbda00000000000000000", + "KEY": "d054db9e0eff9495d20febc308684ce9" + }, + { + "NAME": "Bhaag Beanie Bhaag S01E01", + "PSSH": null, + "ID": 1, + "KID": "0000000005e1db2c0000000000000000", + "KEY": "21a6467e35cef07daf15b7650da04ba5" + }, + { + "NAME": "Bhaag Beanie Bhaag S01E02", + "PSSH": null, + "ID": 1, + "KID": "0000000005e247900000000000000000", + "KEY": "7163abe227577ce50da752baf04c7a46" + }, + { + "NAME": "Bhaag Beanie Bhaag S01E03", + "PSSH": null, + "ID": 1, + "KID": "0000000005e2a0fa0000000000000000", + "KEY": "d301bbe1dc4cdf6ef154f748ed270994" + }, + { + "NAME": "Bhaag Beanie Bhaag S01E04", + "PSSH": null, + "ID": 1, + "KID": "0000000005e7ee4d0000000000000000", + "KEY": "5b7faaa047dc05b5b1bf1a5f3872bddd" + }, + { + "NAME": "Bhaag Beanie Bhaag S01E05", + "PSSH": null, + "ID": 1, + "KID": "0000000005e83de90000000000000000", + "KEY": "90cd56ba8d7da3b56d14b8fe1203386f" + }, + { + "NAME": "Bhaag Beanie Bhaag S01E06", + "PSSH": null, + "ID": 1, + "KID": "0000000005ecd0fc0000000000000000", + "KEY": "a02280ee81fe959d2855c88ac0ee0df2" + }, + { + "NAME": "Betaal S01E01 the Tunnel", + "PSSH": null, + "ID": 1, + "KID": "00000000059434ed0000000000000000", + "KEY": "ca6c25db7bf1a05609e14e5f68e5fbde" + }, + { + "NAME": "Betaal S01E02 the Barracks", + "PSSH": null, + "ID": 1, + "KID": "0000000005943d810000000000000000", + "KEY": "eeb29a6438049f87f0de8cfed03828fa" + }, + { + "NAME": "Betaal S01E03 the Battle", + "PSSH": null, + "ID": 1, + "KID": "000000000598ac690000000000000000", + "KEY": "b60168fdf217678c3a1b47da3a82c44a" + }, + { + "NAME": "Betaal S01E04 the Colonel", + "PSSH": null, + "ID": 1, + "KID": "00000000059b967d0000000000000000", + "KEY": "50025700cc677b192bfd8ca6b20ea38d" + }, + { + "NAME": "Leila S01E01", + "PSSH": null, + "ID": 1, + "KID": "000000000530f5bd0000000000000000", + "KEY": "311c135d06210f515691d1accc3d6e75" + }, + { + "NAME": "Leila S01E02", + "PSSH": null, + "ID": 1, + "KID": "00000000056081750000000000000000", + "KEY": "4f973d9517e1c85f6aa0d53fd10fdf60" + }, + { + "NAME": "Leila S01E03", + "PSSH": null, + "ID": 1, + "KID": "00000000056324bf0000000000000000", + "KEY": "7aece6f077bed6b8f2eb6be7e986a46c" + }, + { + "NAME": "Leila S01E04", + "PSSH": null, + "ID": 1, + "KID": "00000000056269550000000000000000", + "KEY": "9cd620b6a4fa8cc3a845bbe555b42ff6" + }, + { + "NAME": "Leila S01E05", + "PSSH": null, + "ID": 1, + "KID": "0000000005632bad0000000000000000", + "KEY": "db4fdf74d82327f0dcf6bb3b358458ab" + }, + { + "NAME": "Leila S01E06", + "PSSH": null, + "ID": 1, + "KID": "0000000005633c590000000000000000", + "KEY": "7fb525e3eed0cb67cc8df3d729b99618" + }, + { + "NAME": "Typewriter S01E01 Chapter 1 - Four Kids and a Dog", + "PSSH": null, + "ID": 1, + "KID": "00000000056167290000000000000000", + "KEY": "efcf4700c99af5c76004bd10a4dee906" + }, + { + "NAME": "Typewriter S01E02 Chapter 2 - Operation School Bell", + "PSSH": null, + "ID": 1, + "KID": "000000000562fab70000000000000000", + "KEY": "84b7f6dacbef3c53a1a37570506daa37" + }, + { + "NAME": "Typewriter S01E03 Chapter 3 - The Ghost of Sultanpore", + "PSSH": null, + "ID": 1, + "KID": "000000000562f3410000000000000000", + "KEY": "083bbbfd09427e2c41e70d6d5da9ce29" + }, + { + "NAME": "Typewriter S01E04 Chapter 4 - The Rise of the Fakeer", + "PSSH": null, + "ID": 1, + "KID": "000000000563e8fd0000000000000000", + "KEY": "790a5b7d7fe2704e170ca59b48f43fa8" + }, + { + "NAME": "Typewriter S01E05 Chapter 5 - The Night of the Blood Moon", + "PSSH": null, + "ID": 1, + "KID": "000000000563e8c90000000000000000", + "KEY": "e8fee005886a3ee486bf8ec787879365" + }, + { + "NAME": "The Package 2018", + "PSSH": null, + "ID": 1, + "KID": "0000000004da4e6d0000000000000000", + "KEY": "26a8483720271f6a8758c3c260a0392c" + }, + { + "NAME": "The Upshaws S01E01 Birthday B.S.", + "PSSH": null, + "ID": 1, + "KID": "00000000065665f00000000000000000", + "KEY": "ea9af0f74d9df085fd9cf5fe70c99b90" + }, + { + "NAME": "The Upshaws S01E02 the Hook-Up", + "PSSH": null, + "ID": 1, + "KID": "00000000065674f10000000000000000", + "KEY": "ee3e0b57ff5e95524a02b72238e3c337" + }, + { + "NAME": "The Upshaws S01E03 Joy Ride", + "PSSH": null, + "ID": 1, + "KID": "000000000657d5d80000000000000000", + "KEY": "cf38eda71e59658414587928612cb1e7" + }, + { + "NAME": "The Upshaws S01E04 Big Plans", + "PSSH": null, + "ID": 1, + "KID": "00000000065962980000000000000000", + "KEY": "3ec4afbdc7c54a92b12fa69c65a2175a" + }, + { + "NAME": "The Upshaws S01E05 Ridin' Dirty", + "PSSH": null, + "ID": 1, + "KID": "00000000065b3beb0000000000000000", + "KEY": "d2b78b31d0a46a07b61fbde54fdecca0" + }, + { + "NAME": "The Upshaws S01E06 Last Straw", + "PSSH": null, + "ID": 1, + "KID": "00000000065b90a10000000000000000", + "KEY": "bfa4cf7b91b5f90c6f4b361c35e57e26" + }, + { + "NAME": "The Upshaws S01E07 Yard Sale", + "PSSH": null, + "ID": 1, + "KID": "00000000066012e10000000000000000", + "KEY": "6dba1f945cd1d95c04b4d567c70cd076" + }, + { + "NAME": "The Upshaws S01E08 Night Out", + "PSSH": null, + "ID": 1, + "KID": "000000000660468c0000000000000000", + "KEY": "8fecc5c35620384a7419ac2bd82a5f9b" + }, + { + "NAME": "The Upshaws S01E09 Gloves Off", + "PSSH": null, + "ID": 1, + "KID": "000000000662b0dd0000000000000000", + "KEY": "da7c67e6f9575f0f369f54fa32ebc8c9" + }, + { + "NAME": "The Upshaws S01E10 the Backslide", + "PSSH": null, + "ID": 1, + "KID": "000000000662abc40000000000000000", + "KEY": "a443f933c6adf6e526d1212287d5a3e3" + }, + { + "NAME": "Delhi Crime S01E01", + "PSSH": null, + "ID": 1, + "KID": "00000000052cd3930000000000000000", + "KEY": "c04038a00b3f8e4847f40e0912d5d428" + }, + { + "NAME": "Delhi Crime S01E02", + "PSSH": null, + "ID": 1, + "KID": "00000000052cd0b50000000000000000", + "KEY": "ee2a19cfe90577792a23d3d2a31ac045" + }, + { + "NAME": "Delhi Crime S01E03", + "PSSH": null, + "ID": 1, + "KID": "00000000052ccd0f0000000000000000", + "KEY": "a9fa0062ecbc48bb582b0fbc873035d9" + }, + { + "NAME": "Delhi Crime S01E04", + "PSSH": null, + "ID": 1, + "KID": "00000000052cc0170000000000000000", + "KEY": "308cfbe3892bffcb5ee010ade72be304" + }, + { + "NAME": "Delhi Crime S01E05", + "PSSH": null, + "ID": 1, + "KID": "00000000052d02e70000000000000000", + "KEY": "e13bdc0b2f016cccf2646300bad0aeb1" + }, + { + "NAME": "Delhi Crime S01E06", + "PSSH": null, + "ID": 1, + "KID": "00000000052cfd510000000000000000", + "KEY": "cbabb9a13fc2425e488c12ce65b02483" + }, + { + "NAME": "Delhi Crime S01E07", + "PSSH": null, + "ID": 1, + "KID": "00000000052d0a0b0000000000000000", + "KEY": "9622764fa60228d7952e5fb983d595e5" + }, + { + "NAME": "Ghoul S01E01 Out of the Smokeless Fire", + "PSSH": null, + "ID": 1, + "KID": "0000000004da1ee10000000000000000", + "KEY": "372e1d702430eb26c3e66c048cefcd96" + }, + { + "NAME": "Ghoul S01E02 the Nightmares Will Begin", + "PSSH": null, + "ID": 1, + "KID": "0000000004d889f70000000000000000", + "KEY": "fbb8a351b149189a05f8cdff8b3c5c3c" + }, + { + "NAME": "Ghoul S01E03 Reveal Their Guilt, Eat Their Flesh", + "PSSH": null, + "ID": 1, + "KID": "0000000004d9207d0000000000000000", + "KEY": "c54048c0a5cef8406db5dc221db1c701" + }, + { + "NAME": "Marvel's Luke Cage S01E01 Moment of Truth", + "PSSH": null, + "ID": 1, + "KID": "00000000047160390000000000000000", + "KEY": "51c299cd2bff75c8bceead8d026a41b8" + }, + { + "NAME": "Marvel's Luke Cage S01E02 Code of the Streets", + "PSSH": null, + "ID": 1, + "KID": "00000000047163110000000000000000", + "KEY": "903e148ffed3eb8cebcef9c713123cac" + }, + { + "NAME": "Marvel's Luke Cage S01E03 Who's Gonna Take the Weight", + "PSSH": null, + "ID": 1, + "KID": "0000000004717cd90000000000000000", + "KEY": "8ad4bf51359597c2c27160e6b7177621" + }, + { + "NAME": "Marvel's Luke Cage S01E04 Step in the Arena", + "PSSH": null, + "ID": 1, + "KID": "0000000004718e210000000000000000", + "KEY": "87990a0c3039fb6088424f9036ddd330" + }, + { + "NAME": "Marvel's Luke Cage S01E05 Just to Get a Rep", + "PSSH": null, + "ID": 1, + "KID": "0000000004719b250000000000000000", + "KEY": "103b9e8a512141c09ec20f47663bc793" + }, + { + "NAME": "Marvel's Luke Cage S01E06 Suckas Need Bodyguards", + "PSSH": null, + "ID": 1, + "KID": "000000000471e7010000000000000000", + "KEY": "a876293b4424a0865a994ebb112ff981" + }, + { + "NAME": "Marvel's Luke Cage S01E07 Manifest", + "PSSH": null, + "ID": 1, + "KID": "0000000004717ed10000000000000000", + "KEY": "202c241feffa2b56a762e8cde825fbef" + }, + { + "NAME": "Marvel's Luke Cage S01E08 Blowin' Up the Spot", + "PSSH": null, + "ID": 1, + "KID": "00000000047180910000000000000000", + "KEY": "5e2ddb32df6a2cefa0365c18ee845238" + }, + { + "NAME": "Marvel's Luke Cage S01E09 Dwyck", + "PSSH": null, + "ID": 1, + "KID": "00000000047182c10000000000000000", + "KEY": "223ee057dfcfd0cab7eebc58f124c3ed" + }, + { + "NAME": "Marvel's Luke Cage S01E10 Take It Personal", + "PSSH": null, + "ID": 1, + "KID": "000000000471e3050000000000000000", + "KEY": "2cc7c8dcbb489332e75b5e1e7d0d1640" + }, + { + "NAME": "Marvel's Luke Cage S01E11 Now You're Mine", + "PSSH": null, + "ID": 1, + "KID": "0000000004717f410000000000000000", + "KEY": "d8a5cef81e9064b76f5b928546ed515c" + }, + { + "NAME": "Marvel's Luke Cage S01E12 Soliloquy of Chaos", + "PSSH": null, + "ID": 1, + "KID": "000000000471803d0000000000000000", + "KEY": "5c1866d1d8e0c495b7473f057119d0a1" + }, + { + "NAME": "Marvel's Luke Cage S01E13 You Know My Steez", + "PSSH": null, + "ID": 1, + "KID": "000000000471b06d0000000000000000", + "KEY": "d04882daa7b6bae905d26adb3e9b3afb" + }, + { + "NAME": "Marvel's Luke Cage S02E01 Soul Brother #1", + "PSSH": null, + "ID": 1, + "KID": "0000000004c7adf10000000000000000", + "KEY": "0825fad5ce6324ce2a643220f95df606" + }, + { + "NAME": "Marvel's Luke Cage S02E02 Straighten It Out", + "PSSH": null, + "ID": 1, + "KID": "0000000004c7ab9d0000000000000000", + "KEY": "0f8f9d97704a68ae17f727a1e589f55d" + }, + { + "NAME": "Marvel's Luke Cage S02E03 Wig Out", + "PSSH": null, + "ID": 1, + "KID": "0000000004c836b70000000000000000", + "KEY": "fd298de76d74aee3880f82ae08d16819" + }, + { + "NAME": "Marvel's Luke Cage S02E04 I Get Physical", + "PSSH": null, + "ID": 1, + "KID": "0000000004c7cbb30000000000000000", + "KEY": "ed58ffadd2c56c1f542df3c2666780ef" + }, + { + "NAME": "Marvel's Luke Cage S02E05 All Souled Out", + "PSSH": null, + "ID": 1, + "KID": "0000000004c8b9430000000000000000", + "KEY": "a7e4daad283b4e9ccf26daf2e5939dbf" + }, + { + "NAME": "Marvel's Luke Cage S02E06 the Basement", + "PSSH": null, + "ID": 1, + "KID": "0000000004ce0d8b0000000000000000", + "KEY": "f124d0bb7048a81a3c5735e5f27b762b" + }, + { + "NAME": "Marvel's Luke Cage S02E07 on and On", + "PSSH": null, + "ID": 1, + "KID": "0000000004cdd14d0000000000000000", + "KEY": "85414be0d419d0b5e3db999fa2a743af" + }, + { + "NAME": "Marvel's Luke Cage S02E08 if It Ain't Rough, It Ain't Right", + "PSSH": null, + "ID": 1, + "KID": "0000000004cdd0730000000000000000", + "KEY": "7626ef0be6a1bb7270c3021e4e31a4ee" + }, + { + "NAME": "Marvel's Luke Cage S02E09 for Pete's Sake", + "PSSH": null, + "ID": 1, + "KID": "0000000004ce991f0000000000000000", + "KEY": "27c8d4b248184ae9dcd23184453330d1" + }, + { + "NAME": "Marvel's Luke Cage S02E10 the Main Ingredient", + "PSSH": null, + "ID": 1, + "KID": "0000000004d01f4d0000000000000000", + "KEY": "920e01bd381da1d7d5de723803f87b09" + }, + { + "NAME": "Marvel's Luke Cage S02E11 the Creator", + "PSSH": null, + "ID": 1, + "KID": "0000000004d128df0000000000000000", + "KEY": "972a71d6a6243e36d7128f9937b36c25" + }, + { + "NAME": "Marvel's Luke Cage S02E12 Can't Front on Me", + "PSSH": null, + "ID": 1, + "KID": "0000000004d1a4a10000000000000000", + "KEY": "7de0e3b7ac01c7ceb5f11d4409e121f7" + }, + { + "NAME": "Marvel's Luke Cage S02E13 They Reminisce Over You", + "PSSH": null, + "ID": 1, + "KID": "0000000004d1c29d0000000000000000", + "KEY": "518f7a2c25541b18737a97304ffe9854" + }, + { + "NAME": "Shadow and Bone S01E01 a Searing Burst of Light", + "PSSH": null, + "ID": 1, + "KID": "0000000005ff299b0000000000000000", + "KEY": "9cc5b407152431b151a5b127a01338d0" + }, + { + "NAME": "Shadow and Bone S01E02 Were All Someones Monster", + "PSSH": null, + "ID": 1, + "KID": "00000000063aa2af0000000000000000", + "KEY": "b84ab834fc67bf1c6b95621190b9b579" + }, + { + "NAME": "Shadow and Bone S01E03 the Making at the Heart of the World", + "PSSH": null, + "ID": 1, + "KID": "00000000063a297e0000000000000000", + "KEY": "73b3c1bf5c8c3694e41e87373aab25b2" + }, + { + "NAME": "Shadow and Bone S01E04 Otkazatsya", + "PSSH": null, + "ID": 1, + "KID": "00000000063a289a0000000000000000", + "KEY": "3833de9365643527ad9dbf743f36e156" + }, + { + "NAME": "Shadow and Bone S01E05 Show Me Who You Are", + "PSSH": null, + "ID": 1, + "KID": "00000000064780420000000000000000", + "KEY": "e44f142ec33749ecf88078b1b7e4cc1e" + }, + { + "NAME": "Shadow and Bone S01E06 the Heart Is an Arrow", + "PSSH": null, + "ID": 1, + "KID": "00000000064778130000000000000000", + "KEY": "f10e7c1fc87645227f59762e662a0633" + }, + { + "NAME": "Shadow and Bone S01E07 the Unsea", + "PSSH": null, + "ID": 1, + "KID": "000000000656959f0000000000000000", + "KEY": "8bb528f70c1ce8a7f6bd0f5cf6a34873" + }, + { + "NAME": "Shadow and Bone S01E08 No Mourners", + "PSSH": null, + "ID": 1, + "KID": "000000000656ab950000000000000000", + "KEY": "9634489cc6c7a995edb13fc04a5a7dd5" + }, + { + "NAME": "Shadow and Bone S01E01 a Searing Burst of Light", + "PSSH": null, + "ID": 1, + "KID": "0000000005ff29a10000000000000000", + "KEY": "57f6d5e688c551ce7aca8e367b6f9e17" + }, + { + "NAME": "Shadow and Bone S01E01 a Searing Burst of Light", + "PSSH": null, + "ID": 2, + "KID": "0000000005ff299d0000000000000000", + "KEY": "a902ff0cfae93cd2c0421ef76f16ecd2" + }, + { + "NAME": "Oxygen 2021", + "PSSH": null, + "ID": 1, + "KID": "00000000066f940a0000000000000000", + "KEY": "6b44b775ab7291e69e156c1b7dea7a55" + }, + { + "NAME": "Bheeshma 2020", + "PSSH": null, + "ID": 1, + "KID": "0000000005a8d5210000000000000000", + "KEY": "7de72d0e38598c895f070e979d94a5e7" + }, + { + "NAME": "The Kissing Booth 2018", + "PSSH": null, + "ID": 1, + "KID": "0000000004d235e30000000000000000", + "KEY": "79e17ba8ff3ce927820c4b93222031b2" + }, + { + "NAME": "Mismatched S01E01 When Dimple Met Rishi", + "PSSH": null, + "ID": 1, + "KID": "0000000005ecc5b20000000000000000", + "KEY": "50f65f2eab18237a03ef6f3dc7048c7a" + }, + { + "NAME": "Mismatched S01E02 Hot Summer, Cold Vibes", + "PSSH": null, + "ID": 1, + "KID": "0000000005ef4c740000000000000000", + "KEY": "e778291b89097de50dfcf1861c9b6329" + }, + { + "NAME": "Mismatched S01E03 Message Deleted", + "PSSH": null, + "ID": 1, + "KID": "0000000005edc7000000000000000000", + "KEY": "c894c09a2a8ba658cd9f16a4ab39b0f9" + }, + { + "NAME": "Mismatched S01E04 Making Moves", + "PSSH": null, + "ID": 1, + "KID": "0000000005eee9b20000000000000000", + "KEY": "99ed26764f88a0f1fad2721f8a815368" + }, + { + "NAME": "Mismatched S01E05 It's Not a Date", + "PSSH": null, + "ID": 1, + "KID": "0000000005efc6900000000000000000", + "KEY": "e2fa513fc76dadfe98b65519148e335c" + }, + { + "NAME": "Mismatched S01E06 Games We Play", + "PSSH": null, + "ID": 1, + "KID": "0000000005f1277e0000000000000000", + "KEY": "886d4fdb772bc7639bd09123ce1a3f26" + }, + { + "NAME": "Sex Education S01E01", + "PSSH": null, + "ID": 1, + "KID": "00000000051e13310000000000000000", + "KEY": "cc2f7080c18bee8e888f6c3acf28b2d3" + }, + { + "NAME": "Sex Education S01E02", + "PSSH": null, + "ID": 1, + "KID": "00000000051f74410000000000000000", + "KEY": "acd600baf6ab6de737fd27032fa2addf" + }, + { + "NAME": "Sex Education S01E03", + "PSSH": null, + "ID": 1, + "KID": "00000000051e31930000000000000000", + "KEY": "c46a89da136c9ae013fcf3059f592203" + }, + { + "NAME": "Sex Education S01E04", + "PSSH": null, + "ID": 1, + "KID": "00000000051f82810000000000000000", + "KEY": "8264fe1dc9d59571a99f5cc6e41827a1" + }, + { + "NAME": "Sex Education S01E05", + "PSSH": null, + "ID": 1, + "KID": "0000000005217fcb0000000000000000", + "KEY": "562c97c188264876cd04fbc7a4801675" + }, + { + "NAME": "Sex Education S01E06", + "PSSH": null, + "ID": 1, + "KID": "0000000005227e110000000000000000", + "KEY": "fb77227ad054bc943032704db0f0300b" + }, + { + "NAME": "Sex Education S01E07", + "PSSH": null, + "ID": 1, + "KID": "00000000052280dd0000000000000000", + "KEY": "654d837b29a9ba132f79e48bddec54e0" + }, + { + "NAME": "Sex Education S01E08", + "PSSH": null, + "ID": 1, + "KID": "000000000521b5c50000000000000000", + "KEY": "8ebb188ccb3f54b2d6a65fdafc5d2960" + }, + { + "NAME": "Sex Education S02E01", + "PSSH": null, + "ID": 1, + "KID": "00000000058d88210000000000000000", + "KEY": "7a084c57a31aa0a9c877e3d7f8a9aa24" + }, + { + "NAME": "Sex Education S02E02", + "PSSH": null, + "ID": 1, + "KID": "000000000585b9c10000000000000000", + "KEY": "8ee22bfa4a8ff3aadb89a81209688d85" + }, + { + "NAME": "Sex Education S02E03", + "PSSH": null, + "ID": 1, + "KID": "00000000058652a90000000000000000", + "KEY": "bdc621f6b72377798b229618dfe2c725" + }, + { + "NAME": "Sex Education S02E04", + "PSSH": null, + "ID": 1, + "KID": "000000000674248f0000000000000000", + "KEY": "b217beac971b2c45e79a3a3331014900" + }, + { + "NAME": "13 Reasons Why S01E01 Tape 1, Side A", + "PSSH": null, + "ID": 1, + "KID": "000000000521e0bd0000000000000000", + "KEY": "4284f0767cd906191611cdd77c104cc9" + }, + { + "NAME": "13 Reasons Why S01E02 Tape 1, Side B", + "PSSH": null, + "ID": 1, + "KID": "000000000521e14f0000000000000000", + "KEY": "024a460e8b8d94dc9d5ee9a514f5364c" + }, + { + "NAME": "13 Reasons Why S01E03 Tape 2, Side A", + "PSSH": null, + "ID": 1, + "KID": "0000000005224de50000000000000000", + "KEY": "921452c9081016f2f2a3bd931fdadcba" + }, + { + "NAME": "13 Reasons Why S01E04 Tape 2, Side B", + "PSSH": null, + "ID": 1, + "KID": "00000000052206250000000000000000", + "KEY": "fd9f3d71cd094713dfeaf4b3c47c224a" + }, + { + "NAME": "13 Reasons Why S01E05 Tape 3, Side A", + "PSSH": null, + "ID": 1, + "KID": "00000000052208f70000000000000000", + "KEY": "288248911817ef30641afdf537a1ca62" + }, + { + "NAME": "13 Reasons Why S01E06 Tape 3, Side B", + "PSSH": null, + "ID": 1, + "KID": "0000000005224fad0000000000000000", + "KEY": "f4dffc1da27274a7447161348e4697a9" + }, + { + "NAME": "13 Reasons Why S01E07 Tape 4, Side A", + "PSSH": null, + "ID": 1, + "KID": "000000000522b8d70000000000000000", + "KEY": "b6e6675d22f99def1eb7dd2ffb8cf5a1" + }, + { + "NAME": "13 Reasons Why S01E08 Tape 4, Side B", + "PSSH": null, + "ID": 1, + "KID": "000000000522c1f50000000000000000", + "KEY": "0d5c9e24cdba4ef08afb35e0a432b520" + }, + { + "NAME": "13 Reasons Why S01E09 Tape 5, Side A", + "PSSH": null, + "ID": 1, + "KID": "000000000522e4ab0000000000000000", + "KEY": "743e0dc80b9bdadd128a989a3883e38a" + }, + { + "NAME": "13 Reasons Why S01E10 Tape 5, Side B", + "PSSH": null, + "ID": 1, + "KID": "000000000523136f0000000000000000", + "KEY": "c132453bd06d357462961ba79fb77cb1" + }, + { + "NAME": "13 Reasons Why S01E11 Tape 6, Side A", + "PSSH": null, + "ID": 1, + "KID": "0000000005239e0b0000000000000000", + "KEY": "567865b45c19ea9b865f14309644c087" + }, + { + "NAME": "13 Reasons Why S01E12 Tape 6, Side B", + "PSSH": null, + "ID": 1, + "KID": "0000000005239f4d0000000000000000", + "KEY": "f258c550b9c9ae1dc8f367fdfcaea37c" + }, + { + "NAME": "13 Reasons Why S01E13 Tape 7, Side A", + "PSSH": null, + "ID": 1, + "KID": "0000000005697ec10000000000000000", + "KEY": "e0d8c2365f86c269975b0369846672d9" + }, + { + "NAME": "13 Reasons Why S02E01 the First Polaroid", + "PSSH": null, + "ID": 1, + "KID": "0000000005739b650000000000000000", + "KEY": "c8c0672fa7d4fadcb19d223a94319975" + }, + { + "NAME": "13 Reasons Why S02E02 Two Girls Kissing", + "PSSH": null, + "ID": 1, + "KID": "000000000573bc610000000000000000", + "KEY": "a4d9df3b7a1a366fff644e1fe40e0ab0" + }, + { + "NAME": "13 Reasons Why S02E03 the Drunk Slut", + "PSSH": null, + "ID": 1, + "KID": "000000000573bcf90000000000000000", + "KEY": "a53adcaf896b11b87e4bcd8a9942c8ca" + }, + { + "NAME": "13 Reasons Why S02E04 the Second Polaroid", + "PSSH": null, + "ID": 1, + "KID": "000000000573be210000000000000000", + "KEY": "ad9afb0cebedd27578b38f800874e92e" + }, + { + "NAME": "13 Reasons Why S02E05 the Chalk Machine", + "PSSH": null, + "ID": 1, + "KID": "000000000573c01d0000000000000000", + "KEY": "be35c431a1bc45cd846307388848cc59" + }, + { + "NAME": "13 Reasons Why S02E06 the Smile at the End of the Dock", + "PSSH": null, + "ID": 1, + "KID": "000000000573bd7d0000000000000000", + "KEY": "53875185d5bb9ef2d7f49ea92eb05ea1" + }, + { + "NAME": "13 Reasons Why S02E07 the Third Polaroid", + "PSSH": null, + "ID": 1, + "KID": "000000000573bf090000000000000000", + "KEY": "39576b37879e527ea0c3ef046f49aa97" + }, + { + "NAME": "13 Reasons Why S02E08 the Little Girl", + "PSSH": null, + "ID": 1, + "KID": "000000000573bc950000000000000000", + "KEY": "b8d7b27ad4e75e67f394d2b00f6f6515" + }, + { + "NAME": "13 Reasons Why S02E09 the Missing Page", + "PSSH": null, + "ID": 1, + "KID": "000000000573bf850000000000000000", + "KEY": "f6086de2a3843635c3b9909fb760fdce" + }, + { + "NAME": "13 Reasons Why S02E10 Smile, Bitches", + "PSSH": null, + "ID": 1, + "KID": "000000000573bfe50000000000000000", + "KEY": "3a9f4c2882215d4eb71ea63a2650f30a" + }, + { + "NAME": "13 Reasons Why S02E11 Bryce and Chloe", + "PSSH": null, + "ID": 1, + "KID": "000000000573c0850000000000000000", + "KEY": "76b2aa52c710edd4505b69dd875eb03e" + }, + { + "NAME": "13 Reasons Why S02E12 the Box of Polaroids", + "PSSH": null, + "ID": 1, + "KID": "000000000573bdb10000000000000000", + "KEY": "31e65aeabf75dd2036e446c7d210a962" + }, + { + "NAME": "13 Reasons Why S02E13 Bye", + "PSSH": null, + "ID": 1, + "KID": "000000000573bf3d0000000000000000", + "KEY": "d1883e0fad7feb482cc7b444125bf24a" + }, + { + "NAME": "13 Reasons Why S03E01 Yeah. I'm the New Girl", + "PSSH": null, + "ID": 1, + "KID": "000000000566adc50000000000000000", + "KEY": "281fe40c335afafdbb2df07b081ad469" + }, + { + "NAME": "13 Reasons Why S03E02 if You're Breathing, You're a Liar", + "PSSH": null, + "ID": 1, + "KID": "0000000005623a950000000000000000", + "KEY": "5a50f6e6049acb01db7b7bb1acc83149" + }, + { + "NAME": "13 Reasons Why S03E03 the Good Person Is Indistinguishable From the Bad", + "PSSH": null, + "ID": 1, + "KID": "0000000005623c2d0000000000000000", + "KEY": "350bab0431560472d818651211b3e7bc" + }, + { + "NAME": "13 Reasons Why S03E04 Angry, Young and Man", + "PSSH": null, + "ID": 1, + "KID": "000000000564ff590000000000000000", + "KEY": "6d08ccb4f07edfdff8e5111678324d02" + }, + { + "NAME": "13 Reasons Why S03E05 Nobody's Clean", + "PSSH": null, + "ID": 1, + "KID": "00000000056690450000000000000000", + "KEY": "962753036c22e5e191bd28215397daf6" + }, + { + "NAME": "13 Reasons Why S03E06 You Can Tell the Heart of a Man by How He Grieves", + "PSSH": null, + "ID": 1, + "KID": "000000000566b15d0000000000000000", + "KEY": "2b1312ba79f90c3c5ca3af46d5a6dd71" + }, + { + "NAME": "13 Reasons Why S03E07 There Are a Number of Problems With Clay Jensen", + "PSSH": null, + "ID": 1, + "KID": "00000000056564a50000000000000000", + "KEY": "aa659e8837e0a7f1c2b665c57d2a66a2" + }, + { + "NAME": "13 Reasons Why S03E08 in High School, Even on a Good Day, It's Hard to Tell Who's on Your Side", + "PSSH": null, + "ID": 1, + "KID": "000000000566ad350000000000000000", + "KEY": "0c55df1b3a26bab8ac1569e2175a46f9" + }, + { + "NAME": "13 Reasons Why S03E09 Always Waiting for the Next Bad News", + "PSSH": null, + "ID": 1, + "KID": "00000000056781810000000000000000", + "KEY": "ec2f607a542cb945ea156d9b31c04f59" + }, + { + "NAME": "13 Reasons Why S03E10 the World Closing In", + "PSSH": null, + "ID": 1, + "KID": "00000000056784710000000000000000", + "KEY": "52cbc209d0bf7484348e738b17055da9" + }, + { + "NAME": "13 Reasons Why S03E11 There Are a Few Things I Haven't Told You", + "PSSH": null, + "ID": 1, + "KID": "00000000056760950000000000000000", + "KEY": "07c7d63a3ff551e97cc2eaabd317a277" + }, + { + "NAME": "13 Reasons Why S03E12 and Then the Hurricane Hit", + "PSSH": null, + "ID": 1, + "KID": "000000000567c7590000000000000000", + "KEY": "527316da7083116b7dd59ed248690789" + }, + { + "NAME": "13 Reasons Why S03E13 Let the Dead Bury the Dead", + "PSSH": null, + "ID": 1, + "KID": "000000000568db310000000000000000", + "KEY": "1766b0b09f52322db900c42f00fabe51" + }, + { + "NAME": "Brij Mohan Amar Rahe 2018", + "PSSH": null, + "ID": 1, + "KID": "0000000004d448190000000000000000", + "KEY": "ef7aa9b166d2fa73a61144e599a7b9d9" + }, + { + "NAME": "The White Tiger 2021", + "PSSH": null, + "ID": 1, + "KID": "0000000005fd8e4c0000000000000000", + "KEY": "46b25731b3a9ffdf1dd96a7eb00ac759" + }, + { + "NAME": "Extraction 2020", + "PSSH": null, + "ID": 1, + "KID": "0000000005a2f9190000000000000000", + "KEY": "d5b876682f715f230c26c9c1c665062e" + }, + { + "NAME": "Triple Frontier 2019", + "PSSH": null, + "ID": 1, + "KID": "00000000052a40770000000000000000", + "KEY": "59202fa9b0e3a62142c1cfe94551ed6c" + }, + { + "NAME": "Sardar Ka Grandson 2021", + "PSSH": null, + "ID": 1, + "KID": "00000000068672b20000000000000000", + "KEY": "c5f38ae7b29398eca2ad3130b197133e" + }, + { + "NAME": "Half Girlfriend 2017", + "PSSH": null, + "ID": 1, + "KID": "0000000004c6734d0000000000000000", + "KEY": "161b820fc8df4bf6de7a84634b8958ac" + }, + { + "NAME": "Special S01E01 Chapter One - Cerebral LOLzy", + "PSSH": null, + "ID": 1, + "KID": "00000000052ba7050000000000000000", + "KEY": "9aaad152f18543d714fd5e4e430a8d07" + }, + { + "NAME": "Special S01E02 Chapter Two - The Deep End", + "PSSH": null, + "ID": 1, + "KID": "00000000052c0e6f0000000000000000", + "KEY": "aab17e65d4955e53f9ee392bf6104f1e" + }, + { + "NAME": "Special S01E03 Chapter Three - Free Scones", + "PSSH": null, + "ID": 1, + "KID": "00000000052bbf630000000000000000", + "KEY": "5df4c2eafba846dbe7624c3612ed2ff4" + }, + { + "NAME": "Special S01E04 Chapter Four - Housechilling Party", + "PSSH": null, + "ID": 1, + "KID": "00000000052bbb990000000000000000", + "KEY": "3a0aef3bd3ab030d7e575e072fd36be1" + }, + { + "NAME": "Special S01E05 Chapter Five - Vagina Momologues", + "PSSH": null, + "ID": 1, + "KID": "00000000052bbea70000000000000000", + "KEY": "dd4abd602c317070db08ee6b30534fea" + }, + { + "NAME": "Special S01E06 Chapter Six - Straight Potential", + "PSSH": null, + "ID": 1, + "KID": "00000000052c09c30000000000000000", + "KEY": "358b05e736e14c6d80ac6e8e6d92bdfa" + }, + { + "NAME": "Special S01E07 Chapter Seven - Blind Deaf Date", + "PSSH": null, + "ID": 1, + "KID": "00000000052c51f70000000000000000", + "KEY": "fe535cd1f6eb98d9f2da3298236eb9c0" + }, + { + "NAME": "Special S01E08 Chapter Eight - Gay Gardens", + "PSSH": null, + "ID": 1, + "KID": "00000000052c370b0000000000000000", + "KEY": "0faf1817ad38ca4052090ca7ff9e7edc" + }, + { + "NAME": "Special S02E01 One Day Stand", + "PSSH": null, + "ID": 1, + "KID": "0000000006582dc40000000000000000", + "KEY": "997f38f9d395b727c3e4ac37b83c71b0" + }, + { + "NAME": "Special S02E02 I Don't Like It Like This", + "PSSH": null, + "ID": 1, + "KID": "00000000065894e20000000000000000", + "KEY": "d89c7d808015731e79e8f3022485d4f6" + }, + { + "NAME": "Special S02E03 That's the Way the Boys Are", + "PSSH": null, + "ID": 1, + "KID": "000000000658d05d0000000000000000", + "KEY": "2a91248bb9ed3c01f7ea8ce5be8aaeae" + }, + { + "NAME": "Special S02E04 Death by a Thousand Cold Cuts", + "PSSH": null, + "ID": 1, + "KID": "00000000065a2b7c0000000000000000", + "KEY": "e3506cd430081b86f8af62261fd6dd1d" + }, + { + "NAME": "Special S02E05 Ryan Joins the Crips", + "PSSH": null, + "ID": 1, + "KID": "0000000006668dfc0000000000000000", + "KEY": "08d8de3de717312cf3145b2f2f19ffb5" + }, + { + "NAME": "Special S02E06 Prom Queens", + "PSSH": null, + "ID": 1, + "KID": "00000000066952740000000000000000", + "KEY": "b4683ee4583dc0217341eb1a72e7acb9" + }, + { + "NAME": "Special S02E07 Why Is No One Ready", + "PSSH": null, + "ID": 1, + "KID": "0000000006669f840000000000000000", + "KEY": "7c301edf76d01e9667c023c5d17e6b56" + }, + { + "NAME": "Special S02E08 Here's Where the Story Ends", + "PSSH": null, + "ID": 1, + "KID": "0000000006665ed50000000000000000", + "KEY": "6c0964088fae4f93b7457e2484e361d2" + }, + { + "NAME": "Cricket Fever - Mumbai Indians S01E01 Mumbai! Mumbai!", + "PSSH": null, + "ID": 1, + "KID": "0000000004e066c10000000000000000", + "KEY": "d32bd083f226c2be61ce3db803d9441c" + }, + { + "NAME": "Cricket Fever - Mumbai Indians S01E02 Superstars vs. Superstars", + "PSSH": null, + "ID": 1, + "KID": "000000000522163b0000000000000000", + "KEY": "64d9911432896b08b3443e0b9867f653" + }, + { + "NAME": "Cricket Fever - Mumbai Indians S01E03 Fearless Cricket", + "PSSH": null, + "ID": 1, + "KID": "00000000052258290000000000000000", + "KEY": "b063ab9299dcf1df839bd2ceac8b1f47" + }, + { + "NAME": "Cricket Fever - Mumbai Indians S01E04 Bad to Worse", + "PSSH": null, + "ID": 1, + "KID": "0000000005231d390000000000000000", + "KEY": "62ba451dc3da8bd488371ce50e92836e" + }, + { + "NAME": "Cricket Fever - Mumbai Indians S01E05 Grudge Match", + "PSSH": null, + "ID": 1, + "KID": "000000000522bd290000000000000000", + "KEY": "32430cc307888c882b0c2d2ee6ebb2f0" + }, + { + "NAME": "Cricket Fever - Mumbai Indians S01E06 Put Up a Fight", + "PSSH": null, + "ID": 1, + "KID": "000000000523567d0000000000000000", + "KEY": "d3a4ac1446020e760df151324c5f8ba9" + }, + { + "NAME": "Cricket Fever - Mumbai Indians S01E07 Make or Break", + "PSSH": null, + "ID": 1, + "KID": "00000000052383590000000000000000", + "KEY": "da810d50b37969706455ea909b76985b" + }, + { + "NAME": "Cricket Fever - Mumbai Indians S01E08 We Live to See Another Day", + "PSSH": null, + "ID": 1, + "KID": "000000000524050b0000000000000000", + "KEY": "7fa049c9466f663730dc5cbebfb706ab" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E01 View From the Top", + "PSSH": null, + "ID": 1, + "KID": "000000000641ffc80000000000000000", + "KEY": "fa69cadab2a385263c837d35f81c4819" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E02 Safe Harbor", + "PSSH": null, + "ID": 1, + "KID": "0000000006395eae0000000000000000", + "KEY": "7769868385ef5037dccd40776a6075eb" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E03 Casa De Kenji", + "PSSH": null, + "ID": 1, + "KID": "000000000642cc570000000000000000", + "KEY": "f1dac4009d2b855cd53bf665e0b087db" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E04 Clever Girl", + "PSSH": null, + "ID": 1, + "KID": "000000000652b5350000000000000000", + "KEY": "0c68bc646cb92dadaa9a8ba812750d24" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E05 Eye of the Storm", + "PSSH": null, + "ID": 1, + "KID": "000000000652cece0000000000000000", + "KEY": "5ad0cc003d43758a22475e37178db7e8" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E06 the Long Run", + "PSSH": null, + "ID": 1, + "KID": "0000000006578af20000000000000000", + "KEY": "21582cffb7ddb18a2c800a3f151de663" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E07 a Shock to the System", + "PSSH": null, + "ID": 1, + "KID": "000000000660d1e60000000000000000", + "KEY": "e0a7daf9ddb67007e9669e80a917a749" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E08 Escape From Isla Nublar", + "PSSH": null, + "ID": 1, + "KID": "000000000665ed9e0000000000000000", + "KEY": "3ed244a48f044258939d3b67daf2b83a" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E09 Whatever It Takes", + "PSSH": null, + "ID": 1, + "KID": "00000000066bda430000000000000000", + "KEY": "12c202acf27651fa24458dd061b22261" + }, + { + "NAME": "Jurassic World Camp Cretaceous S03E10 Stay on Mission", + "PSSH": null, + "ID": 1, + "KID": "00000000066d78c30000000000000000", + "KEY": "92485b3b687528b3cc6b8976bf22335a" + } +] \ No newline at end of file diff --git a/configs/Tokens/netflix_token.json b/configs/Tokens/netflix_token.json new file mode 100644 index 0000000..f6800e4 --- /dev/null +++ b/configs/Tokens/netflix_token.json @@ -0,0 +1,11 @@ +{ + "mastertoken": { + "tokendata": "eyJzZXNzaW9uZGF0YSI6IkJRQ0FBQUVCRUF6SENReUt4ZklvZ3dQZ2FvMndhNGVCd0xTckZoK29QTGJHL20vWU9oQjQyZHloUUYxTmxkZm5NamNSTy96NUVKdnZJOGp4MllFYytWZk0rSlJ0RURMZFA1VTcyUWx5bS9RbnJXTmFuYlEyM3Fpa2YvbHRGYWFqbXlJU3NzdnpRU2VvL3hPL1p0TFZieGR6cWhYMG9DdmtLWlk1RFRXN3Y2aVh3dERZZlJhR0JRYXVLZjBpdERsY0ZWVVN1alExR2xSVklGZk42YVE3WEFKd3JFTFIvTlVqQmJmYnl6K2FrN1ZZVEhBZnFScHQ4WjBXZk0xa0VySjVJYjgvcE9iUU9FZHdPTlY3YW9lSjRMT2hNTnMycE9sZ3MwNkd6eUZ1Nk13RytPSHFqMURaVzdNL3hUOWdkM01ncGdKejFkY0c4ODlTU0hUdVVSc2JST0hmVy80akU2SlhySTUrSjZLT0UyeGRBdVVoNjY3TnlNMmtoOURBM25lOFBLaHRrTjlmdG1HdEszZ2l1S01xTERmdlQ3RDVGUGVaU1RKY25wenFjMk9YWW12RHBoY0JmWFVXZEhTUWRUbUtjU01zL1o4TUt5UVB3emhLMzFVVldWWllUbEIyODMzWG1WNDArSXZrK1gzdUN1MGlMUjJaVkRXYzh2T1V4dEFSWi9vM3ZEOC9heUtQMTh3UmI1WndzNkl2R0dRSkhPU2MwTHB6RS8zUmdxUXU2Z2FYVU5tWjdlMTEzWEVMdFZZQktzRmFZMktJQVViNFVvT1F1VnVkVnNMNTExUk5OQzJZYnA4Q1hvWlZlY2tNaU9ydDZNS3hNUFE9IiwicmVuZXdhbHdpbmRvdyI6MTYyNDA4NjI2Miwic2VyaWFsbnVtYmVyIjo1MDkzNTMyMzUxNTM2MjQsImV4cGlyYXRpb24iOjE2MjUyMDk0NjIsInNlcXVlbmNlbnVtYmVyIjoxfQ==", + "signature": "AQEAgQABASD1vbC9zQfnxwNr/7nLFkWyxRW7Z52QGWLEGk97hYBSYtNcJnM=" + }, + "sequence_number": 1, + "encryption_key": "YAeCFbGwVf/aukgoxE3tSg==", + "sign_key": "75QOynO/ysXBPimd9vCBSCI5/JQ7VCxAe4Ev/6hLJc4=", + "RSA_KEY": "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAvMQdqQ7cG30cZdxYRamhySuvTWvUtsZp6EVmV4U1msqzceb5\nevK1D8rac87mdUUL9e5syaKTarVJe9bzl5lPnugSDPUEWuXS3vAynJA9pzUHEJdN\nZVkv43IdyXI+eBV+aJ4f+DB06MYvUxyDgPyfvCIKJPZ1Pj0ZHN2rhpK2bx2xnZh4\nBAoSIqlSYeChWB9O55sDYkCooAXd9zNJ7EBerqNlQr5sImY0izD1sPdfJiEfZLKj\n/+xr0PPrdTKeQmcR/r30K+4lVD1tYVPSy4MZsDVu3KgHtMBDPvx+DyaXdtdAdxpC\nkR6uqw+Q0H7KoedzdmlOMyvTVHLhgbVtxDEkuwIDAQABAoH/P6ydjoIypF12y3oE\nPDElo+f3dA14Dj/4geVauSLTCvifj1CUQpqUFeCyU9okZyhW+UvOsNqiOlyJjiwU\n9wYStIekZdNI1lhddsXRhorfSW8VoGpQf6WeWH3LK1o9I5+H0uu1eeoYXEvIP5Nm\n+iPqlKykv1+MwZsk1TTHyFLu1Afd7hG80c2UHHvvGioD0YregsrKXcLXi5OEkAS+\n5SiwKpbelwLcqK58SVN+ajnRvz6na6Fm4wjWq4wynrtX0RPD2P8+aw0X805o9fsP\nU3zRx4Dy3huazIBnadTqAEGbF73OWSA+Tow+LMRvUSqdWZMiX2ikLRwkTKFaaq+N\nObPhAoGBANqo5TbysRdRTerXxXqNlewEiYNH3Vn5pz4t1W/iRIT8BDKAD2FHcZ25\n4bfGcRmQ8wO3gcPPgVyXGf100RU0IR6lVjrcJT3w29lPs7AOhElDWMBC0fcA5JSd\nkWFMDUSobaXxZ8HYQJG6eQTEuQebm2PffppZUnVKTY2rhDaOCpmLAoGBAN0AXWiC\ngA8/6P48EYc8sQq/7KZ1g2Urxqxhc/wNU6FdKs582HMEeRYBA2PJsamYh0n/Wp5k\nfFJfb7HU4yCISzT7iHHjhLuuUR0UMmMkwY/x4YE5Ri1hlrS3SdGdfV6ufqe9jiGg\nboJ1rI0ieJmdyVWmhTK9CXuF/gB/6ik55CeRAoGBAMOr9orIfW9HY7mvY1n7T9lI\naiJf8hZtUZtT+rdHvVdgCwWCEcFU5LhnujTx0Q425zFBS0+F5taLpUdp/RzDbIv3\nGwZLMMyQOLzsFPmM1BaXvNk4MpqeYu8XXhy6qPjy3ERulhIiyg1e2KNKw+Wp+1FR\nlALdweuSFXqcrREA5T1nAoGBAIYoeou+7M5VFbN/84QNK8xCxf4myCTadjie0DHq\nRSJn1FyVHTB1PqxE4THqdpdlqHsbMH+GsJGwrbVebqKJGl6Hc0TvwNvN7h+g6xWU\ncoxXYXV4t0lFPJ9nxMAiwsB/XROm1mlDYtJ/bMggbOWUC2ybMbCjYOZDaPYUsKlm\nI0KBAoGAC0EsDBZZ6/ymQgenaNbTErN04i6Zii0U9XZ4Do72cRQTYsRELKqXyNwF\nwy//GzwqOXPFTaaY/RL0ISaV3xWU2MkI2Scmr+oGyEEKeE1uul9ZCo9l/2Jin2X9\n6gsH4QryiP+we7L1p2e1sdYmY3QWufuWjYI4e6iJ/vJX+WHM95g=\n-----END RSA PRIVATE KEY-----", + "expiration": 1625209462 +} \ No newline at end of file diff --git a/configs/__init__.py b/configs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/configs/__pycache__/__init__.cpython-36.pyc b/configs/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..7599149 Binary files /dev/null and b/configs/__pycache__/__init__.cpython-36.pyc differ diff --git a/configs/__pycache__/__init__.cpython-39.pyc b/configs/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..6f27701 Binary files /dev/null and b/configs/__pycache__/__init__.cpython-39.pyc differ diff --git a/configs/__pycache__/config.cpython-36.pyc b/configs/__pycache__/config.cpython-36.pyc new file mode 100644 index 0000000..766efc7 Binary files /dev/null and b/configs/__pycache__/config.cpython-36.pyc differ diff --git a/configs/__pycache__/config.cpython-39.pyc b/configs/__pycache__/config.cpython-39.pyc new file mode 100644 index 0000000..cb4822e Binary files /dev/null and b/configs/__pycache__/config.cpython-39.pyc differ diff --git a/configs/config.py b/configs/config.py new file mode 100644 index 0000000..ede50f3 --- /dev/null +++ b/configs/config.py @@ -0,0 +1,163 @@ +import sys, os, random, string, platform +from os.path import dirname +from os.path import join +from pywidevine.cdm import cdm, deviceconfig + +dirPath = dirname(dirname(__file__)).replace("\\", "/") + +class utils: + def __init__(self): + self.dir = dirPath + + def random_hex(self, length: int) -> str: + """return {length} of random string""" + return "".join(random.choice("0123456789ABCDEF") for _ in range(length)) + +utils_ = utils() + +#####################################(DEVICES)##################################### + +devices_dict = { + "android_general": deviceconfig.device_android_general, +} + +DEVICES = { + "NETFLIX-MANIFEST": devices_dict["android_general"], + "NETFLIX-LICENSE": devices_dict["android_general"], +} + +#####################################(MUXER)##################################### + +MUXER = { + "muxer_file": f"{dirPath}/bin/muxer.json", + "mkv_folder": None, + "DEFAULT": False, # to use the normal renaming. EX: Stranger Things S01E01 [1080p].mkv + "AUDIO": "hin", # default audio language. + "SUB": "None", # default subtitle language. EX: "eng" or "spa" + "GROUP": "Tandav", # to change the group name!. it's also possible to use this "--gr LOL", on the ripping commands. + "noTitle": False, # this will remove titles from the episodes EX: (The Witcher S01E01). insstead of (The Witcher S01E01 The End's Beginning). + "scheme": "p2p", # add/change any needed scheme naming. it's also possible to use this "--muxscheme repack", on the ripping commands. + "schemeslist": { + "p2p": "{t}.{r}.{s}.WEB-DL.{ac}.{vc}-{gr}", + "test": "{t}.{r}.{s}.WEB-DL-{gr}", + }, + "EXTRAS": [], # extra mkvmerge.exe commands. + "FPS24": [], +} + +#####################################(PATHS)##################################### + +PATHS = { + "DL_FOLDER": "E:/#rips", # + "DIR_PATH": f"{dirPath}", + "BINARY_PATH": f"{dirPath}/bin", + "COOKIES_PATH": f"{dirPath}/configs/Cookies", + "KEYS_PATH": f"{dirPath}/configs/KEYS", + "TOKENS_PATH": f"{dirPath}/configs/Tokens", + "JSON_PATH": f"{dirPath}/json", + "LOGA_PATH": f"{dirPath}/bin/tools/aria2c", +} + +ARIA2C = { + "enable_logging": False, # True +} + +SETTINGS = { + "skip_video_demux": [], +} + +#####################################(VPN)##################################### + +VPN = { + "proxies": None, # "http://151.253.165.70:8080", + "nordvpn": { + "port": "80", + "email": "xxx", + "passwd": "xxx", + "http": "http://{email}:{passwd}@{ip}:{port}", + }, + "private": { + "port": "8080", + "email": "abdalhmohmd8@gmail.com", + "passwd": "123456", + "http": "http://{email}:{passwd}@{ip}:{port}", + }, +} + +#####################################(BIN)##################################### + +BIN = { + "mp4decrypt_moded": f"{dirPath}/bin/tools/mp4decrypt.exe", + "mp4dump": f"{dirPath}/bin/tools/mp4dump.exe", + "ffmpeg": f"{dirPath}/bin/tools/ffmpeg.exe", + "ffprobe": f"{dirPath}/bin/tools/ffprobe.exe", + "MediaInfo": f"{dirPath}/bin/tools/MediaInfo.exe", + "mkvmerge": f"{dirPath}/bin/tools/mkvmerge.exe", + "aria2c": f"{dirPath}/bin/tools/aria2c.exe", + } + +#####################################(Config)##################################### + +Config = {} + +Config["NETFLIX"] = { + "cookies_file": f"{dirPath}/configs/Cookies/cookies_nf.txt", + "cookies_txt": f"{dirPath}/configs/Cookies/cookies.txt", + "keys_file": f"{dirPath}/configs/KEYS/netflix.keys", + "token_file": f"{dirPath}/configs/Tokens/netflix_token.json", + "email": "Cfklop@max07.club", + "password": "1111", + "manifest_language": "en-US", + "metada_language": "en", + "manifestEsn": "NFCDIE-03-{}".format(utils().random_hex(30)), + "androidEsn": "NFANDROID1-PRV-P-GOOGLEPIXEL=4=XL-8162-" + utils_.random_hex(64), +} + +#####################################(DIRS & FILES)############################## + +def make_dirs(): + FILES = [] + + DIRS = [ + f"{dirPath}/configs/Cookies", + f"{dirPath}/configs/Tokens", + f"{dirPath}/bin/tools/aria2c", + ] + + for dirs in DIRS: + if not os.path.exists(dirs): + os.makedirs(dirs) + + for files in FILES: + if not os.path.isfile(files): + with open(files, "w") as f: + f.write("\n") + +make_dirs() + +#####################################(tool)##################################### + +class tool: + def config(self, service): + return Config[service] + + def bin(self): + return BIN + + def vpn(self): + return VPN + + def paths(self): + return PATHS + + def muxer(self): + return MUXER + + def devices(self): + return DEVICES + + def aria2c(self): + return ARIA2C + + def video_settings(self): + return SETTINGS diff --git a/helpers/Muxer.py b/helpers/Muxer.py new file mode 100644 index 0000000..9c288c5 --- /dev/null +++ b/helpers/Muxer.py @@ -0,0 +1,629 @@ + +import re, os, sys, subprocess, contextlib, json, glob +from configs.config import tool +from helpers.ripprocess import ripprocess +from pymediainfo import MediaInfo +import logging + + +class Muxer(object): + def __init__(self, **kwargs): + self.logger = logging.getLogger(__name__) + self.CurrentName_Original = kwargs.get("CurrentName", None) + self.CurrentName = kwargs.get("CurrentName", None) + self.SeasonFolder = kwargs.get("SeasonFolder", None) + self.CurrentHeigh = kwargs.get("CurrentHeigh", None) + self.CurrentWidth = kwargs.get("CurrentWidth", None) + self.source_tag = kwargs.get("Source", None) + self.AudioProfile = self.get_audio_id() # kwargs.get("AudioProfile", None) + self.VideoProfile = self.get_video_id() # kwargs.get("VideoProfile", None) + self.mkvmerge = tool().bin()["mkvmerge"] + self.merge = [] + self.muxer_settings = tool().muxer() + + ############################################################################## + self.packer = kwargs.get("group", None) + self.extra_output_folder = self.packer["EXTRA_FOLDER"] + self.Group = ( + self.packer["GROUP"] + if self.packer["GROUP"] + else self.muxer_settings["GROUP"] + ) + self.muxer_scheme = ( + self.packer["SCHEME"] + if self.packer["SCHEME"] + else self.muxer_settings["scheme"] + ) + + self.scheme = self.muxer_settings["schemeslist"][self.muxer_scheme] + self.Extras = self.muxer_settings["EXTRAS"] + self.fps24 = True if self.source_tag in self.muxer_settings["FPS24"] else False + self.default_mux = True if self.muxer_settings["DEFAULT"] else False + self.PrepareMuxer() + + def is_extra_folder(self): + extra_folder = None + if self.extra_output_folder: + if not os.path.isabs(self.extra_output_folder): + raise ValueError("Error you should provide full path dir: {}.".format(self.extra_output_folder)) + if not os.path.exists(self.extra_output_folder): + try: + os.makedirs(self.extra_output_folder) + except Exception as e: + raise ValueError("Error when create folder dir [{}]: {}.".format(e, self.extra_output_folder)) + extra_folder = self.extra_output_folder + return extra_folder + + if self.muxer_settings["mkv_folder"]: + if not os.path.isabs(self.muxer_settings["mkv_folder"]): + raise ValueError("Error you should provide full path dir: {}.".format(self.muxer_settings["mkv_folder"])) + if not os.path.exists(self.muxer_settings["mkv_folder"]): + try: + os.makedirs(self.muxer_settings["mkv_folder"]) + except Exception as e: + raise ValueError("Error when create folder dir [{}]: {}.".format(e, self.muxer_settings["mkv_folder"])) + extra_folder = self.muxer_settings["mkv_folder"] + return extra_folder + + return extra_folder + + def PrepareMuxer(self): + if self.muxer_settings["noTitle"]: + self.CurrentName = self.noTitle() + + extra_folder = self.is_extra_folder() + + if extra_folder: + self.SeasonFolder = extra_folder + else: + if not self.default_mux: + if self.SeasonFolder: + self.SeasonFolder = self.setFolder() + + return + + def SortFilesBySize(self): + file_list = [] + audio_tracks = ( + glob.glob(f"{self.CurrentName_Original}*.eac3") + + glob.glob(f"{self.CurrentName_Original}*.ac3") + + glob.glob(f"{self.CurrentName_Original}*.aac") + + glob.glob(f"{self.CurrentName_Original}*.m4a") + + glob.glob(f"{self.CurrentName_Original}*.dts") + ) + + if audio_tracks == []: + raise FileNotFoundError("no audio files found") + + for file in audio_tracks: + file_list.append({"file": file, "size": os.path.getsize(file)}) + + file_list = sorted(file_list, key=lambda k: int(k["size"])) + return file_list[-1]["file"] + + def GetVideoFile(self): + videofiles = [ + "{} [{}p]_Demuxed.mp4", + "{} [{}p]_Demuxed.mp4", + "{} [{}p] [UHD]_Demuxed.mp4", + "{} [{}p] [UHD]_Demuxed.mp4", + "{} [{}p] [VP9]_Demuxed.mp4", + "{} [{}p] [HIGH]_Demuxed.mp4", + "{} [{}p] [VP9]_Demuxed.mp4", + "{} [{}p] [HEVC]_Demuxed.mp4", + "{} [{}p] [HDR]_Demuxed.mp4", + "{} [{}p] [HDR-DV]_Demuxed.mp4", + ] + + for videofile in videofiles: + filename = videofile.format(self.CurrentName_Original, self.CurrentHeigh) + if os.path.isfile(filename): + return filename + + return None + + def get_video_id(self): + video_file = self.GetVideoFile() + if not video_file: + raise ValueError("No Video file in Dir...") + + media_info = MediaInfo.parse(video_file) + track = [track for track in media_info.tracks if track.track_type == "Video"][0] + + if track.format == "AVC": + if track.encoding_settings: + return "x264" + return "H.264" + elif track.format == "HEVC": + if track.commercial_name == "HDR10" and track.color_primaries: + return "HDR.HEVC" + if track.commercial_name == "HEVC" and track.color_primaries: + return "HEVC" + + return "DV.HEVC" + + return None + + def get_audio_id(self): + audio_id = None + media_info = MediaInfo.parse(self.SortFilesBySize()) + track = [track for track in media_info.tracks if track.track_type == "Audio"][0] + + if track.format == "E-AC-3": + audioCodec = "DDP" + elif track.format == "AC-3": + audioCodec = "DD" + elif track.format == "AAC": + audioCodec = "AAC" + elif track.format == "DTS": + audioCodec = "DTS" + elif "DTS" in track.format: + audioCodec = "DTS" + else: + audioCodec = "DDP" + + if track.channel_s == 8: + channels = "7.1" + elif track.channel_s == 6: + channels = "5.1" + elif track.channel_s == 2: + channels = "2.0" + elif track.channel_s == 1: + channels = "1.0" + else: + channels = "5.1" + + audio_id = ( + f"{audioCodec}{channels}.Atmos" + if "Atmos" in track.commercial_name + else f"{audioCodec}{channels}" + ) + + return audio_id + + def Heigh(self): + try: + Width = int(self.CurrentWidth) + Heigh = int(self.CurrentHeigh) + except Exception: + return self.CurrentHeigh + + res1080p = "1080p" + res720p = "720p" + sd = "" + + if Width >= 3840: + return "2160p" + + if Width >= 2560: + return "1440p" + + if Width > 1920: + if Heigh > 1440: + return "2160p" + return "1440p" + + if Width == 1920: + return res1080p + elif Width == 1280: + return res720p + + if Width >= 1400: + return res1080p + + if Width < 1400 and Width >= 1100: + return res720p + + if Heigh == 1080: + return res1080p + elif Heigh == 720: + return res720p + + if Heigh >= 900: + return res1080p + + if Heigh < 900 and Heigh >= 700: + return res720p + + return sd + + def noTitle(self): + regex = re.compile("(.*) [S]([0-9]+)[E]([0-9]+)") + if regex.search(self.CurrentName): + return regex.search(self.CurrentName).group(0) + + return self.CurrentName + + def Run(self, command): + self.logger.debug("muxing command: {}".format(command)) + + def unbuffered(proc, stream="stdout"): + newlines = ["\n", "\r\n", "\r"] + stream = getattr(proc, stream) + with contextlib.closing(stream): + while True: + out = [] + last = stream.read(1) + # Don't loop forever + if last == "" and proc.poll() is not None: + break + while last not in newlines: + # Don't loop forever + if last == "" and proc.poll() is not None: + break + out.append(last) + last = stream.read(1) + out = "".join(out) + yield out + + proc = subprocess.Popen( + command, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + bufsize=1, + universal_newlines=True, + ) + self.logger.info("\nStart Muxing...") + for line in unbuffered(proc): + if "Progress:" in line: + sys.stdout.write("\r%s" % (line)) + sys.stdout.flush() + elif "Multiplexing" in line: + sys.stdout.write("\r%s" % (line.replace("Multiplexing", "Muxing"))) + sys.stdout.flush() + elif "Error" in line: + sys.stdout.write("\r%s" % (line)) + sys.stdout.flush() + + self.logger.info("") + + def setName(self): + + outputVideo = ( + self.scheme.replace( + "{t}", ripprocess().CleanMyFileNamePlease(self.CurrentName) + ) + .replace("{r}", self.Heigh()) + .replace("{s}", self.source_tag) + .replace("{ac}", self.AudioProfile) + .replace("{vc}", self.VideoProfile) + .replace("{gr}", self.Group) + ) + + for i in range(10): + outputVideo = re.sub(r"(\.\.)", ".", outputVideo) + + if self.SeasonFolder: + outputVideo = os.path.join(os.path.abspath(self.SeasonFolder), outputVideo) + outputVideo = outputVideo.replace("\\", "/") + + return f"{outputVideo}.mkv" + + def setFolder(self): + folder = ( + self.scheme.replace( + "{t}", ripprocess().CleanMyFileNamePlease(self.SeasonFolder) + ) + .replace("{r}", self.Heigh()) + .replace("{s}", self.source_tag) + .replace("{ac}", self.AudioProfile) + .replace("{vc}", self.VideoProfile) + .replace("{gr}", self.Group) + ) + + for i in range(10): + folder = re.sub(r"(\.\.)", ".", folder) + + return folder + + def LanguageList(self): + LanguageList = [ + ["Hindi", "hin", "hin", "Hindi"], + ["Tamil", "tam", "tam", "Tamil"], + ["Telugu", "tel", "tel", "Telugu"], + ["English", "eng", "eng", "English"], + ["Afrikaans", "af", "afr", "Afrikaans"], + ["Arabic", "ara", "ara", "Arabic"], + ["Arabic (Syria)", "araSy", "ara", "Arabic Syria"], + ["Arabic (Egypt)", "araEG", "ara", "Arabic Egypt"], + ["Arabic (Kuwait)", "araKW", "ara", "Arabic Kuwait"], + ["Arabic (Lebanon)", "araLB", "ara", "Arabic Lebanon"], + ["Arabic (Algeria)", "araDZ", "ara", "Arabic Algeria"], + ["Arabic (Bahrain)", "araBH", "ara", "Arabic Bahrain"], + ["Arabic (Iraq)", "araIQ", "ara", "Arabic Iraq"], + ["Arabic (Jordan)", "araJO", "ara", "Arabic Jordan"], + ["Arabic (Libya)", "araLY", "ara", "Arabic Libya"], + ["Arabic (Morocco)", "araMA", "ara", "Arabic Morocco"], + ["Arabic (Oman)", "araOM", "ara", "Arabic Oman"], + ["Arabic (Saudi Arabia)", "araSA", "ara", "Arabic Saudi Arabia"], + ["Arabic (Tunisia)", "araTN", "ara", "Arabic Tunisia"], + [ + "Arabic (United Arab Emirates)", + "araAE", + "ara", + "Arabic United Arab Emirates", + ], + ["Arabic (Yemen)", "araYE", "ara", "Arabic Yemen"], + ["Armenian", "hye", "arm", "Armenian"], + ["Assamese", "asm", "asm", "Assamese"], + ["Bengali", "ben", "ben", "Bengali"], + ["Basque", "eus", "baq", "Basque"], + ["British English", "enGB", "eng", "British English"], + ["Bulgarian", "bul", "bul", "Bulgarian"], + ["Cantonese", "None", "chi", "Cantonese"], + ["Catalan", "cat", "cat", "Catalan"], + ["Simplified Chinese", "zhoS", "chi", "Chinese Simplified"], + ["Traditional Chinese", "zhoT", "chi", "Chinese Traditional"], + ["Croatian", "hrv", "hrv", "Croatian"], + ["Czech", "ces", "cze", "Czech"], + ["Danish", "dan", "dan", "Danish"], + ["Dutch", "nld", "dut", "Dutch"], + ["Estonian", "est", "est", "Estonian"], + ["Filipino", "fil", "fil", "Filipino"], + ["Finnish", "fin", "fin", "Finnish"], + ["Flemish", "nlBE", "dut", "Flemish"], + ["French", "fra", "fre", "French"], + ["French Canadian", "caFra", "fre", "French Canadian"], + ["Canadian French", "caFra", "fre", "Canadian French"], + ["German", "deu", "ger", "German"], + ["Greek", "ell", "gre", "Greek"], + ["Gujarati", "guj", "guj", "Gujarati"], + ["Hebrew", "heb", "heb", "Hebrew"], + ["Hungarian", "hun", "hun", "Hungarian"], + ["Icelandic", "isl", "ice", "Icelandic"], + ["Indonesian", "ind", "ind", "Indonesian"], + ["Italian", "ita", "ita", "Italian"], + ["Japanese", "jpn", "jpn", "Japanese"], + ["Kannada (India)", "kan", "kan", "Kannada (India)"], + ["Khmer", "khm", "khm", "Khmer"], + ["Klingon", "tlh", "tlh", "Klingon"], + ["Korean", "kor", "kor", "Korean"], + ["Lithuanian", "lit", "lit", "Lithuanian"], + ["Latvian", "lav", "lav", "Latvian"], + ["Malay", "msa", "may", "Malay"], + ["Malayalam", "mal", "mal", "Malayalam"], + ["Mandarin", "None", "chi", "Mandarin"], + ["Mandarin Chinese (Simplified)", "zh-Hans", "chi", "Simplified"], + ["Mandarin Chinese (Traditional)", "zh-Hant", "chi", "Traditional"], + ["Yue Chinese", "yue", "chi", "(Yue Chinese)"], + ["Manipuri", "mni", "mni", "Manipuri"], + ["Marathi", "mar", "mar", "Marathi"], + ["No Dialogue", "zxx", "zxx", "No Dialogue"], + ["Norwegian", "nor", "nor", "Norwegian"], + ["Norwegian Bokmal", "nob", "nob", "Norwegian Bokmal"], + ["Persian", "fas", "per", "Persian"], + ["Polish", "pol", "pol", "Polish"], + ["Portuguese", "por", "por", "Portuguese"], + ["Brazilian Portuguese", "brPor", "por", "Brazilian Portuguese"], + ["Punjabi", "pan", "pan", "Punjabi"], + ["Panjabi", "pan", "pan", "Panjabi"], + ["Romanian", "ron", "rum", "Romanian"], + ["Russian", "rus", "rus", "Russian"], + ["Serbian", "srp", "srp", "Serbian"], + ["Sinhala", "sin", "sin", "Sinhala"], + ["Slovak", "slk", "slo", "Slovak"], + ["Slovenian", "slv", "slv", "Slovenian"], + ["Spanish", "spa", "spa", "Spanish"], + ["European Spanish", "euSpa", "spa", "European Spanish"], + ["Swedish", "swe", "swe", "Swedish"], + ["Thai", "tha", "tha", "Thai"], + ["Tagalog", "tgl", "tgl", "Tagalog"], + ["Turkish", "tur", "tur", "Turkish"], + ["Ukrainian", "ukr", "ukr", "Ukrainian"], + ["Urdu", "urd", "urd", "Urdu"], + ["Vietnamese", "vie", "vie", "Vietnamese"], + ] + + return LanguageList + + def ExtraLanguageList(self): + ExtraLanguageList = [ + ["Polish - Dubbing", "pol", "pol", "Polish - Dubbing"], + ["Polish - Lektor", "pol", "pol", "Polish - Lektor"], + ] + + return ExtraLanguageList + + def AddChapters(self): + if os.path.isfile(self.CurrentName_Original + " Chapters.txt"): + self.merge += [ + "--chapter-charset", + "UTF-8", + "--chapters", + self.CurrentName_Original + " Chapters.txt", + ] + + return + + def AddVideo(self): + inputVideo = None + + videofiles = [ + "{} [{}p]_Demuxed.mp4", + "{} [{}p]_Demuxed.mp4", + "{} [{}p] [UHD]_Demuxed.mp4", + "{} [{}p] [UHD]_Demuxed.mp4", + "{} [{}p] [VP9]_Demuxed.mp4", + "{} [{}p] [HIGH]_Demuxed.mp4", + "{} [{}p] [VP9]_Demuxed.mp4", + "{} [{}p] [HEVC]_Demuxed.mp4", + "{} [{}p] [HDR]_Demuxed.mp4", + "{} [{}p] [HDR-DV]_Demuxed.mp4", + ] + + for videofile in videofiles: + filename = videofile.format(self.CurrentName_Original, self.CurrentHeigh) + if os.path.isfile(filename): + inputVideo = filename + break + + if not inputVideo: + self.logger.info("cannot found video file.") + exit(-1) + + if self.default_mux: + outputVideo = ( + re.compile("|".join([".h264", ".h265", ".vp9", ".mp4"])).sub("", inputVideo) + + ".mkv" + ) + if self.SeasonFolder: + outputVideo = os.path.join( + os.path.abspath(self.SeasonFolder), outputVideo + ) + outputVideo = outputVideo.replace("\\", "/") + else: + outputVideo = self.setName() + + self.outputVideo = outputVideo + + if self.fps24: + self.merge += [ + self.mkvmerge, + "--output", + outputVideo, + "--default-duration", + "0:24000/1001p", + "--language", + "0:und", + "--default-track", + "0:yes", + "(", + inputVideo, + ")", + ] + else: + self.merge += [ + self.mkvmerge, + "--output", + outputVideo, + "--title", + 'RAB', + "(", + inputVideo, + ")", + ] + + return + + def AddAudio(self): + + audiofiles = [ + "{} {}.ac3", + "{} {} - Audio Description.ac3", + "{} {}.eac3", + "{} {} - Audio Description.eac3", + "{} {}.aac", + "{} {} - Audio Description.aac", + ] + + for (audio_language, subs_language, language_id, language_name,) in ( + self.LanguageList() + self.ExtraLanguageList() + ): + for audiofile in audiofiles: + filename = audiofile.format(self.CurrentName_Original, audio_language) + if os.path.isfile(filename): + self.merge += [ + "--language", + f"0:{language_id}", + "--track-name", + "0:Audio Description" if 'Audio Description' in filename + else f"0:{language_name}", + "--default-track", + "0:yes" + if subs_language == self.muxer_settings["AUDIO"] + else "0:no", + "(", + filename, + ")", + ] + + return + + def AddSubtitles(self): + + srts = [ + "{} {}.srt", + ] + forceds = [ + "{} forced-{}.srt", + ] + sdhs = [ + "{} sdh-{}.srt", + ] + + for ( + audio_language, + subs_language, + language_id, + language_name, + ) in self.LanguageList(): + for subtitle in srts: + filename = subtitle.format(self.CurrentName_Original, subs_language) + if os.path.isfile(filename): + self.merge += [ + "--language", + f"0:{language_id}", + "--track-name", + f"0:{language_name}", + "--forced-track", + "0:no", + "--default-track", + "0:yes" + if subs_language == self.muxer_settings["SUB"] + else "0:no", + "--compression", + "0:none", + "(", + filename, + ")", + ] + + for subtitle in forceds: + filename = subtitle.format(self.CurrentName_Original, subs_language) + if os.path.isfile(filename): + self.merge += [ + "--language", + f"0:{language_id}", + "--track-name", + f"0:Forced", + "--forced-track", + "0:yes", + "--default-track", + "0:no", + "--compression", + "0:none", + "(", + filename, + ")", + ] + + for subtitle in sdhs: + filename = subtitle.format(self.CurrentName_Original, subs_language) + if os.path.isfile(filename): + self.merge += [ + "--language", + f"0:{language_id}", + "--track-name", + f"0:SDH", + "--forced-track", + "0:no", + "--default-track", + "0:no", + "--compression", + "0:none", + "(", + filename, + ")", + ] + + return + + def startMux(self): + self.AddVideo() + self.AddAudio() + self.AddSubtitles() + self.AddChapters() + if not os.path.isfile(self.outputVideo): + self.Run(self.merge + self.Extras) + + return self.outputVideo diff --git a/helpers/Parsers/Netflix/MSLClient.py b/helpers/Parsers/Netflix/MSLClient.py new file mode 100644 index 0000000..f3e940a --- /dev/null +++ b/helpers/Parsers/Netflix/MSLClient.py @@ -0,0 +1,551 @@ +import base64, binascii, json, os, re, random, requests, string, time, traceback, logging +from datetime import datetime +from Cryptodome.Cipher import AES, PKCS1_OAEP +from Cryptodome.Util import Padding +from Cryptodome.Hash import HMAC, SHA256 +from Cryptodome.PublicKey import RSA +from pywidevine.cdm import cdm, deviceconfig +from configs.config import tool + +class MSLClient: + def __init__(self, profiles=None, wv_keyexchange=True, proxies=None): + + self.session = requests.session() + self.logger = logging.getLogger(__name__) + if proxies: + self.session.proxies.update(proxies) + + self.nf_endpoints = { + "manifest": "https://www.netflix.com/nq/msl_v1/cadmium/pbo_manifests/^1.0.0/router", + "license": "https://www.netflix.com/nq/msl_v1/cadmium/pbo_licenses/^1.0.0/router", + } + + ###################################################################### + + self.config = tool().config("NETFLIX") + self.email = self.config["email"] + self.password = self.config["password"] + self.device = tool().devices()["NETFLIX-MANIFEST"] + self.save_rsa_location = self.config["token_file"] + self.languages = self.config["manifest_language"] + self.license_path = None + + ###################################################################### + + if os.path.isfile(self.save_rsa_location): + self.generatePrivateKey = RSA.importKey( + json.loads(open(self.save_rsa_location, "r").read())["RSA_KEY"] + ) + else: + self.generatePrivateKey = RSA.generate(2048) + + if wv_keyexchange: + self.wv_keyexchange = True + self.cdm = cdm.Cdm() + self.cdm_session = None + else: + self.wv_keyexchange = False + self.cdm = None + self.cdm_session = None + + self.manifest_challenge = '' # set desired wv data to overide wvexchange data + + self.profiles = profiles + + self.logger.debug("Using profiles: {}".format(self.profiles)) + + esn = self.config["androidEsn"] + if esn is None: + self.logger.error( + '\nandroid esn not found, set esn with cdm systemID in config.py' + ) + else: + self.esn = esn + + self.logger.debug("Using esn: " + self.esn) + + self.messageid = random.randint(0, 2 ** 52) + self.session_keys = {} #~ + self.header = { + "sender": self.esn, + "handshake": True, + "nonreplayable": 2, + "capabilities": {"languages": [], "compressionalgos": []}, + "recipient": "Netflix", + "renewable": True, + "messageid": self.messageid, + "timestamp": time.time(), + } + + self.setRSA() + + def get_header_extra(self): + + if self.wv_keyexchange: + self.cdm_session = self.cdm.open_session( + None, + deviceconfig.DeviceConfig(self.device), + b"\x0A\x7A\x00\x6C\x38\x2B", + True, + ) + wv_request = base64.b64encode( + self.cdm.get_license_request(self.cdm_session) + ).decode("utf-8") + + self.header["keyrequestdata"] = [ + { + "scheme": "WIDEVINE", + "keydata": { + "keyrequest": wv_request + } + } + ] + + else: + self.header["keyrequestdata"] = [ + { + "scheme": "ASYMMETRIC_WRAPPED", + "keydata": { + "publickey": base64.b64encode( + self.generatePrivateKey.publickey().exportKey("DER") + ).decode("utf8"), + "mechanism": "JWK_RSA", + "keypairid": "rsaKeypairId", + }, + } + ] + + return self.header + + def setRSA(self): + if os.path.isfile(self.save_rsa_location): + master_token = self.load_tokens() + expires = master_token["expiration"] + valid_until = datetime.utcfromtimestamp(int(expires)) + present_time = datetime.now() + + difference = valid_until - present_time + difference = difference.total_seconds() / 60 / 60 + if difference < 10: + self.logger.debug("rsa file found. expired soon") + self.session_keys["session_keys"] = self.generate_handshake() + else: + self.logger.debug("rsa file found") + self.session_keys["session_keys"] = { + "mastertoken": master_token["mastertoken"], + "sequence_number": master_token["sequence_number"], + "encryption_key": master_token["encryption_key"], + "sign_key": master_token["sign_key"], + } + else: + self.logger.debug("rsa file not found") + self.session_keys["session_keys"] = self.generate_handshake() + + def load_playlist(self, viewable_id): + + payload = { + "version": 2, + "url": "/manifest", #"/licensedManifest" + "id": int(time.time()), + "languages": self.languages, + "params": { + #"challenge": self.manifest_challenge, + "type": "standard", + "viewableId": viewable_id, + "profiles": self.profiles, + "flavor": "STANDARD", #'PRE_FETCH' + "drmType": "widevine", + "usePsshBox": True, + "useHttpsStreams": True, + "supportsPreReleasePin": True, + "supportsWatermark": True, + 'supportsUnequalizedDownloadables': True, + 'requestEligibleABTests': True, + "isBranching": False, + 'isNonMember': False, + 'isUIAutoPlay': False, + "imageSubtitleHeight": 1080, + "uiVersion": "shakti-v4bf615c3", + 'uiPlatform': 'SHAKTI', + "clientVersion": "6.0026.291.011", + 'desiredVmaf': 'plus_lts', # phone_plus_exp + "showAllSubDubTracks": True, + #"preferredTextLocale": "ar", + #"preferredAudioLocale": "ar", + #"maxSupportedLanguages": 2, + "preferAssistiveAudio": False, + "deviceSecurityLevel": "3000", + 'licenseType': 'standard', + 'titleSpecificData': { + str(viewable_id): { + 'unletterboxed': True + } + }, + "videoOutputInfo": [ + { + "type": "DigitalVideoOutputDescriptor", + "outputType": "unknown", + "supportedHdcpVersions": ['2.2'], + "isHdcpEngaged": True, + } + ], + }, + } + + request_data = self.msl_request(payload) + response = self.session.post(self.nf_endpoints["manifest"], data=request_data) + manifest = json.loads(json.dumps(self.decrypt_response(response.text))) + + if manifest.get("result"): + #with open('videoTraks.json', 'w', encoding='utf-8') as d: + #["result"]["video_tracks"] + # d.write(json.dumps(manifest, indent=2)) + self.license_path = manifest["result"]["links"]["license"]["href"] + return manifest + + if manifest.get("errormsg"): + self.logger.info(manifest["errormsg"]) + return None + else: + self.logger.info(manifest) + return None + + def decrypt_response(self, payload): + errored = False + try: + p = json.loads(payload) + if p.get("errordata"): + return json.loads(base64.b64decode(p["errordata"]).decode()) + except: + payloads = re.split( + r',"signature":"[0-9A-Za-z/+=]+"}', payload.split("}}")[1] + ) + payloads = [x + "}" for x in payloads] + new_payload = payloads[:-1] + + chunks = [] + for chunk in new_payload: + try: + payloadchunk = json.loads(chunk)["payload"] + encryption_envelope = payloadchunk + cipher = AES.new( + self.session_keys["session_keys"]["encryption_key"], + AES.MODE_CBC, + base64.b64decode( + json.loads( + base64.b64decode(encryption_envelope).decode("utf8") + )["iv"] + ), + ) + + plaintext = cipher.decrypt( + base64.b64decode( + json.loads( + base64.b64decode(encryption_envelope).decode("utf8") + )["ciphertext"] + ) + ) + + plaintext = json.loads(Padding.unpad(plaintext, 16).decode("utf8")) + + data = plaintext["data"] + data = base64.b64decode(data).decode("utf8") + chunks.append(data) + except: + continue + + decrypted_payload = "".join(chunks) + try: + return json.loads(decrypted_payload) + except: + traceback.print_exc() + self.logger.info("Unable to decrypt payloads...exiting") + exit(-1) + + def generate_handshake(self): + self.logger.debug("generate_handshake") + header = self.get_header_extra() + + request = { + "entityauthdata": { + "scheme": "NONE", + "authdata": {"identity": self.esn,} + }, + "signature": "", + "headerdata": base64.b64encode(json.dumps(header).encode("utf8")).decode("utf8"), + } + response = self.session.post( + url=self.nf_endpoints["manifest"], + json=request, + ) + try: + if response.json().get("errordata"): + self.logger.info("ERROR") + self.logger.info( + base64.b64decode(response.json()["errordata"]).decode() + ) + exit(-1) + handshake = self.parse_handshake(response=response.json()) + return handshake + except: + traceback.print_exc() + self.logger.info(response.text) + exit(-1) + + def load_tokens(self): + + with open(self.save_rsa_location, "r", encoding='utf-8') as f: + tokens_data = json.loads(f.read()) + + data = { + "mastertoken": tokens_data["mastertoken"], + "sequence_number": tokens_data["sequence_number"], + "encryption_key": base64.standard_b64decode(tokens_data["encryption_key"]), + "sign_key": base64.standard_b64decode(tokens_data["sign_key"]), + "RSA_KEY": tokens_data["RSA_KEY"], + "expiration": tokens_data["expiration"], + } + + return data + + def save_tokens(self, tokens_data): + + data = { + "mastertoken": tokens_data["mastertoken"], + "sequence_number": tokens_data["sequence_number"], + "encryption_key": base64.standard_b64encode( + tokens_data["encryption_key"] + ).decode("utf-8"), + "sign_key": base64.standard_b64encode(tokens_data["sign_key"]).decode( + "utf-8" + ), + "RSA_KEY": tokens_data["RSA_KEY"], + "expiration": tokens_data["expiration"], + } + + with open(self.save_rsa_location, 'w', encoding='utf-8') as f: + f.write(json.dumps(data, indent=2)) + + def parse_handshake(self, response): + headerdata = json.loads(base64.b64decode(response["headerdata"]).decode("utf8")) + + keyresponsedata = headerdata["keyresponsedata"] + mastertoken = headerdata["keyresponsedata"]["mastertoken"] + sequence_number = json.loads( + base64.b64decode(mastertoken["tokendata"]).decode("utf8") + )["sequencenumber"] + + if self.wv_keyexchange: + expected_scheme = "WIDEVINE" + else: + expected_scheme = "ASYMMETRIC_WRAPPED" + + scheme = keyresponsedata["scheme"] + + if scheme != expected_scheme: + self.logger.info("Key Exchange failed:") + return False + + keydata = keyresponsedata["keydata"] + + if self.wv_keyexchange: + encryption_key, sign_key = self.__process_wv_keydata(keydata) + else: + encryption_key, sign_key = self.__parse_rsa_wrapped_crypto_keys(keydata) + + tokens_data = { + "mastertoken": mastertoken, + "sequence_number": sequence_number, + "encryption_key": encryption_key, + "sign_key": sign_key, + } + + tokens_data_save = tokens_data + tokens_data_save.update( + {"RSA_KEY": self.generatePrivateKey.exportKey().decode()} + ) + tokens_data_save.update( + { + "expiration": json.loads( + base64.b64decode( + json.loads(base64.b64decode(response["headerdata"]))[ + "keyresponsedata" + ]["mastertoken"]["tokendata"] + ) + )["expiration"] + } + ) + self.save_tokens(tokens_data_save) + return tokens_data + + def __process_wv_keydata(self, keydata): + + wv_response_b64 = keydata["cdmkeyresponse"] # pass as b64 + encryptionkeyid = base64.standard_b64decode(keydata["encryptionkeyid"]) + hmackeyid = base64.standard_b64decode(keydata["hmackeyid"]) + self.cdm.provide_license(self.cdm_session, wv_response_b64) + keys = self.cdm.get_keys(self.cdm_session) + self.logger.debug("wv key exchange: obtained wv key exchange keys %s" % keys) + return ( + self.__find_wv_key(encryptionkeyid, keys, ["AllowEncrypt", "AllowDecrypt"]), + self.__find_wv_key(hmackeyid, keys, ["AllowSign", "AllowSignatureVerify"]), + ) + + def __find_wv_key(self, kid, keys, permissions): + for key in keys: + if key.kid != kid: + continue + if key.type != "OPERATOR_SESSION": + self.logger.debug( + "wv key exchange: Wrong key type (not operator session) key %s" + % key + ) + continue + + if not set(permissions) <= set(key.permissions): + self.logger.debug( + "wv key exchange: Incorrect permissions, key %s, needed perms %s" + % (key, permissions) + ) + continue + return key.key + + return None + + def __parse_rsa_wrapped_crypto_keys(self, keydata): + # Init Decryption + encrypted_encryption_key = base64.b64decode(keydata["encryptionkey"]) + + encrypted_sign_key = base64.b64decode(keydata["hmackey"]) + + oaep_cipher = PKCS1_OAEP.new(self.generatePrivateKey) + encryption_key_data = json.loads( + oaep_cipher.decrypt(encrypted_encryption_key).decode("utf8") + ) + + encryption_key = self.base64_check(encryption_key_data["k"]) + + sign_key_data = json.loads( + oaep_cipher.decrypt(encrypted_sign_key).decode("utf8") + ) + + sign_key = self.base64_check(sign_key_data["k"]) + return (encryption_key, sign_key) + + def base64key_decode(self, payload): + l = len(payload) % 4 + if l == 2: + payload += "==" + elif l == 3: + payload += "=" + elif l != 0: + raise ValueError("Invalid base64 string") + return base64.urlsafe_b64decode(payload.encode("utf-8")) + + def base64_check(self, string): + + while len(string) % 4 != 0: + string = string + "=" + return base64.urlsafe_b64decode(string.encode()) + + def msl_request(self, data, is_handshake=False): + + header = self.header.copy() + header["handshake"] = is_handshake + header["userauthdata"] = { + "scheme": "EMAIL_PASSWORD", + "authdata": {"email": self.email, "password": self.password}, + } + + header_envelope = self.msl_encrypt(self.session_keys, json.dumps(header)) + + header_signature = HMAC.new( + self.session_keys["session_keys"]["sign_key"], header_envelope, SHA256 + ).digest() + + encrypted_header = { + "headerdata": base64.b64encode(header_envelope).decode("utf8"), + "signature": base64.b64encode(header_signature).decode("utf8"), + "mastertoken": self.session_keys["session_keys"]["mastertoken"], + } + + payload = { + "messageid": self.messageid, + "data": base64.b64encode(json.dumps(data).encode()).decode("utf8"), + "sequencenumber": 1, + "endofmsg": True, + } + + payload_envelope = self.msl_encrypt(self.session_keys, json.dumps(payload)) + + payload_signature = HMAC.new( + self.session_keys["session_keys"]["sign_key"], payload_envelope, SHA256 + ).digest() + + payload_chunk = { + "payload": base64.b64encode(payload_envelope).decode("utf8"), + "signature": base64.b64encode(payload_signature).decode("utf8"), + } + return json.dumps(encrypted_header) + json.dumps(payload_chunk) + + def msl_encrypt(self, msl_session, plaintext): + + cbc_iv = os.urandom(16) + encryption_envelope = { + "keyid": "%s_%s" + % (self.esn, msl_session["session_keys"]["sequence_number"]), + "sha256": "AA==", + "iv": base64.b64encode(cbc_iv).decode("utf8"), + } + + plaintext = Padding.pad(plaintext.encode("utf8"), 16) + cipher = AES.new( + msl_session["session_keys"]["encryption_key"], AES.MODE_CBC, cbc_iv + ) + + ciphertext = cipher.encrypt(plaintext) + + encryption_envelope["ciphertext"] = base64.b64encode(ciphertext).decode("utf8") + + return json.dumps(encryption_envelope).encode("utf8") + + def get_license(self, challenge, session_id): + + if not isinstance(challenge, bytes): + raise TypeError("challenge must be of type bytes") + + if not isinstance(session_id, str): + raise TypeError("session_id must be of type string") + + timestamp = int(time.time() * 10000) + + license_request_data = { + "version": 2, + "url": self.license_path, + "id": timestamp, + "languages": "en_US", + "echo": "drmsessionId", + "params": [ + { + "drmSessionId": session_id, + "clientTime": int(timestamp / 10000), + "challengeBase64": base64.b64encode(challenge).decode("utf8"), + "xid": str(timestamp + 1610), + } + ] + } + + request_data = self.msl_request(license_request_data) + + resp = self.session.post(url=self.nf_endpoints["license"],data=request_data) + + try: + resp.json() + + except ValueError: + msl_license_data = json.loads(json.dumps(self.decrypt_response(resp.text))) + if msl_license_data.get("result"): + return msl_license_data + if msl_license_data.get("errormsg"): + raise ValueError(msl_license_data["errormsg"]) + raise ValueError(msl_license_data) diff --git a/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-36.pyc b/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-36.pyc new file mode 100644 index 0000000..aadc782 Binary files /dev/null and b/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-36.pyc differ diff --git a/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-39.pyc b/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-39.pyc new file mode 100644 index 0000000..30ab199 Binary files /dev/null and b/helpers/Parsers/Netflix/__pycache__/MSLClient.cpython-39.pyc differ diff --git a/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-36.pyc b/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-36.pyc new file mode 100644 index 0000000..82ab2e0 Binary files /dev/null and b/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-36.pyc differ diff --git a/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-39.pyc b/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-39.pyc new file mode 100644 index 0000000..b586ef1 Binary files /dev/null and b/helpers/Parsers/Netflix/__pycache__/get_keys.cpython-39.pyc differ diff --git a/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-36.pyc b/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-36.pyc new file mode 100644 index 0000000..074b490 Binary files /dev/null and b/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-36.pyc differ diff --git a/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-39.pyc b/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-39.pyc new file mode 100644 index 0000000..126cc6c Binary files /dev/null and b/helpers/Parsers/Netflix/__pycache__/get_manifest.cpython-39.pyc differ diff --git a/helpers/Parsers/Netflix/get_keys.py b/helpers/Parsers/Netflix/get_keys.py new file mode 100644 index 0000000..a61206e --- /dev/null +++ b/helpers/Parsers/Netflix/get_keys.py @@ -0,0 +1,159 @@ +import time, os, json, logging, base64 +from helpers.Parsers.Netflix.MSLClient import MSLClient +from configs.config import tool +from pywidevine.decrypt.wvdecryptcustom import WvDecrypt + +logger = logging.getLogger(__name__) + +''' "av1-main-L20-dash-cbcs-prk", + "av1-main-L21-dash-cbcs-prk", + "av1-main-L30-dash-cbcs-prk", + "av1-main-L31-dash-cbcs-prk", + "av1-main-L40-dash-cbcs-prk", + "av1-main-L41-dash-cbcs-prk", + "av1-main-L50-dash-cbcs-prk", + "av1-main-L51-dash-cbcs-prk",''' + +''' "vp9-profile0-L21-dash-cenc", + "vp9-profile0-L30-dash-cenc", + "vp9-profile0-L31-dash-cenc", + "vp9-profile0-L40-dash-cenc", + "vp9-profile2-L30-dash-cenc-prk", + "vp9-profile2-L31-dash-cenc-prk", + "vp9-profile2-L40-dash-cenc-prk", + "vp9-profile2-L50-dash-cenc-prk", + "vp9-profile2-L51-dash-cenc-prk"''' + +def from_kid(kid): + array_of_bytes = bytearray(b"\x00\x00\x002pssh\x00\x00\x00\x00") + array_of_bytes.extend(bytes.fromhex("edef8ba979d64acea3c827dcd51d21ed")) + array_of_bytes.extend(b"\x00\x00\x00\x12\x12\x10") + array_of_bytes.extend(bytes.fromhex(kid.replace("-", ""))) + pssh = base64.b64encode(bytes.fromhex(array_of_bytes.hex())) + return pssh.decode() + +def __profiles(profile, addHEVCDO=False): + + profiles = [ + "heaac-2-dash", + "dfxp-ls-sdh", + "webvtt-lssdh-ios8", + "BIF240", + "BIF320", + ] + + if profile == "High KEYS": + profiles += [ + "playready-h264hpl22-dash", + "playready-h264hpl30-dash", + "playready-h264hpl31-dash", + #'playready-h264hpl40-dash' + ] + + elif profile == "Main KEYS": + profiles += [ + "playready-h264mpl30-dash", + ] + + elif profile == "HEVC KEYS": + profiles += [ + "hevc-main-L30-dash-cenc", + "hevc-main10-L30-dash-cenc", + "hevc-main10-L30-dash-cenc-prk", + "hevc-main-L31-dash-cenc" + "hevc-main10-L31-dash-cenc", + "hevc-main10-L31-dash-cenc-prk", + "hevc-main-L40-dash-cenc", + "hevc-main10-L40-dash-cenc", + "hevc-main10-L40-dash-cenc-prk", + "hevc-main-L41-dash-cenc", + "hevc-main10-L41-dash-cenc", + "hevc-main10-L41-dash-cenc-prk" + ] + if addHEVCDO: + profiles += [ + "hevc-main10-L31-dash-cenc-prk-do", + "hevc-main10-L31-dash-cenc-prk-do", + "hevc-main10-L40-dash-cenc-prk-do", + "hevc-main10-L41-dash-cenc-prk-do", + ] + + elif profile == 'HDR-10 KEYS': + profiles += [ + "hevc-hdr-main10-L30-dash-cenc", + "hevc-hdr-main10-L30-dash-cenc-prk", + "hevc-hdr-main10-L31-dash-cenc", + "hevc-hdr-main10-L31-dash-cenc-prk", + "hevc-hdr-main10-L40-dash-cenc", + "hevc-hdr-main10-L41-dash-cenc", + "hevc-hdr-main10-L40-dash-cenc-prk", + "hevc-hdr-main10-L41-dash-cenc-prk" + ] + else: + profiles += [ + "playready-h264mpl30-dash", + ] + + return profiles + +def GettingKEYS_Netflixv2(nfID, profile): # + + KEYS = [] + + available_profiles = [ + "High KEYS", + "HEVC KEYS", + "HDR-10 KEYS", + "Main KEYS" + ] + + if not profile in available_profiles: + logger.info("Error: Unknown profile: {}".format(profile)) + exit(1) + + logger.info(f"\nGetting {profile}...") + + profiles = __profiles(profile) + + try: + client = MSLClient(profiles=profiles) + resp = client.load_playlist(int(nfID)) + if resp is None: + if profile == 'HEVC KEYS': + profiles = __profiles(profile, addHEVCDO=True) + client = MSLClient(profiles=profiles) + resp = client.load_playlist(int(nfID)) + + except Exception as e: + logger.error("Manifest Error: {}".format(e)) + return KEYS + + try: + #init_data_b64 = from_kid('0000000005edabd50000000000000000') + init_data_b64 = resp["result"]["video_tracks"][0]["drmHeader"]["bytes"] + except KeyError: + logger.error("cannot get pssh, {}".format(resp)) + return KEYS + + cert_data_b64 = "CAUSwwUKvQIIAxIQ5US6QAvBDzfTtjb4tU/7QxiH8c+TBSKOAjCCAQoCggEBAObzvlu2hZRsapAPx4Aa4GUZj4/GjxgXUtBH4THSkM40x63wQeyVxlEEo1D/T1FkVM/S+tiKbJiIGaT0Yb5LTAHcJEhODB40TXlwPfcxBjJLfOkF3jP6wIlqbb6OPVkDi6KMTZ3EYL6BEFGfD1ag/LDsPxG6EZIn3k4S3ODcej6YSzG4TnGD0szj5m6uj/2azPZsWAlSNBRUejmP6Tiota7g5u6AWZz0MsgCiEvnxRHmTRee+LO6U4dswzF3Odr2XBPD/hIAtp0RX8JlcGazBS0GABMMo2qNfCiSiGdyl2xZJq4fq99LoVfCLNChkn1N2NIYLrStQHa35pgObvhwi7ECAwEAAToQdGVzdC5uZXRmbGl4LmNvbRKAA4TTLzJbDZaKfozb9vDv5qpW5A/DNL9gbnJJi/AIZB3QOW2veGmKT3xaKNQ4NSvo/EyfVlhc4ujd4QPrFgYztGLNrxeyRF0J8XzGOPsvv9Mc9uLHKfiZQuy21KZYWF7HNedJ4qpAe6gqZ6uq7Se7f2JbelzENX8rsTpppKvkgPRIKLspFwv0EJQLPWD1zjew2PjoGEwJYlKbSbHVcUNygplaGmPkUCBThDh7p/5Lx5ff2d/oPpIlFvhqntmfOfumt4i+ZL3fFaObvkjpQFVAajqmfipY0KAtiUYYJAJSbm2DnrqP7+DmO9hmRMm9uJkXC2MxbmeNtJHAHdbgKsqjLHDiqwk1JplFMoC9KNMp2pUNdX9TkcrtJoEDqIn3zX9p+itdt3a9mVFc7/ZL4xpraYdQvOwP5LmXj9galK3s+eQJ7bkX6cCi+2X+iBmCMx4R0XJ3/1gxiM5LiStibCnfInub1nNgJDojxFA3jH/IuUcblEf/5Y0s1SzokBnR8V0KbA==" + + device = tool().devices()["NETFLIX-LICENSE"] + + wvdecrypt = WvDecrypt( + init_data_b64=init_data_b64, cert_data_b64=cert_data_b64, device=device + ) + challenge = wvdecrypt.get_challenge() + current_sessionId = str(time.time()).replace(".", "")[0:-2] + data = client.get_license(challenge, current_sessionId) + + try: + license_b64 = data["result"][0]["licenseResponseBase64"] + except Exception: + logger.error("MSL LICENSE Error Message: {}".format(data)) + return KEYS + + wvdecrypt.update_license(license_b64) + Correct, keyswvdecrypt = wvdecrypt.start_process() + KEYS = keyswvdecrypt + + return KEYS \ No newline at end of file diff --git a/helpers/Parsers/Netflix/get_manifest.py b/helpers/Parsers/Netflix/get_manifest.py new file mode 100644 index 0000000..8f1e14b --- /dev/null +++ b/helpers/Parsers/Netflix/get_manifest.py @@ -0,0 +1,736 @@ +from helpers.ripprocess import ripprocess +from helpers.Parsers.Netflix.MSLClient import MSLClient +from configs.config import tool +import re, os, json, logging + +def MSLprofiles(): + PROFILES = { + "BASICS": ["BIF240", "BIF320", "webvtt-lssdh-ios8", "dfxp-ls-sdh"], + "MAIN": { + "SD": [ + "playready-h264bpl30-dash", + "playready-h264mpl22-dash", + "playready-h264mpl30-dash", + ], + "HD": [ + "playready-h264bpl30-dash", + "playready-h264mpl22-dash", + "playready-h264mpl30-dash", + "playready-h264mpl31-dash", + ], + "FHD": [ + "playready-h264bpl30-dash", + "playready-h264mpl22-dash", + "playready-h264mpl30-dash", + "playready-h264mpl31-dash", + "playready-h264mpl40-dash", + ], + "ALL": [ + "playready-h264bpl30-dash", + "playready-h264mpl22-dash", + "playready-h264mpl30-dash", + "playready-h264mpl31-dash", + "playready-h264mpl40-dash", + ], + }, + "HIGH": { + "SD": [ + "playready-h264hpl22-dash", + "playready-h264hpl30-dash", + ], + "HD": [ + "playready-h264hpl22-dash", + "playready-h264hpl30-dash", + "playready-h264hpl31-dash", + ], + "FHD": [ + "playready-h264hpl22-dash", + "playready-h264hpl30-dash", + "playready-h264hpl31-dash", + "playready-h264hpl40-dash", + ], + "ALL": [ + "playready-h264hpl22-dash", + "playready-h264hpl30-dash", + "playready-h264hpl31-dash", + "playready-h264hpl40-dash", + ], + }, + "HEVC": { + "SD": [ + "hevc-main-L30-dash-cenc", + "hevc-main10-L30-dash-cenc", + "hevc-main10-L30-dash-cenc-prk", + ], + "HD": [ + "hevc-main-L30-dash-cenc", + "hevc-main10-L30-dash-cenc", + "hevc-main10-L30-dash-cenc-prk", + "hevc-main-L31-dash-cenc", + "hevc-main10-L31-dash-cenc", + "hevc-main10-L31-dash-cenc-prk", + ], + "FHD": [ + "hevc-main-L30-dash-cenc", + "hevc-main10-L30-dash-cenc", + "hevc-main10-L30-dash-cenc-prk", + "hevc-main-L31-dash-cenc" + "hevc-main10-L31-dash-cenc", + "hevc-main10-L31-dash-cenc-prk", + "hevc-main-L40-dash-cenc", + "hevc-main10-L40-dash-cenc", + "hevc-main10-L40-dash-cenc-prk", + "hevc-main-L41-dash-cenc", + "hevc-main10-L41-dash-cenc", + "hevc-main10-L41-dash-cenc-prk", + ], + "ALL": [ + "hevc-main-L30-dash-cenc", + "hevc-main10-L30-dash-cenc", + "hevc-main10-L30-dash-cenc-prk", + "hevc-main-L31-dash-cenc" + "hevc-main10-L31-dash-cenc", + "hevc-main10-L31-dash-cenc-prk", + "hevc-main-L40-dash-cenc", + "hevc-main10-L40-dash-cenc", + "hevc-main10-L40-dash-cenc-prk", + "hevc-main-L41-dash-cenc", + "hevc-main10-L41-dash-cenc", + "hevc-main10-L41-dash-cenc-prk", + ], + }, + "HEVCDO": { + "SD": [ + "hevc-main10-L30-dash-cenc-prk-do", + ], + "HD": [ + "hevc-main10-L30-dash-cenc-prk-do", + "hevc-main10-L31-dash-cenc-prk-do" + ], + "FHD": [ + "hevc-main10-L31-dash-cenc-prk-do", + "hevc-main10-L31-dash-cenc-prk-do", + "hevc-main10-L40-dash-cenc-prk-do", + "hevc-main10-L41-dash-cenc-prk-do", + ], + "ALL": [ + "hevc-main10-L31-dash-cenc-prk-do", + "hevc-main10-L31-dash-cenc-prk-do", + "hevc-main10-L40-dash-cenc-prk-do", + "hevc-main10-L41-dash-cenc-prk-do", + ], + }, + "HDR": { + "SD": [ + "hevc-hdr-main10-L30-dash-cenc", + "hevc-hdr-main10-L30-dash-cenc-prk", + ], + "HD": [ + "hevc-hdr-main10-L30-dash-cenc", + "hevc-hdr-main10-L30-dash-cenc-prk", + "hevc-hdr-main10-L31-dash-cenc", + "hevc-hdr-main10-L31-dash-cenc-prk", + ], + "FHD": [ + "hevc-hdr-main10-L30-dash-cenc", + "hevc-hdr-main10-L30-dash-cenc-prk", + "hevc-hdr-main10-L31-dash-cenc", + "hevc-hdr-main10-L31-dash-cenc-prk", + "hevc-hdr-main10-L40-dash-cenc", + "hevc-hdr-main10-L41-dash-cenc", + "hevc-hdr-main10-L40-dash-cenc-prk", + "hevc-hdr-main10-L41-dash-cenc-prk", + ], + "ALL": [ + "hevc-hdr-main10-L30-dash-cenc", + "hevc-hdr-main10-L30-dash-cenc-prk", + "hevc-hdr-main10-L31-dash-cenc", + "hevc-hdr-main10-L31-dash-cenc-prk", + "hevc-hdr-main10-L40-dash-cenc", + "hevc-hdr-main10-L41-dash-cenc", + "hevc-hdr-main10-L40-dash-cenc-prk", + "hevc-hdr-main10-L41-dash-cenc-prk", + ], + }, + } + + return PROFILES + +class get_manifest: + + def __init__(self, args, nfid): + self.logger = logging.getLogger(__name__) + self.args = args + self.nfid = nfid + self.ripprocess = ripprocess() + self.profiles = MSLprofiles() + self.config = tool().config("NETFLIX") + + def LoadProfies(self, addHEVCDO=False): + getHigh = False + profiles = self.profiles["BASICS"] + + if self.args.video_main: + if self.args.customquality: + if int(self.args.customquality[0]) == 1080: + profiles += self.profiles["MAIN"]["FHD"] + elif ( + int(self.args.customquality[0]) < 1080 + and int(self.args.customquality[0]) >= 720 + ): + profiles += self.profiles["MAIN"]["HD"] + elif int(self.args.customquality[0]) < 720: + profiles += self.profiles["MAIN"]["SD"] + else: + profiles += self.profiles["MAIN"]["ALL"] + else: + if self.args.video_high: + if self.args.customquality: + if int(self.args.customquality[0]) == 1080: + profiles += self.profiles["HIGH"]["FHD"] + elif ( + int(self.args.customquality[0]) < 1080 + and int(self.args.customquality[0]) >= 720 + ): + profiles += self.profiles["HIGH"]["HD"] + elif int(self.args.customquality[0]) < 720: + profiles += self.profiles["HIGH"]["SD"] + else: + profiles += self.profiles["HIGH"]["ALL"] + else: + if self.args.hdr: + if self.args.customquality: + if int(self.args.customquality[0]) == 1080: + profiles += self.profiles["HDR"]["FHD"] + elif ( + int(self.args.customquality[0]) < 1080 + and int(self.args.customquality[0]) >= 720 + ): + profiles += self.profiles["HDR"]["HD"] + elif int(self.args.customquality[0]) < 720: + profiles += self.profiles["HDR"]["SD"] + else: + profiles += self.profiles["HDR"]["ALL"] + + elif self.args.hevc: + if self.args.customquality: + if int(self.args.customquality[0]) == 1080: + profiles += self.profiles["HEVC"]["FHD"] + if addHEVCDO: + profiles += self.profiles['HEVCDO']['FHD'] + elif ( + int(self.args.customquality[0]) < 1080 + and int(self.args.customquality[0]) >= 720 + ): + profiles += self.profiles["HEVC"]["HD"] + if addHEVCDO: + profiles += self.profiles['HEVCDO']['HD'] + elif int(self.args.customquality[0]) < 720: + profiles += self.profiles["HEVC"]["SD"] + if addHEVCDO: + profiles += self.profiles['HEVCDO']['SD'] + else: + profiles += self.profiles["HEVC"]["ALL"] + if addHEVCDO: + profiles += self.profiles['HEVCDO']['ALL'] + + else: + getHigh = True + if self.args.customquality: + if int(self.args.customquality[0]) == 1080: + profiles += self.profiles["MAIN"]["FHD"] + elif ( + int(self.args.customquality[0]) < 1080 + and int(self.args.customquality[0]) >= 720 + ): + profiles += self.profiles["MAIN"]["HD"] + elif int(self.args.customquality[0]) < 720: + profiles += self.profiles["MAIN"]["SD"] + else: + profiles += self.profiles["MAIN"]["ALL"] + + if self.args.aformat_2ch: + if str(self.args.aformat_2ch[0]) == "aac": + profiles.append("heaac-2-dash") + profiles.append("heaac-2hq-dash") + elif str(self.args.aformat_2ch[0]) == "eac3": + profiles.append("ddplus-2.0-dash") + elif str(self.args.aformat_2ch[0]) == "ogg": + profiles.append("playready-oggvorbis-2-dash") + else: + if self.args.only_2ch_audio: + profiles.append("ddplus-2.0-dash") + else: + if self.args.aformat_51ch: + if str(self.args.aformat_51ch[0]) == "aac": + profiles.append("heaac-5.1-dash") + profiles.append("heaac-5.1hq-dash") + elif str(self.args.aformat_51ch[0]) == "eac3": + profiles.append("ddplus-5.1-dash") + profiles.append("ddplus-5.1hq-dash") + elif str(self.args.aformat_51ch[0]) == "ac3": + profiles.append("dd-5.1-dash") + elif str(self.args.aformat_51ch[0]) == "atmos": + profiles.append("dd-5.1-dash") + profiles.append("ddplus-atmos-dash") + else: + profiles.append("dd-5.1-dash") + profiles.append("ddplus-5.1-dash") + profiles.append("ddplus-5.1hq-dash") + else: + profiles.append("ddplus-2.0-dash") + profiles.append("dd-5.1-dash") + profiles.append("ddplus-5.1-dash") + profiles.append("ddplus-5.1hq-dash") + profiles.append("ddplus-atmos-dash") + + return list(set(profiles)), getHigh + + def PyMSL(self, profiles): + + client = MSLClient(profiles=profiles) + + try: + resp = client.load_playlist(int(self.nfid)) + return resp + + except Exception as e: + self.logger.error("Manifest Error: {}".format(e)) + + return None + + def HighVideoMSL(self): + # for bitrate compare with main ~ + + self.logger.info("Getting High Profile Manifest...") + + profiles = self.profiles["BASICS"] + + if self.args.customquality: + if int(self.args.customquality[0]) == 1080: + profiles += self.profiles["HIGH"]["FHD"] + elif ( + int(self.args.customquality[0]) < 1080 + and int(self.args.customquality[0]) >= 720 + ): + profiles += self.profiles["HIGH"]["HD"] + elif int(self.args.customquality[0]) < 720: + profiles += self.profiles["HIGH"]["SD"] + else: + profiles += self.profiles["HIGH"]["ALL"] + + resp = self.PyMSL(profiles=profiles) + + VideoList = list() + + manifest = resp["result"] + + for video_track in manifest["video_tracks"]: + for downloadable in video_track["streams"]: + size_in_bytes = int(float(downloadable["size"])) + vid_size = ( + f"{size_in_bytes/1048576:0.2f} MiB" + if size_in_bytes < 1073741824 + else f"{size_in_bytes/1073741824:0.2f} GiB" + ) + vid_url = downloadable["urls"][0]["url"] + L3 = 'L3' if 'SEGMENT_MAP_2KEY' in str(downloadable['tags']) else '' # + + VideoList.append( + { + "Type": "video", + "Drm": downloadable["isDrm"], + "vmaf": downloadable["vmaf"], + "FrameRate": downloadable["framerate_value"], + "Height": downloadable["res_h"], + "Width": downloadable["res_w"], + "Size": vid_size, + "Url": vid_url, + "Bitrate": str(downloadable["bitrate"]), + "Profile": downloadable["content_profile"], + "L3": L3 # + } + ) + + VideoList = sorted(VideoList, key=lambda k: int(k["Bitrate"])) + + if self.args.customquality: + inp_height = int(self.args.customquality[0]) + top_height = sorted(VideoList, key=lambda k: int(k["Height"]))[-1]["Height"] + + if top_height >= inp_height: + height = [x for x in VideoList if int(x["Height"]) >= inp_height] + if not height == []: + VideoList = height + + return VideoList + + def ParseVideo(self, resp, getHigh): + manifest = resp["result"] + VideoList = [] + checkerinfo = "" + + for video_track in manifest["video_tracks"]: + for downloadable in video_track["streams"]: + size_in_bytes = int(float(downloadable["size"])) + vid_size = ( + f"{size_in_bytes/1048576:0.2f} MiB" + if size_in_bytes < 1073741824 + else f"{size_in_bytes/1073741824:0.2f} GiB" + ) + vid_url = downloadable["urls"][0]["url"] + + VideoList.append( + { + "Type": "video", + "Drm": downloadable["isDrm"], + "vmaf": downloadable["vmaf"], + "FrameRate": downloadable["framerate_value"], + "Height": downloadable["res_h"], + "Width": downloadable["res_w"], + "Size": vid_size, + "Url": vid_url, + "Bitrate": str(downloadable["bitrate"]), + "Profile": downloadable["content_profile"], + } + ) + + VideoList = sorted(VideoList, key=lambda k: int(k["Bitrate"])) + self.logger.debug("VideoList: {}".format(VideoList)) + + if self.args.customquality: + inp_height = int(self.args.customquality[0]) + top_height = sorted(VideoList, key=lambda k: int(k["Height"]))[-1]["Height"] + + if top_height >= inp_height: + height = [x for x in VideoList if int(x["Height"]) >= inp_height] + if not height == []: + VideoList = height + + if getHigh: + HighVideoList = self.HighVideoMSL() + if not HighVideoList == []: + checkerinfo = "\nNetflix Profile Checker v1.0\nMAIN: {}kbps | {}\nHIGH: {}kbps | {}\n\n{}\n" + checkerinfo = checkerinfo.format( + str(dict(VideoList[-1])["Bitrate"]), + str(dict(VideoList[-1])["Profile"]), + str(dict(HighVideoList[-1])["Bitrate"]), + str(dict(HighVideoList[-1])["Profile"]), + "result: MAIN is Better" + if int(dict(VideoList[-1])["Bitrate"]) + >= int(dict(HighVideoList[-1])["Bitrate"]) + else "result: HIGH is Better", + ) + + VideoList += HighVideoList + self.logger.debug("HighVideoList: {}".format(HighVideoList)) + + VideoList = sorted(VideoList, key=lambda k: int(k["Bitrate"])) + + return VideoList, checkerinfo + + def ParseAudioSubs(self, resp): + + def remove_dups(List, keyword=""): + # function to remove all dups based on list items ~ + Added_ = set() + Proper_ = [] + for L in List: + if L[keyword] not in Added_: + Proper_.append(L) + Added_.add(L[keyword]) + + return Proper_ + + def isOriginal(language_text): + # function to detect the original audio ~ + if "Original" in language_text: + return True + + brackets = re.search(r"\[(.*)\]", language_text) + if brackets: + return True + + return False + + def noOriginal(language_text): + # function to remove (original) from audio language to be detected in --alang ~ + brackets = re.search(r"\[(.*)\]", language_text) + if brackets: + return language_text.replace(brackets[0], "").strip() + + return language_text + + # start audio, subs parsing ~ + + manifest = resp["result"] + + AudioList, SubtitleList, ForcedList = list(), list(), list() + + # parse audios and return all (AD, non AD) as a list + for audio_track in manifest["audio_tracks"]: + AudioDescription = 'Audio Description' if "audio description" in \ + audio_track["languageDescription"].lower() else 'Audio' + Original = isOriginal(audio_track["languageDescription"]) + LanguageName, LanguageCode = self.ripprocess.countrycode( + audio_track["language"] + ) + LanguageName = noOriginal(audio_track["languageDescription"]) + + for downloadable in audio_track["streams"]: + aud_url = downloadable["urls"][0]["url"] + size = ( + str(format(float(int(downloadable["size"])) / 1058816, ".2f")) + + " MiB" + ) + + audioDict = { + "Type": AudioDescription, + "Drm": downloadable["isDrm"], + "Original": Original, + "Language": LanguageName, + "langAbbrev": LanguageCode, + "Size": size, + "Url": aud_url, + "channels": str(downloadable["channels"]), + "Bitrate": str(downloadable["bitrate"]), + "Profile": downloadable["content_profile"], + } + + if self.args.custom_audio_bitrate: + # only append the audio langs with the given bitrate + if int(downloadable["bitrate"]) <= \ + int(self.args.custom_audio_bitrate[0]): + AudioList.append(audioDict) + else: + AudioList.append(audioDict) + + AudioList = sorted(AudioList, key=lambda k: int(k["Bitrate"]), reverse=True) + + self.logger.debug("AudioList: {}".format(AudioList)) + + ################################################################################# + + AudioList = sorted( # keep only highest bitrate for every language + remove_dups(AudioList, keyword="Language"), + key=lambda k: int(k["Bitrate"]), + reverse=True, + ) + + OriginalAudioList = ( # for detect automatically forced subs ~ + AudioList + if len(AudioList) == 1 + else [x for x in AudioList if x["Original"]] + ) + + ################################################################################# + + # now parser AudioList based on user input to + # --alang X X --AD X X or original if none + + if self.args.AD: + ADlist = list() + UserLanguagesLower = list(map(lambda x: x.lower(), self.args.AD)) + for aud in AudioList: + if aud['Type'] == 'Audio': + if self.args.allaudios: + ADlist.append(aud) + else: + if aud["Original"]: + ADlist.append(aud) + + if aud['Type'] == 'Audio Description': + if ( + aud["Language"].lower() in UserLanguagesLower + or aud["langAbbrev"].lower() in UserLanguagesLower + ): + ADlist.append(aud) + + AudioList = ADlist + + if self.args.audiolang: + NewAudioList = list() + UserLanguagesLower = list(map(lambda x: x.lower(), self.args.audiolang)) + for aud in AudioList: + if self.args.AD: + # I already have AD langs parsed + if aud['Type'] == 'Audio Description': + NewAudioList.append(aud) + if aud['Type'] == 'Audio': + if ( + aud["Language"].lower() in UserLanguagesLower + or aud["langAbbrev"].lower() in UserLanguagesLower + ): + NewAudioList.append(aud) + + AudioList = NewAudioList + + else: + # so I know have the complete Audiolist + if self.args.allaudios: # remove AD tracks if not --AD X X + AllaudiosList = list() + if self.args.AD: + for aud in AudioList: + AllaudiosList.append(aud) + AudioList = AllaudiosList + else: + for aud in AudioList: + if aud['Type'] == 'Audio': + AllaudiosList.append(aud) + AudioList.clear() + AudioList = AllaudiosList + + else: + if self.args.AD: + AudioList = AudioList # I mean the ADlist + else: + # I mean no audio options are given, so we go with the original + AudioList = [x for x in AudioList if x["Original"] or len(AudioList) == 1] + + #####################################(Subtitles)##################################### + + for text_track in manifest["timedtexttracks"]: + if ( + not text_track["languageDescription"] == "Off" + and text_track["language"] is not None + ): + Language, langAbbrev = self.ripprocess.countrycode( + text_track["language"] + ) + Language = text_track["languageDescription"] + Type = text_track["trackType"] + rawTrackType = ( + text_track["rawTrackType"] + .replace("closedcaptions", "CC") + .replace("subtitles", "SUB") + ) + isForced = "NO" + + if ( + "CC" in rawTrackType + and langAbbrev != "ara" + and "dfxp-ls-sdh" in str(text_track["ttDownloadables"]) + ): + Profile = "dfxp-ls-sdh" + Url = next( + iter( + text_track["ttDownloadables"]["dfxp-ls-sdh"][ + "downloadUrls" + ].values() + ) + ) + else: + Profile = "webvtt-lssdh-ios8" + Url = next( + iter( + text_track["ttDownloadables"]["webvtt-lssdh-ios8"][ + "downloadUrls" + ].values() + ) + ) + + SubtitleList.append( + { + "Type": Type, + "rawTrackType": rawTrackType, + "Language": Language, + "isForced": isForced, + "langAbbrev": langAbbrev, + "Url": Url, + "Profile": Profile, + } + ) + + self.logger.debug("SubtitleList: {}".format(SubtitleList)) + SubtitleList = remove_dups(SubtitleList, keyword="Language") + + if self.args.sublang: + NewSubtitleList = list() + UserLanguagesLower = list(map(lambda x: x.lower(), self.args.sublang)) + for sub in SubtitleList: + if ( + sub["Language"].lower() in UserLanguagesLower + or sub["langAbbrev"].lower() in UserLanguagesLower + ): + NewSubtitleList.append(sub) + SubtitleList = remove_dups(NewSubtitleList, keyword="Language") + + #####################################(Forced Subtitles)############################### + + for text_track in manifest["timedtexttracks"]: + if text_track["isForcedNarrative"] and text_track["language"] is not None: + LanguageName, LanguageCode = self.ripprocess.countrycode( + text_track["language"] + ) + # LanguageName = text_track["languageDescription"] # no i will use pycountry instead bcs it's off dude. + ForcedList.append( + { + "Type": text_track["trackType"], + "rawTrackType": text_track["rawTrackType"] + .replace("closedcaptions", "CC ") + .replace("subtitles", "SUB"), + "Language": LanguageName, + "isForced": "YES", + "langAbbrev": LanguageCode, + "Url": next( + iter( + text_track["ttDownloadables"]["webvtt-lssdh-ios8"][ + "downloadUrls" + ].values() + ) + ), + "Profile": "webvtt-lssdh-ios8", + } + ) + + ForcedList = remove_dups(ForcedList, keyword="Language") + + if self.args.forcedlang: + NewForcedList = [] + UserLanguagesLower = list(map(lambda x: x.lower(), self.args.forcedlang)) + for sub in ForcedList: + if ( + sub["Language"].lower() in UserLanguagesLower + or sub["langAbbrev"].lower() in UserLanguagesLower + ): + NewForcedList.append(sub) + ForcedList = remove_dups(NewForcedList, keyword="Language") + else: + if not self.args.allforcedlang: + if len(OriginalAudioList) != 0: + OriginalLanguage = OriginalAudioList[0]["langAbbrev"] + ForcedList = [ + x for x in ForcedList if x["langAbbrev"] == OriginalLanguage + ] + + return AudioList, SubtitleList, ForcedList + + def LoadManifest(self): + + profiles, getHigh = self.LoadProfies() + + if self.args.hevc: + self.logger.info("Getting HEVC Manifest...") + elif self.args.hdr: + self.logger.info("Getting HDR-10 Manifest...") + elif self.args.video_high: + self.logger.info("Getting High Profile Manifest...") + else: + self.logger.info("Getting Main Profile Manifest...") + + resp = self.PyMSL(profiles=profiles) + + if not resp: + if self.args.hevc: + profiles, getHigh = self.LoadProfies(addHEVCDO=True) + self.logger.info('\nGetting HEVC DO Manifest...') + resp = self.PyMSL(profiles=profiles) + + if not resp: + self.logger.info("Failed getting Manifest") + exit(-1) + + VideoList, checkerinfo = self.ParseVideo(resp, getHigh) + AudioList, SubtitleList, ForcedList = self.ParseAudioSubs(resp) + + return VideoList, AudioList, SubtitleList, ForcedList, checkerinfo diff --git a/helpers/__init__.py b/helpers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/helpers/__pycache__/Muxer.cpython-36.pyc b/helpers/__pycache__/Muxer.cpython-36.pyc new file mode 100644 index 0000000..85a6a06 Binary files /dev/null and b/helpers/__pycache__/Muxer.cpython-36.pyc differ diff --git a/helpers/__pycache__/Muxer.cpython-39.pyc b/helpers/__pycache__/Muxer.cpython-39.pyc new file mode 100644 index 0000000..94e1ec7 Binary files /dev/null and b/helpers/__pycache__/Muxer.cpython-39.pyc differ diff --git a/helpers/__pycache__/__init__.cpython-36.pyc b/helpers/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..b94936e Binary files /dev/null and b/helpers/__pycache__/__init__.cpython-36.pyc differ diff --git a/helpers/__pycache__/__init__.cpython-39.pyc b/helpers/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..cad0320 Binary files /dev/null and b/helpers/__pycache__/__init__.cpython-39.pyc differ diff --git a/helpers/__pycache__/aria2.cpython-36.pyc b/helpers/__pycache__/aria2.cpython-36.pyc new file mode 100644 index 0000000..7699647 Binary files /dev/null and b/helpers/__pycache__/aria2.cpython-36.pyc differ diff --git a/helpers/__pycache__/aria2.cpython-39.pyc b/helpers/__pycache__/aria2.cpython-39.pyc new file mode 100644 index 0000000..d6e5da1 Binary files /dev/null and b/helpers/__pycache__/aria2.cpython-39.pyc differ diff --git a/helpers/__pycache__/dfxp_to_srt.cpython-36.pyc b/helpers/__pycache__/dfxp_to_srt.cpython-36.pyc new file mode 100644 index 0000000..b556834 Binary files /dev/null and b/helpers/__pycache__/dfxp_to_srt.cpython-36.pyc differ diff --git a/helpers/__pycache__/dfxp_to_srt.cpython-39.pyc b/helpers/__pycache__/dfxp_to_srt.cpython-39.pyc new file mode 100644 index 0000000..f7fa32f Binary files /dev/null and b/helpers/__pycache__/dfxp_to_srt.cpython-39.pyc differ diff --git a/helpers/__pycache__/keyloader.cpython-36.pyc b/helpers/__pycache__/keyloader.cpython-36.pyc new file mode 100644 index 0000000..5c2e9a5 Binary files /dev/null and b/helpers/__pycache__/keyloader.cpython-36.pyc differ diff --git a/helpers/__pycache__/keyloader.cpython-39.pyc b/helpers/__pycache__/keyloader.cpython-39.pyc new file mode 100644 index 0000000..9675e7b Binary files /dev/null and b/helpers/__pycache__/keyloader.cpython-39.pyc differ diff --git a/helpers/__pycache__/proxy_environ.cpython-36.pyc b/helpers/__pycache__/proxy_environ.cpython-36.pyc new file mode 100644 index 0000000..54e2150 Binary files /dev/null and b/helpers/__pycache__/proxy_environ.cpython-36.pyc differ diff --git a/helpers/__pycache__/proxy_environ.cpython-39.pyc b/helpers/__pycache__/proxy_environ.cpython-39.pyc new file mode 100644 index 0000000..c224e4d Binary files /dev/null and b/helpers/__pycache__/proxy_environ.cpython-39.pyc differ diff --git a/helpers/__pycache__/ripprocess.cpython-36.pyc b/helpers/__pycache__/ripprocess.cpython-36.pyc new file mode 100644 index 0000000..9878c94 Binary files /dev/null and b/helpers/__pycache__/ripprocess.cpython-36.pyc differ diff --git a/helpers/__pycache__/ripprocess.cpython-39.pyc b/helpers/__pycache__/ripprocess.cpython-39.pyc new file mode 100644 index 0000000..a79cd23 Binary files /dev/null and b/helpers/__pycache__/ripprocess.cpython-39.pyc differ diff --git a/helpers/__pycache__/vpn.cpython-36.pyc b/helpers/__pycache__/vpn.cpython-36.pyc new file mode 100644 index 0000000..b2babd4 Binary files /dev/null and b/helpers/__pycache__/vpn.cpython-36.pyc differ diff --git a/helpers/__pycache__/vpn.cpython-39.pyc b/helpers/__pycache__/vpn.cpython-39.pyc new file mode 100644 index 0000000..24b65ce Binary files /dev/null and b/helpers/__pycache__/vpn.cpython-39.pyc differ diff --git a/helpers/aria2.py b/helpers/aria2.py new file mode 100644 index 0000000..1e3d012 --- /dev/null +++ b/helpers/aria2.py @@ -0,0 +1,369 @@ +import os +import shutil +import subprocess +import sys +import re +import logging +from configs.config import tool +from helpers.ripprocess import ripprocess + + +class aria2Error(Exception): + pass + + +class aria2_moded: + def __init__(self, aria2_download_command): + self.logger = logging.getLogger(__name__) + self.aria2_download_command = aria2_download_command + self.env = self.aria2DisableProxies() + self.ripprocess = ripprocess() + self.tool = tool() + self.LOGA_PATH = self.tool.paths()["LOGA_PATH"] + self.bin = self.tool.bin() + self.aria2c_exe = self.bin["aria2c"] + self.last_message_printed = 0 + self.speed_radar = "0kbps" + + def aria2DisableProxies(self): + env = os.environ.copy() + + if env.get("http_proxy"): + del env["http_proxy"] + + if env.get("HTTP_PROXY"): + del env["HTTP_PROXY"] + + if env.get("https_proxy"): + del env["https_proxy"] + + if env.get("HTTPS_PROXY"): + del env["HTTPS_PROXY"] + + return env + + def read_stdout(self, line): + speed = re.search(r"DL:(.+?)ETA", line) + eta = re.search(r"ETA:(.+?)]", line) + connection = re.search(r"CN:(.+?)DL", line) + percent = re.search(r"\((.*?)\)", line) + size = re.search(r" (.*?)/(.*?)\(", line) + + if speed and eta and connection and percent and size: + percent = percent.group().strip().replace(")", "").replace("(", "") + size = size.group().strip().replace(")", "").replace("(", "") + complete, total = size.split("/") + connection = connection.group(1).strip() + eta = eta.group(1).strip() + speed = speed.group(1).strip() + self.speed_radar = speed + + stdout_data = { + "percent": str(percent), + "size": str(total), + "complete": str(complete), + "total": str(total), + "connection": str(connection), + "eta": str(eta), + "speed": str(speed), + } + + return stdout_data + + return None + + def if_errors(self, line): + if "exception" in str(line).lower() or "errorcode" in str(line).lower(): + return line + return None + + def delete_last_message_printed(self): + print(" " * len(str(self.last_message_printed)), end="\r") + + def get_status(self, stdout_data: dict): + return "Aria2c_Status; Size: {Size} | Speed: {Speed} | ETA: {ETA} | Progress: {Complete} -> {Total} ({Percent})".format( + Size=stdout_data.get("size"), + Speed=stdout_data.get("speed"), + ETA=stdout_data.get("eta"), + Complete=stdout_data.get("complete"), + Total=stdout_data.get("total"), + Percent=stdout_data.get("percent"), + ) + + def is_download_completed(self, line): + if "(ok):download completed." in str(line).lower(): + return "Download completed: (OK) ({}\\s)".format(self.speed_radar) + return None + + def start_download(self): + proc = subprocess.Popen( + self.aria2_download_command, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + bufsize=1, + universal_newlines=True, + env=self.env, + ) + + check_errors = True + for line in getattr(proc, "stdout"): + if check_errors: + if self.if_errors(line): + raise aria2Error("Aria2c Error {}".format(self.if_errors(line))) + check_errors = False + stdout_data = self.read_stdout(line) + if stdout_data: + status_text = self.get_status(stdout_data) + self.delete_last_message_printed() + print(status_text, end="\r", flush=True) + self.last_message_printed = status_text + else: + download_finished = self.is_download_completed(line) + if download_finished: + self.delete_last_message_printed() + print(download_finished, end="\r", flush=True) + self.last_message_printed = download_finished + self.logger.info("") + return + + +class aria2: + def __init__(self,): + self.env = self.aria2DisableProxies() + self.ripprocess = ripprocess() + self.tool = tool() + self.bin = self.tool.bin() + self.LOGA_PATH = self.tool.paths()["LOGA_PATH"] + self.config = self.tool.aria2c() + self.aria2c_exe = self.bin["aria2c"] + self.logger = logging.getLogger(__name__) + + def convert_args(self, arg): + if arg is True: + return "true" + elif arg is False: + return "false" + elif arg is None: + return "none" + else: + return str(arg) + + def append_commands(self, command, option_define, option): + if option == "skip": + return [] + + return ["{}{}".format(option_define, option)] + + def append_two_commands(self, command, cmd1, cmd2): + if cmd2 == "skip": + return [] + + return [cmd1] + [cmd2] + + def aria2Options( + self, + allow_overwrite=True, + file_allocation=None, + auto_file_renaming=False, + async_dns=False, + retry_wait=5, + summary_interval=0, + enable_color=False, + connection=16, + concurrent_downloads=16, + split=16, + header="skip", + user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36", + uri_selector="inorder", + console_log_level="skip", + download_result="hide", + quiet="false", + extra_commands=[], + ): + + options = [] + extra_commands + allow_overwrite = self.convert_args(allow_overwrite) + quiet = self.convert_args(quiet) + file_allocation = self.convert_args(file_allocation) + auto_file_renaming = self.convert_args(auto_file_renaming) + async_dns = self.convert_args(async_dns) + retry_wait = self.convert_args(retry_wait) + enable_color = self.convert_args(enable_color) + connection = self.convert_args(connection) + concurrent_downloads = self.convert_args(concurrent_downloads) + split = self.convert_args(split) + header = self.convert_args(header) + uri_selector = self.convert_args(uri_selector) + console_log_level = self.convert_args(console_log_level) + download_result = self.convert_args(download_result) + + ############################################################################## + + options += self.append_commands(options, "--allow-overwrite=", allow_overwrite) + options += self.append_commands(options, "--quiet=", quiet) + options += self.append_commands(options, "--file-allocation=", file_allocation) + options += self.append_commands( + options, "--auto-file-renaming=", auto_file_renaming + ) + options += self.append_commands(options, "--async-dns=", async_dns) + options += self.append_commands(options, "--retry-wait=", retry_wait) + options += self.append_commands(options, "--enable-color=", enable_color) + + options += self.append_commands( + options, "--max-connection-per-server=", connection + ) + + options += self.append_commands( + options, "--max-concurrent-downloads=", concurrent_downloads + ) + options += self.append_commands(options, "--split=", split) + options += self.append_commands(options, "--header=", header) + options += self.append_commands(options, "--uri-selector=", uri_selector) + options += self.append_commands( + options, "--console-log-level=", console_log_level + ) + options += self.append_commands(options, "--download-result=", download_result) + + return options + + def aria2DisableProxies(self): + env = os.environ.copy() + + if env.get("http_proxy"): + del env["http_proxy"] + + if env.get("HTTP_PROXY"): + del env["HTTP_PROXY"] + + if env.get("https_proxy"): + del env["https_proxy"] + + if env.get("HTTPS_PROXY"): + del env["HTTPS_PROXY"] + + return env + + def aria2DownloadUrl(self, url, output, options, debug=False, moded=False): + self.debug = debug + aria2_download_command = [self.aria2c_exe] + options + + if self.config["enable_logging"]: + LogFile = os.path.join(self.LOGA_PATH, output.replace(".mp4", ".log")) + if os.path.isfile(LogFile): + os.remove(LogFile) + aria2_download_command.append("--log={}".format(LogFile)) + + if not url.startswith("http"): + raise aria2Error("Url does not start with http/https: {}".format(url)) + + aria2_download_command.append(url) + aria2_download_command += self.append_two_commands( + aria2_download_command, "-o", output + ) + + self.aria2Debug("Sending Commands to aria2c...") + self.aria2Debug(aria2_download_command) + self.logger.debug("aria2_download_command: {}".format(aria2_download_command)) + + if moded: + aria2_moded_download = aria2_moded(aria2_download_command) + aria2_moded_download.start_download() + else: + try: + aria = subprocess.call(aria2_download_command, env=self.env) + except FileNotFoundError: + self.logger.info("UNABLE TO FIND {}".format(self.aria2c_exe)) + exit(-1) + if aria != 0: + raise aria2Error("Aria2c exited with code {}".format(aria)) + + return + + def aria2DownloadDash( + self, segments, output, options, debug=False, moded=False, fixbytes=False + ): + self.debug = debug + aria2_download_command = [self.aria2c_exe] + options + + if self.config["enable_logging"]: + LogFile = os.path.join(self.LOGA_PATH, output.replace(".mp4", ".log")) + if os.path.isfile(LogFile): + os.remove(LogFile) + aria2_download_command.append("--log={}".format(LogFile)) + + if not isinstance(segments, list) or segments == []: + raise aria2Error("invalid list of urls: {}".format(segments)) + + if moded: + raise aria2Error("moded version not supported for dash downloads atm...") + + txt = output.replace(".mp4", ".txt") + folder = output.replace(".mp4", "") + segments = list(dict.fromkeys(segments)) + + if os.path.exists(folder): + shutil.rmtree(folder) + if not os.path.exists(folder): + os.makedirs(folder) + + segments_location = [] + + opened_txt = open(txt, "w+") + for num, url in enumerate(segments, start=1): + segment_name = str(num).zfill(5) + ".mp4" + segments_location.append(os.path.join(*[os.getcwd(), folder, segment_name])) + opened_txt.write(url + f"\n out={segment_name}" + f"\n dir={folder}" + "\n") + opened_txt.close() + + aria2_download_command += self.append_commands( + aria2_download_command, "--input-file=", txt + ) + + try: + aria = subprocess.call(aria2_download_command, env=self.env) + except FileNotFoundError: + self.logger.info("UNABLE TO FIND {}".format(self.aria2c_exe)) + exit(-1) + if aria != 0: + raise aria2Error("Aria2c exited with code {}".format(aria)) + + self.logger.info("\nJoining files...") + openfile = open(output, "wb") + total = int(len(segments_location)) + for current, fragment in enumerate(segments_location): + if os.path.isfile(fragment): + if fixbytes: + with open(fragment, "rb") as f: + wvdll = f.read() + if ( + re.search( + b"tfhd\x00\x02\x00\x1a\x00\x00\x00\x01\x00\x00\x00\x02", + wvdll, + re.MULTILINE | re.DOTALL, + ) + is not None + ): + fw = open(fragment, "wb") + m = re.search( + b"tfhd\x00\x02\x00\x1a\x00\x00\x00\x01\x00\x00\x00", + wvdll, + re.MULTILINE | re.DOTALL, + ) + segment_fixed = ( + wvdll[: m.end()] + b"\x01" + wvdll[m.end() + 1 :] + ) + fw.write(segment_fixed) + fw.close() + shutil.copyfileobj(open(fragment, "rb"), openfile) + os.remove(fragment) + self.ripprocess.updt(total, current + 1) + openfile.close() + + if os.path.isfile(txt): + os.remove(txt) + if os.path.exists(folder): + shutil.rmtree(folder) + + def aria2Debug(self, txt): + if self.debug: + self.logger.info(txt) diff --git a/helpers/dfxp_to_srt.py b/helpers/dfxp_to_srt.py new file mode 100644 index 0000000..12486e5 --- /dev/null +++ b/helpers/dfxp_to_srt.py @@ -0,0 +1,116 @@ +import codecs +import math +import os +import re + + +class dfxp_to_srt: + def __init__(self): + self.__replace__ = "empty_line" + + def leading_zeros(self, value, digits=2): + value = "000000" + str(value) + return value[-digits:] + + def convert_time(self, raw_time): + if int(raw_time) == 0: + return "{}:{}:{},{}".format(0, 0, 0, 0) + + ms = "000" + if len(raw_time) > 4: + ms = self.leading_zeros(int(raw_time[:-4]) % 1000, 3) + time_in_seconds = int(raw_time[:-7]) if len(raw_time) > 7 else 0 + second = self.leading_zeros(time_in_seconds % 60) + minute = self.leading_zeros(int(math.floor(time_in_seconds / 60)) % 60) + hour = self.leading_zeros(int(math.floor(time_in_seconds / 3600))) + return "{}:{}:{},{}".format(hour, minute, second, ms) + + def xml_id_display_align_before(self, text): + + align_before_re = re.compile( + u'' + ) + has_align_before = re.search(align_before_re, text) + if has_align_before: + return has_align_before.group(1) + return u"" + + def xml_to_srt(self, text): + def append_subs(start, end, prev_content, format_time): + subs.append( + { + "start_time": self.convert_time(start) if format_time else start, + "end_time": self.convert_time(end) if format_time else end, + "content": u"\n".join(prev_content), + } + ) + + display_align_before = self.xml_id_display_align_before(text) + begin_re = re.compile(u"\s*

(.*)

') + + # span tags are only used for italics, so we'll get rid of them + # and replace them by and , which is the standard for .srt files + span_start_re = re.compile(u'()+') + span_end_re = re.compile(u"()+") + br_re = re.compile(u"()+") + fmt_t = True + for s in sub_lines: + span_start_tags = re.search(span_start_re, s) + if span_start_tags: + s = u"".join(s.split(span_start_tags.group())) + string_region_re = ( + r'(.*)

' + ) + s = re.sub(string_region_re, r"{\\an8}\2

", s) + content = re.search(content_re, s).group(1) + + br_tags = re.search(br_re, content) + if br_tags: + content = u"\n".join(content.split(br_tags.group())) + + span_end_tags = re.search(span_end_re, content) + if span_end_tags: + content = u"
".join(content.split(span_end_tags.group())) + + prev_start = prev_time["start"] + start = re.search(start_re, s).group(1) + end = re.search(end_re, s).group(1) + if len(start.split(":")) > 1: + fmt_t = False + start = start.replace(".", ",") + end = end.replace(".", ",") + if (prev_start == start and prev_time["end"] == end) or not prev_start: + # Fix for multiple lines starting at the same time + prev_time = {"start": start, "end": end} + prev_content.append(content) + continue + append_subs(prev_time["start"], prev_time["end"], prev_content, fmt_t) + prev_time = {"start": start, "end": end} + prev_content = [content] + append_subs(start, end, prev_content, fmt_t) + + lines = ( + u"{}\n{} --> {}\n{}\n".format( + s + 1, subs[s]["start_time"], subs[s]["end_time"], subs[s]["content"] + ) + for s in range(len(subs)) + ) + return u"\n".join(lines) + + def convert(self, Input, Output): + + with codecs.open(Input, "rb", "utf-8") as f: + text = f.read() + + with codecs.open(Output, "wb", "utf-8") as f: + f.write(self.xml_to_srt(text)) + + return diff --git a/helpers/keyloader.py b/helpers/keyloader.py new file mode 100644 index 0000000..de1b42b --- /dev/null +++ b/helpers/keyloader.py @@ -0,0 +1,76 @@ +import os, json, sys +from helpers.ripprocess import ripprocess + + +class keysaver: + def __init__(self, **kwargs): + self.keys_file = kwargs.get("keys_file", None) + self.stored = self.get_stored() + + def read_(self): + with open(self.keys_file, "r") as fr: + return json.load(fr) + + def write_(self, data): + with open(self.keys_file, "w") as fr: + fr.write(json.dumps(data, indent=4)) + + def get_stored(self): + stored = [] + if os.path.isfile(self.keys_file): + return self.read_() + return stored + + def formatting(self, keys_list, pssh, name): + return [ + { + "NAME": name, + "PSSH": pssh, + "ID": idx, + "KID": key.split(":")[0], + "KEY": key.split(":")[1], + } + for idx, key in enumerate(keys_list, start=1) + ] + + def dump_keys(self, keys, pssh=None, name=None): + old_keys = list(self.stored) + new_keys = list(self.formatting(keys, pssh, name)) + self.write_(old_keys + new_keys) + self.stored = self.get_stored() # to update stored keys + + return new_keys + + def get_key_by_pssh(self, pssh): + keys = [] + added = set() + for key in self.get_stored(): # read file again... + if key["PSSH"]: + if not key["KEY"] in added and pssh in key["PSSH"]: + keys.append(key) + added.add(key["KEY"]) + + return keys + + def get_key_by_kid(self, kid): + keys = [] + added = set() + for key in self.get_stored(): # read file again... + if not key["KEY"] in added and key["KID"] == kid: + keys.append(key) + added.add(key["KEY"]) + + return keys + + def generate_kid(self, encrypted_file): + return ripprocess().getKeyId(encrypted_file) + + def set_keys(self, keys, no_kid=False): + command_keys = [] + for key in keys: + command_keys.append("--key") + command_keys.append( + "{}:{}".format(key["ID"] if no_kid else key["KID"], key["KEY"]) + ) + + return command_keys diff --git a/helpers/proxy_environ.py b/helpers/proxy_environ.py new file mode 100644 index 0000000..d1f026d --- /dev/null +++ b/helpers/proxy_environ.py @@ -0,0 +1,112 @@ +import os +import requests +import sys, json +import random +from configs.config import tool +from helpers.vpn import connect +import logging + + +class hold_proxy(object): + def __init__(self): + self.proxy = os.environ.get("http_proxy") + self.logger = logging.getLogger(__name__) + + def disable(self): + os.environ["http_proxy"] = "" + os.environ["HTTP_PROXY"] = "" + os.environ["https_proxy"] = "" + os.environ["HTTPS_PROXY"] = "" + + def enable(self): + if self.proxy: + os.environ["http_proxy"] = self.proxy + os.environ["HTTP_PROXY"] = self.proxy + os.environ["https_proxy"] = self.proxy + os.environ["HTTPS_PROXY"] = self.proxy + + +class proxy_env(object): + def __init__(self, args): + self.logger = logging.getLogger(__name__) + self.args = args + self.vpn = tool().vpn() + + def Load(self): + proxies = None + proxy = {} + aria2c_proxy = [] + + if self.vpn["proxies"]: + proxies = self.vpn["proxies"] + + if not self.vpn["proxies"]: + if self.args.privtvpn: + self.logger.info("Proxy Status: Activated-PrivateVpn") + proxy.update({"port": self.vpn["private"]["port"]}) + proxy.update({"user": self.vpn["private"]["email"]}) + proxy.update({"pass": self.vpn["private"]["passwd"]}) + + if "pvdata.host" in self.args.privtvpn: + proxy.update({"host": self.args.privtvpn}) + else: + proxy.update( + {"host": connect(code=self.args.privtvpn).privateVPN()} + ) + + proxies = self.vpn["private"]["http"].format( + email=proxy["user"], + passwd=proxy["pass"], + ip=proxy["host"], + port=proxy["port"], + ) + else: + if self.args.nordvpn: + self.logger.info("Proxy Status: Activated-NordVpn") + proxy.update({"port": self.vpn["nordvpn"]["port"]}) + proxy.update({"user": self.vpn["nordvpn"]["email"]}) + proxy.update({"pass": self.vpn["nordvpn"]["passwd"]}) + + if "nordvpn.com" in self.args.nordvpn: + proxy.update({"host": self.args.nordvpn}) + else: + proxy.update( + {"host": connect(code=self.args.nordvpn).nordVPN()} + ) + + proxies = self.vpn["nordvpn"]["http"].format( + email=proxy["user"], + passwd=proxy["pass"], + ip=proxy["host"], + port=proxy["port"], + ) + else: + self.logger.info("Proxy Status: Off") + + if proxy.get("host"): + aria2c_proxy.append( + "--https-proxy={}:{}".format(proxy.get("host"), proxy.get("port")) + ) + if proxy.get("user"): + aria2c_proxy.append("--https-proxy-user={}".format(proxy.get("user"))) + if proxy.get("pass"): + aria2c_proxy.append("--https-proxy-passwd={}".format(proxy.get("pass"))) + + if proxies: + os.environ["http_proxy"] = proxies + os.environ["HTTP_PROXY"] = proxies + os.environ["https_proxy"] = proxies + os.environ["HTTPS_PROXY"] = proxies + + ip = None + + try: + self.logger.info("Getting IP...") + r = requests.get("https://ipinfo.io/json", timeout=5) + data = r.json() + ip = f'{data["ip"]} ({data["country"]})' + except Exception as e: + self.logger.info(f"({e.__class__.__name__}: {e})") + sys.exit(1) + + return aria2c_proxy, ip diff --git a/helpers/pssh_generator.py b/helpers/pssh_generator.py new file mode 100644 index 0000000..c21675c --- /dev/null +++ b/helpers/pssh_generator.py @@ -0,0 +1,132 @@ +from utils.modules.pymp4.parser import Box +from io import BytesIO +import base64 +import requests +import uuid +import binascii +import subprocess +import logging +import json + + +class pssh_generator(object): + def __init__(self, init, **kwargs): + self.init = init + self.logger = logging.getLogger(__name__) + self.proxies = kwargs.get("proxies", None) + self.mp4dumpexe = kwargs.get("mp4dumpexe", None) + + def from_kid(self): + array_of_bytes = bytearray(b"\x00\x00\x002pssh\x00\x00\x00\x00") + array_of_bytes.extend(bytes.fromhex("edef8ba979d64acea3c827dcd51d21ed")) + array_of_bytes.extend(b"\x00\x00\x00\x12\x12\x10") + array_of_bytes.extend(bytes.fromhex(self.init.replace("-", ""))) + pssh = base64.b64encode(bytes.fromhex(array_of_bytes.hex())) + return pssh.decode() + + def Get_PSSH(self): + WV_SYSTEM_ID = "[ed ef 8b a9 79 d6 4a ce a3 c8 27 dc d5 1d 21 ed]" + pssh = None + data = subprocess.check_output( + [self.mp4dumpexe, "--format", "json", "--verbosity", "1", self.init] + ) + data = json.loads(data) + for atom in data: + if atom["name"] == "moov": + for child in atom["children"]: + if child["name"] == "pssh": + if child["system_id"] == WV_SYSTEM_ID: + pssh = child["data"][1:-1].replace(" ", "") + pssh = binascii.unhexlify(pssh) + if pssh.startswith(b"\x08\x01"): + pssh = pssh[0:] + pssh = base64.b64encode(pssh).decode("utf-8") + return pssh + + if not pssh: + self.logger.error("Error while generate pssh from file.") + return pssh + + def get_moov_pssh(self, moov): + while True: + x = Box.parse_stream(moov) + if x.type == b"moov": + for y in x.children: + if y.type == b"pssh" and y.system_ID == uuid.UUID( + "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" + ): + data = base64.b64encode(y.init_data) + return data + + def build_init_segment_mp4(self, bytes_): + moov = BytesIO(bytes_) + data = self.get_moov_pssh(moov) + pssh = data.decode("utf-8") + + return pssh + + def getInitWithRange2(self, headers): + + initbytes = requests.get(url=self.init, proxies=self.proxies, headers=headers,) + + try: + pssh = self.build_init_segment_mp4(initbytes.content) + return pssh + except Exception as e: + self.logger.info("Error: " + str(e)) + + return None + + def getInitWithRange(self, start: int, end: int): + + initbytes = requests.get( + url=self.init, + proxies=self.proxies, + headers={"Range": "bytes={}-{}".format(start, end)}, + ) + + try: + pssh = self.build_init_segment_mp4(initbytes.content) + return pssh + except Exception as e: + self.logger.info("Error: " + str(e)) + + return None + + def loads(self): + req = requests.get(url=self.init, proxies=self.proxies) + + initbytes = req.content + + try: + pssh = self.build_init_segment_mp4(initbytes) + return pssh + except Exception as e: + self.logger.error("Error: " + str(e)) + + return None + + def load(self): + + with open(self.init, "rb") as f: + initbytes = f.read() + + try: + pssh = self.build_init_segment_mp4(initbytes) + return pssh + except Exception as e: + self.logger.error("Error: " + str(e)) + + return None + + def from_str(self): + + initbytes = self.init + + try: + pssh = self.build_init_segment_mp4(initbytes) + return pssh + except Exception as e: + self.logger.info("Error: " + str(e)) + + return None diff --git a/helpers/ripprocess.py b/helpers/ripprocess.py new file mode 100644 index 0000000..8439c0f --- /dev/null +++ b/helpers/ripprocess.py @@ -0,0 +1,819 @@ +import ffmpy, json, os, sys, unidecode, requests, subprocess, time, pycountry, html, tqdm, re, glob, base64, binascii +from titlecase import titlecase +from configs.config import tool +from helpers.proxy_environ import hold_proxy +import tldextract +from collections import namedtuple, Sequence +from natsort import natsorted +import logging +import unicodedata, string + + +class EpisodesNumbersHandler: + def __init__(self): + return + + def numberRange(self, start: int, end: int): + if list(range(start, end + 1)) != []: + return list(range(start, end + 1)) + + if list(range(end, start + 1)) != []: + return list(range(end, start + 1)) + + return [start] + + def ListNumber(self, Number: str): + if Number.isdigit(): + return [int(Number)] + + if Number.strip() == "~" or Number.strip() == "": + return self.numberRange(1, 999) + + if "-" in Number: + start, end = Number.split("-") + if start.strip() == "" or end.strip() == "": + raise ValueError("wrong Number: {}".format(Number)) + return self.numberRange(int(start), int(end)) + + if "~" in Number: + start, _ = Number.split("~") + if start.strip() == "": + raise ValueError("wrong Number: {}".format(Number)) + return self.numberRange(int(start), 999) + + return + + def sortNumbers(self, Numbers): + SortedNumbers = [] + for Number in Numbers.split(","): + SortedNumbers += self.ListNumber(Number.strip()) + + return natsorted(list(set(SortedNumbers))) + + +class ripprocess(object): + def __init__(self): + self.tool = tool() + self.logger = logging.getLogger(__name__) + self.bin = self.tool.bin() + + def sort_list(self, media_list, keyword1=None, keyword2=None): + if keyword1: + if keyword2: + return sorted( + media_list, key=lambda k: (int(k[keyword1]), int(k[keyword2])) + ) + else: + sorted(media_list, key=lambda k: int(k[keyword1])) + + return media_list + + def yt2json(self, url, proxies=None): + jsonfile = "info.info.json" + + yt_cmd = [ + self.bin["youtube"], + "--skip-download", + "--write-info-json", + "--quiet", + "--no-warnings", + "-o", + "info", + url, + ] + + if proxies: + yt_cmd += ["--proxy", proxies.get("https")] + + subprocess.call(yt_cmd) + + while not os.path.isfile(jsonfile): + time.sleep(0.2) + with open(jsonfile) as js: + data = json.load(js) + if os.path.isfile(jsonfile): + os.remove(jsonfile) + + return data + + def getKeyId(self, mp4_file): + data = subprocess.check_output( + [self.bin["mp4dump"], "--format", "json", "--verbosity", "1", mp4_file] + ) + try: + return re.sub( + " ", + "", + re.compile(r"default_KID.*\[(.*)\]").search(data.decode()).group(1), + ) + except AttributeError: + return None + + def flatten(self, l): + return list(self.flatten_g(l)) + + def flatten_g(self, l): + basestring = (str, bytes) + for el in l: + if isinstance(el, Sequence) and not isinstance(el, basestring): + for sub in self.flatten_g(el): + yield sub + else: + yield el + + def removeExtentsion(self, string: str): + if "." in string: + return ".".join(string.split(".")[:-1]) + else: + raise ValueError("string has no extentsion: {}".format(string)) + + def replaceExtentsion(self, string: str, ext: str): + if "." in string: + return ".".join(string.split(".")[:-1]) + f".{ext}" + else: + raise ValueError("string has no extentsion: {}".format(string)) + + def domain(self, url): + return "{0.domain}.{0.suffix}".format(tldextract.extract(url)) + + def remove_dups(self, List, keyword=""): + Added_ = set() + Proper_ = [] + for L in List: + if L[keyword] not in Added_: + Proper_.append(L) + Added_.add(L[keyword]) + + return Proper_ + + def find_str(self, s, char): + index = 0 + + if char in s: + c = char[0] + for ch in s: + if ch == c: + if s[index : index + len(char)] == char: + return index + + index += 1 + + return -1 + + def updt(self, total, progress): + barLength, status = 80, "" + progress = float(progress) / float(total) + if progress >= 1.0: + progress, status = 1, "\r\n" + block = int(round(barLength * progress)) + text = "\rProgress: {} | {:.0f}% {}".format( + "█" * block + "" * (barLength - block), round(progress * 100, 0), status, + ) + sys.stdout.write(text) + sys.stdout.flush() + + def Get_PSSH(self, mp4_file): + WV_SYSTEM_ID = "[ed ef 8b a9 79 d6 4a ce a3 c8 27 dc d5 1d 21 ed]" + pssh = None + data = subprocess.check_output( + [self.bin["mp4dump"], "--format", "json", "--verbosity", "1", mp4_file] + ) + data = json.loads(data) + for atom in data: + if atom["name"] == "moov": + for child in atom["children"]: + if child["name"] == "pssh": + if child["system_id"] == WV_SYSTEM_ID: + pssh = child["data"][1:-1].replace(" ", "") + pssh = binascii.unhexlify(pssh) + if pssh.startswith(b"\x08\x01"): + pssh = pssh[0:] + pssh = base64.b64encode(pssh).decode("utf-8") + return pssh + + return None + + def SubtitleEdit( + self, contain=None, file=None, removeSDH=False, silent=True, extra_commands=[] + ): + if file: + subtitle_command = [ + self.bin["SubtitleEdit"], + "/convert", + file, + "srt", + "/overwrite", + "/multiplereplace:.", + "/MergeShortLines", + "/FixCommonErrors", + ] + + subtitle_command += extra_commands + + if removeSDH: + subtitle_command.append("/RemoveTextForHI") + + subprocess.call( + subtitle_command, stdout=open(os.devnull, "wb") + ) if silent else subprocess.call(subtitle_command) + + if contain: + subtitle_command = [ + self.bin["SubtitleEdit"], + "/convert", + "{}*.srt".format(contain), + "srt", + "/overwrite", + "/multiplereplace:.", + "/MergeShortLines", + "/FixCommonErrors", + ] + + subtitle_command += extra_commands + + if removeSDH: + subtitle_command.append("/removetextforhi") + + subprocess.call( + subtitle_command, stdout=open(os.devnull, "wb") + ) if silent else subprocess.call(subtitle_command) + + return + + def parseCookieFile(self, cookiesfile): + cookies = {} + with open(cookiesfile, "r") as fp: + for line in fp: + if not re.match(r"^\#", line): + lineFields = line.strip().split("\t") + try: + cookies[lineFields[5]] = lineFields[6] + except Exception: + pass + return cookies + + def ReplaceCodeLanguages(self, X): + X = X.lower() + X = ( + X.replace("_subtitle_dialog_0", "") + .replace("_narrative_dialog_0", "") + .replace("_caption_dialog_0", "") + .replace("_dialog_0", "") + .replace("_descriptive_0", "_descriptive") + .replace("_descriptive", "_descriptive") + .replace("_sdh", "-sdh") + .replace("es-es", "es") + .replace("en-es", "es") + .replace("kn-in", "kn") + .replace("gu-in", "gu") + .replace("ja-jp", "ja") + .replace("mni-in", "mni") + .replace("si-in", "si") + .replace("as-in", "as") + .replace("ml-in", "ml") + .replace("sv-se", "sv") + .replace("hy-hy", "hy") + .replace("sv-sv", "sv") + .replace("da-da", "da") + .replace("fi-fi", "fi") + .replace("nb-nb", "nb") + .replace("is-is", "is") + .replace("uk-uk", "uk") + .replace("hu-hu", "hu") + .replace("bg-bg", "bg") + .replace("hr-hr", "hr") + .replace("lt-lt", "lt") + .replace("et-et", "et") + .replace("el-el", "el") + .replace("he-he", "he") + .replace("ar-ar", "ar") + .replace("fa-fa", "fa") + .replace("ro-ro", "ro") + .replace("sr-sr", "sr") + .replace("cs-cs", "cs") + .replace("sk-sk", "sk") + .replace("mk-mk", "mk") + .replace("hi-hi", "hi") + .replace("bn-bn", "bn") + .replace("ur-ur", "ur") + .replace("pa-pa", "pa") + .replace("ta-ta", "ta") + .replace("te-te", "te") + .replace("mr-mr", "mr") + .replace("kn-kn", "kn") + .replace("gu-gu", "gu") + .replace("ml-ml", "ml") + .replace("si-si", "si") + .replace("as-as", "as") + .replace("mni-mni", "mni") + .replace("tl-tl", "tl") + .replace("id-id", "id") + .replace("ms-ms", "ms") + .replace("vi-vi", "vi") + .replace("th-th", "th") + .replace("km-km", "km") + .replace("ko-ko", "ko") + .replace("zh-zh", "zh") + .replace("ja-ja", "ja") + .replace("ru-ru", "ru") + .replace("tr-tr", "tr") + .replace("it-it", "it") + .replace("es-mx", "es-la") + .replace("ar-sa", "ar") + .replace("zh-cn", "zh") + .replace("nl-nl", "nl") + .replace("pl-pl", "pl") + .replace("pt-pt", "pt") + .replace("hi-in", "hi") + .replace("mr-in", "mr") + .replace("bn-in", "bn") + .replace("te-in", "te") + .replace("cmn-hans", "zh-hans") + .replace("cmn-hant", "zh-hant") + .replace("ko-kr", "ko") + .replace("en-au", "en") + .replace("es-419", "es-la") + .replace("es-us", "es-la") + .replace("en-us", "en") + .replace("en-gb", "en") + .replace("fr-fr", "fr") + .replace("de-de", "de") + .replace("las-419", "es-la") + .replace("ar-ae", "ar") + .replace("da-dk", "da") + .replace("yue-hant", "yue") + .replace("bn-in", "bn") + .replace("ur-in", "ur") + .replace("ta-in", "ta") + .replace("sl-si", "sl") + .replace("cs-cz", "cs") + .replace("hi-jp", "hi") + .replace("-001", "") + .replace("en-US", "en") + .replace("deu", "de") + .replace("eng", "en") + .replace("ca-es", "cat") + .replace("fil-ph", "fil") + .replace("en-ca", "en") + .replace("eu-es", "eu") + .replace("ar-eg", "ar") + .replace("he-il", "he") + .replace("el-gr", "he") + .replace("nb-no", "nb") + .replace("es-ar", "es-la") + .replace("en-ph", "en") + .replace("sq-al", "sq") + .replace("bs-ba", "bs") + ) + + return X + + def countrycode(self, code, site_domain="None"): + languageCodes = { + "zh-Hans": "zhoS", + "zh-Hant": "zhoT", + "pt-BR": "brPor", + "es-ES": "euSpa", + "en-GB": "enGB", + "en-PH": "enPH", + "nl-BE": "nlBE", + "fil": "enPH", + "yue": "zhoS", + "fr-CA": "caFra", + } + + if code == "cmn-Hans": + return "Mandarin Chinese (Simplified)", "zh-Hans" + elif code == "cmn-Hant": + return "Mandarin Chinese (Traditional)", "zh-Hant" + elif code == "es-419": + return "Spanish", "spa" + elif code == "es-ES": + return "European Spanish", "euSpa" + elif code == "pt-BR": + return "Brazilian Portuguese", "brPor" + elif code == "pt-PT": + return "Portuguese", "por" + elif code == "fr-CA": + return "French Canadian", "caFra" + elif code == "fr-FR": + return "French", "fra" + elif code == "iw": + return "Modern Hebrew", "heb" + elif code == "es" and site_domain == "google": + return "European Spanish", "euSpa" + + lang_code = code[: code.index("-")] if "-" in code else code + lang = pycountry.languages.get(alpha_2=lang_code) + if lang is None: + lang = pycountry.languages.get(alpha_3=lang_code) + + try: + languagecode = languageCodes[code] + except KeyError: + languagecode = lang.alpha_3 + + return lang.name, languagecode + + def tqdm_downloader(self, url, file_name, proxies=None): + # self.logger.info(file_name) + r = requests.get(url, stream=True) + file_size = int(r.headers["Content-Length"]) + chunk = 1 + chunk_size = 1024 + num_bars = int(file_size / chunk_size) + + with open(file_name, "wb") as fp: + for chunk in tqdm.tqdm( + r.iter_content(chunk_size=chunk_size), + total=num_bars, + unit="KB", + desc=file_name, + leave=True, # progressbar stays + ): + fp.write(chunk) + + return + + def silent_aria2c_download(self, url, file_name, disable_proxy=True): + holder = hold_proxy() + + if disable_proxy: + holder.disable() + + commands = [ + self.bin["aria2c"], + url, + '--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"', + "--allow-overwrite=true", + "--auto-file-renaming=false", + "--retry-wait=5", + "-x16", + "-j16", + "-s16", + "-o", + file_name, + ] + + try: + aria = subprocess.call(commands, stdout=open(os.devnull, "wb"),) + except FileNotFoundError: + self.logger.info("UNABLE TO FIND {}".format("aria2c.exe")) + exit(-1) + if aria != 0: + raise ValueError("Aria2c exited with code {}".format(aria)) + + if disable_proxy: + holder.enable() + + def aria2c_download(self, commands, extra_commands, disable_proxy=False): + LogFile = self.bin["aria2c"].replace("exe", "log") + + if os.path.isfile(LogFile): + os.remove(LogFile) + + aria2_commands = [] + aria2_commands.append(self.bin["aria2c"]) + aria2_commands.append("--log={}".format(LogFile)) + aria2_commands += commands + extra_commands + + holder = hold_proxy() + + if disable_proxy: + holder.disable() + + try: + aria = subprocess.call(aria2_commands) + except FileNotFoundError: + self.logger.info("UNABLE TO FIND {}".format("aria2c.exe")) + exit(-1) + if aria != 0: + self.logger.info("Aria2c exited with code {}".format(aria)) + exit(-1) + + if disable_proxy: + holder.enable() + + self.logger.info() + + def isduplelist(self, a, b): + return set(a) == set(b) and len(a) == len(b) + + def readfile(self, file, lines=False): + read = "" + if os.path.isfile(file): + with open(file, "r") as f: + if lines: + read = f.readlines() + return read + read = f.read() + else: + self.logger.info("File: %s, is not found" % file) + return None + + return read + + def strip(self, inputint, left=True, right=False): + if left: + return str(inputint.lstrip("0")) + if right: + return str(inputint.rstrip("0")) + + return + + def CleanMyFileNamePlease(self, filename): + # edit here... + filename = filename.replace("666", "666") + + ################################################################################################################################ + # dont edit here... + filename = ( + filename.replace(" ", ".") + .replace("'", "") + .replace(",", "") + .replace("-", "") + .replace("-.", ".") + .replace(".-.", ".") + ) + filename = re.sub(" +", ".", filename) + for i in range(10): + filename = re.sub(r"(\.\.)", ".", filename) + + return filename + + def RemoveExtraWords(self, name): + if re.search("[eE]pisode [0-9]+", name): + name = name.replace((re.search("[eE]pisode [0-9]+", name)).group(0), "") + + if re.search(r"(\(.+?)\)", name): + name = name.replace(re.search(r"(\(.+?)\)", name).group(), "") + + name = re.sub(" +", " ", name) + name = name.strip() + name = ( + name.replace(" : ", " - ") + .replace(": ", " - ") + .replace(":", " - ") + .replace("&", "and") + .replace("ó", "o") + .replace("*", "x") + ) + + return name + + def DecodeString(self, text): + for encoding in ("utf-8-sig", "utf-8", "utf-16"): + try: + return text.decode(encoding) + except UnicodeDecodeError: + continue + + return text.decode("latin-1") + + def EncodeString(self, text): + for encoding in ("utf-8-sig", "utf-8", "utf-16"): + try: + return text.encode(encoding) + except UnicodeDecodeError: + continue + + return text.encode("latin-1") + + def clean_text(self, text): + whitelist = ( + "-_.() %s%s" % (string.ascii_letters, string.digits) + "',&#$%@`~!^&+=[]{}" + ) + + cleaned_text = ( + unicodedata.normalize("NFKD", text).encode("ASCII", "ignore").decode() + ) + + return "".join(c for c in cleaned_text if c in whitelist) + + def RemoveCharcters(self, text): + text = self.EncodeString(text) + text = self.DecodeString(text) + text = self.RemoveExtraWords(text) + text = self.clean_text(text) + text = unidecode.unidecode(titlecase(text)) + + return text + + def do_clean(self, contain, exclude=[], added=[]): + """contain= string name in the file/files you want to delete. + exclude= the files that has a specified extension you do not want to delete. send by list like ['.sfv', '.whatever'] + added= another extensions not in the default extension. send by list like ['.sfv', '.whatever']""" + + error = [] + extensions = [ + ".mp4", + ".h265", + ".h264", + ".eac3", + ".m4a", + ".ac3", + ".srt", + ".vtt", + ".txt", + ".aac", + ".m3u8", + ".mpd", + ] + + extensions += added + + erased_files = [] + + for ext in extensions: + if ext not in exclude: + erased_files += glob.glob(contain + f"*{ext}") + + if not erased_files == []: + for files in erased_files: + try: + os.remove(files) + except Exception: + error.append(files) + + if not error == []: + self.logger.info( + f"some files not deleted with extensions: " + + ", ".join(str(x) for x in error) + + "." + ) + + return + + def mediainfo_(self, file): + mediainfo_output = subprocess.Popen( + [self.bin["MediaInfo"], "--Output=JSON", "-f", file], + stdout=subprocess.PIPE, + ) + mediainfo_json = json.load(mediainfo_output.stdout) + return mediainfo_json + + def DemuxAudio(self, inputName, replace_str): + if os.path.isfile(inputName): + self.logger.info("\nDemuxing audio...") + mediainfo = self.mediainfo_(inputName) + for m in mediainfo["media"]["track"]: + if m["@type"] == "Audio": + codec_name = m["Format"] + + ext = ".ac3" + if codec_name == "AAC": + ext = ".m4a" + else: + if codec_name == "E-AC-3": + ext = ".eac3" + else: + if codec_name == "AC-3": + ext = ".ac3" + if codec_name == "DTS": + ext = ".dts" + + outputName = inputName.replace(replace_str, ext) + self.logger.info(("{} -> {}").format(inputName, outputName)) + ff = ffmpy.FFmpeg( + executable=self.bin["ffmpeg"], + inputs={inputName: None}, + outputs={outputName: "-c:a copy"}, + global_options="-vn -sn -y -hide_banner -loglevel panic", + ) + ff.run() + time.sleep(0.05) + if os.path.isfile(outputName) and os.path.getsize(outputName) > 1024 * 1024: + os.remove(inputName) + self.logger.info("Done!") + + return + + def shaka_decrypt(self, encrypted, decrypted, keys, stream): + self.logger.info("\nDecrypting: {}".format(encrypted)) + decrypt_command = [ + self.bin["shaka-packager"], + "--enable_raw_key_decryption", + "-quiet", + "input={},stream={},output={}".format(encrypted, stream, decrypted), + ] + + for key in keys: + decrypt_command.append("--keys") + decrypt_command.append( + "key={}:key_id={}".format( + key["KEY"], "00000000000000000000000000000000" + ) + ) + + self.logger.info("\nDecrypting KEYS: ") + for key in keys: + self.logger.info(("{}:{}".format(key["KID"], key["KEY"]))) + + wvdecrypt_process = subprocess.Popen(decrypt_command) + stdoutdata, stderrdata = wvdecrypt_process.communicate() + wvdecrypt_process.wait() + self.logger.info("Done!") + + return True + + def mp4_decrypt( + self, + encrypted, + decrypted, + keys, + moded_decrypter=True, + no_kid=True, + silent=False, + ): + self.logger.info("\nDecrypting: {}".format(encrypted)) + decrypt_command = [ + self.bin["mp4decrypt"] + if not moded_decrypter + else self.bin["mp4decrypt_moded"] + ] + decrypt_command += ["--show-progress", encrypted, decrypted] + + for key in keys: + decrypt_command.append("--key") + decrypt_command.append( + "{}:{}".format(key["ID"] if no_kid else key["KID"], key["KEY"]) + ) + + self.logger.info("\nDecrypting KEYS: ") + for key in keys: + self.logger.info( + ("{}:{}".format(key["ID"] if no_kid else key["KID"], key["KEY"])) + ) + + if silent: + wvdecrypt_process = subprocess.Popen( + decrypt_command, stdout=open(os.devnull, "wb") + ) + else: + wvdecrypt_process = subprocess.Popen(decrypt_command) + + stdoutdata, stderrdata = wvdecrypt_process.communicate() + wvdecrypt_process.wait() + if wvdecrypt_process.returncode == 0: + self.logger.info("Done!") + return True + + return False + + def DemuxVideo( + self, + outputVideoTemp, + outputVideo, + ffmpeg=False, + mp4box=False, + ffmpeg_version="ffmpeg", + ): + if ffmpeg: + self.logger.info("\nRemuxing video...") + # if not outputVideo.endswith(".h264"): + # os.rename(outputVideoTemp, outputVideo) + # self.logger.info("Done!") + # return True + + ff = ffmpy.FFmpeg( + executable=self.bin[ffmpeg_version], + inputs={outputVideoTemp: None}, + outputs={outputVideo: "-c copy"}, + global_options="-y -hide_banner -loglevel panic", + ).run() + time.sleep(0.05) + if ( + os.path.isfile(outputVideo) + and os.path.getsize(outputVideo) > 1024 * 1024 + ): + os.remove(outputVideoTemp) + self.logger.info("Done!") + return True + + if mp4box: + self.logger.info("\nRemuxing video...") + if not outputVideo.endswith(".h264"): + os.rename(outputVideoTemp, outputVideo) + self.logger.info("Done!") + return True + + subprocess.call( + [ + self.bin["mp4box"], + "-quiet", + "-raw", + "1", + "-out", + outputVideo, + outputVideoTemp, + ] + ) + if ( + os.path.isfile(outputVideo) + and os.path.getsize(outputVideo) > 1024 * 1024 + ): + os.remove(outputVideoTemp) + self.logger.info("Done!") + return True + + return False diff --git a/helpers/sdh.py b/helpers/sdh.py new file mode 100644 index 0000000..2fc571e --- /dev/null +++ b/helpers/sdh.py @@ -0,0 +1,90 @@ +import codecs +import os +import re +import sys + +import pysrt + + +class sdh_remover: + def __init__(self,): + self.__replace__ = "empty_line" + self.content = [] + + def cleanLine(self, line, regex): + line = re.sub("", "", line) + line = re.sub("", "", line) + if re.search(r"\[(.*)?\n(.*)?\]", line): + line = re.sub( + re.search(r"\[(.*)?\n(.*)?\]", line).group(), self.__replace__, line + ) + + if re.search(r"\((.*)?\n(.*)?\)", line): + line = re.sub( + re.search(r"\((.*)?\n(.*)?\)", line).group(), self.__replace__, line + ) + + try: + # is it inside a markup tag? + match = regex.match(line).group(1) + tag = re.compile("(<[A-z]+[^>]*>)").match(match).group(1) + line = re.sub(match, tag + self.__replace__, line) + except: + try: + line = re.sub(regex, self.__replace__, line) + except: + pass + return line + + def _save(self, Output): + + file = codecs.open(Output, "w", encoding="utf-8") + + for idx, text in enumerate(self.content, start=1): + file.write( + "{}\n{} --> {}\n{}\n\n".format( + str(idx), text["start"], text["end"], text["text"].strip(), + ) + ) + + file.close() + + def clean(self): + if not self.content == []: + temp = self.content + self.content = [] + + for text in temp: + if text["text"].strip() == self.__replace__: + continue + text.update({"text": re.sub(self.__replace__, "", text["text"])}) + + if not text["text"].strip() == "": + self.content.append(text) + + return + + def noHI(self, Input=None, Output=None, content=None): + + srt = pysrt.open(Input, encoding="utf-8") + for idx, line in enumerate(srt, start=1): + number = str(idx) + start = line.start + end = line.end + text = line.text + + text = self.cleanLine(text, re.compile(r"(\[(.+)?\]|\[(.+)?|^(.+)?\])")) + text = self.cleanLine(text, re.compile(r"(\((.+)?\)|\((.+)?|^(.+)?\))")) + text = self.cleanLine(text, re.compile(r"(\[(.+)?\]|\[(.+)?|^(.+)?\])")) + text = self.cleanLine( + text, + re.compile(r"([♩♪♫♭♮♯]+(.+)?[♩♪♫♭♮♯]+|[♩♪♫♭♮♯]+(.+)?|^(.+)?[♩♪♫♭♮♯]+)"), + ) + text = self.cleanLine(text, re.compile(r"(]*>)|(<\/font>)")) + + self.content.append( + {"number": number, "start": start, "end": end, "text": text,} + ) + + self.clean() + self._save(Output) diff --git a/helpers/vpn.py b/helpers/vpn.py new file mode 100644 index 0000000..9dd78b2 --- /dev/null +++ b/helpers/vpn.py @@ -0,0 +1,135 @@ +import os +import requests +import sys +import random +import logging + +class connect(object): + def __init__(self, code): + self.code = code.lower() + self.logger = logging.getLogger(__name__) + self.headers = { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" + } + + def nordVPN(self): + nordvpn_codes = { + "al": "2", + "ar": "10", + "au": "13", + "at": "14", + "be": "21", + "ba": "27", + "br": "30", + "bg": "33", + "ca": "38", + "cl": "43", + "cr": "52", + "hr": "54", + "cy": "56", + "cz": "57", + "dk": "58", + "eg": "64", + "ee": "68", + "fi": "73", + "fr": "74", + "ge": "80", + "de": "81", + "gr": "84", + "hk": "97", + "hu": "98", + "is": "99", + "in": "100", + "id": "101", + "ie": "104", + "il": "105", + "it": "106", + "jp": "108", + "lv": "119", + "lu": "126", + "my": "131", + "mx": "140", + "md": "142", + "nl": "153", + "nz": "156", + "mk": "128", + "no": "163", + "ro": "179", + "pl": "174", + "si": "197", + "za": "200", + "kr": "114", + "rs": "192", + "sg": "195", + "sk": "196", + "es": "202", + "se": "208", + "ch": "209", + "tw": "211", + "th": "214", + "tr": "220", + "ua": "225", + "ae": "226", + "gb": "227", + "us": "228", + "vn": "234", + "uk": "227", + } + nord_proxy = {} + if nordvpn_codes.get(self.code): + resp = requests.get( + url="https://nordvpn.com/wp-admin/admin-ajax.php?action=servers_recommendations&filters={%22country_id%22:" + + nordvpn_codes.get(self.code) + + "}", + headers=self.headers, + ) + nord_proxy = resp.json()[0]["hostname"] + else: + self.logger.info( + self.code + + " : not listed in country codes, read country.doc for more info" + ) + + return nord_proxy + + def load_privatevpn(self): + html_file = "html.html" + hosts = [] + resp = requests.get( + "https://privatevpn.com/serverlist/", stream=True, headers=self.headers + ) + resp = str(resp.text) + resp = resp.replace("
", "") + + with open(html_file, "w", encoding="utf8") as file: + file.write(resp) + + with open(html_file, "r") as file: + text = file.readlines() + + if os.path.exists(html_file): + os.remove(html_file) + + for p in text: + if ".pvdata.host" in p: + hosts.append(p.strip()) + + return hosts + + def privateVPN(self): + private_proxy = {} + private_hosts = self.load_privatevpn() + self.logger.debug("private_hosts: {}".format(private_hosts)) + search_host = [host for host in private_hosts if host[:2] == self.code] + if not search_host == []: + self.logger.info(f"Founded {str(len(search_host))} Proxies") + for n, p in enumerate(search_host): + self.logger.info(f"[{str(n+1)}] {p}") + inp = input("\nEnter Proxy Number, or Hit Enter for random one: ").strip() + if inp == "": + return random.choice(search_host) + private_proxy = search_host[int(inp) - 1] + else: + self.logger.info(f"no Proxies Found, you may entered wrong code, or search failed!...") + + return private_proxy diff --git a/pywidevine/cdm/__init__.py b/pywidevine/cdm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/cdm/__pycache__/__init__.cpython-36.pyc b/pywidevine/cdm/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..72c824f Binary files /dev/null and b/pywidevine/cdm/__pycache__/__init__.cpython-36.pyc differ diff --git a/pywidevine/cdm/__pycache__/__init__.cpython-37.pyc b/pywidevine/cdm/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..3feda0d Binary files /dev/null and b/pywidevine/cdm/__pycache__/__init__.cpython-37.pyc differ diff --git a/pywidevine/cdm/__pycache__/__init__.cpython-38.pyc b/pywidevine/cdm/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..291ef95 Binary files /dev/null and b/pywidevine/cdm/__pycache__/__init__.cpython-38.pyc differ diff --git a/pywidevine/cdm/__pycache__/__init__.cpython-39.pyc b/pywidevine/cdm/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..5d25d4f Binary files /dev/null and b/pywidevine/cdm/__pycache__/__init__.cpython-39.pyc differ diff --git a/pywidevine/cdm/__pycache__/cdm.cpython-36.pyc b/pywidevine/cdm/__pycache__/cdm.cpython-36.pyc new file mode 100644 index 0000000..75d28f4 Binary files /dev/null and b/pywidevine/cdm/__pycache__/cdm.cpython-36.pyc differ diff --git a/pywidevine/cdm/__pycache__/cdm.cpython-37.pyc b/pywidevine/cdm/__pycache__/cdm.cpython-37.pyc new file mode 100644 index 0000000..6bc392b Binary files /dev/null and b/pywidevine/cdm/__pycache__/cdm.cpython-37.pyc differ diff --git a/pywidevine/cdm/__pycache__/cdm.cpython-38.pyc b/pywidevine/cdm/__pycache__/cdm.cpython-38.pyc new file mode 100644 index 0000000..8428ad2 Binary files /dev/null and b/pywidevine/cdm/__pycache__/cdm.cpython-38.pyc differ diff --git a/pywidevine/cdm/__pycache__/cdm.cpython-39.pyc b/pywidevine/cdm/__pycache__/cdm.cpython-39.pyc new file mode 100644 index 0000000..f672a0d Binary files /dev/null and b/pywidevine/cdm/__pycache__/cdm.cpython-39.pyc differ diff --git a/pywidevine/cdm/__pycache__/deviceconfig.cpython-36.pyc b/pywidevine/cdm/__pycache__/deviceconfig.cpython-36.pyc new file mode 100644 index 0000000..a53f291 Binary files /dev/null and b/pywidevine/cdm/__pycache__/deviceconfig.cpython-36.pyc differ diff --git a/pywidevine/cdm/__pycache__/deviceconfig.cpython-37.pyc b/pywidevine/cdm/__pycache__/deviceconfig.cpython-37.pyc new file mode 100644 index 0000000..5f9a03b Binary files /dev/null and b/pywidevine/cdm/__pycache__/deviceconfig.cpython-37.pyc differ diff --git a/pywidevine/cdm/__pycache__/deviceconfig.cpython-38.pyc b/pywidevine/cdm/__pycache__/deviceconfig.cpython-38.pyc new file mode 100644 index 0000000..f6a85b3 Binary files /dev/null and b/pywidevine/cdm/__pycache__/deviceconfig.cpython-38.pyc differ diff --git a/pywidevine/cdm/__pycache__/deviceconfig.cpython-39.pyc b/pywidevine/cdm/__pycache__/deviceconfig.cpython-39.pyc new file mode 100644 index 0000000..ec88f92 Binary files /dev/null and b/pywidevine/cdm/__pycache__/deviceconfig.cpython-39.pyc differ diff --git a/pywidevine/cdm/__pycache__/key.cpython-36.pyc b/pywidevine/cdm/__pycache__/key.cpython-36.pyc new file mode 100644 index 0000000..8a15878 Binary files /dev/null and b/pywidevine/cdm/__pycache__/key.cpython-36.pyc differ diff --git a/pywidevine/cdm/__pycache__/key.cpython-37.pyc b/pywidevine/cdm/__pycache__/key.cpython-37.pyc new file mode 100644 index 0000000..260f6db Binary files /dev/null and b/pywidevine/cdm/__pycache__/key.cpython-37.pyc differ diff --git a/pywidevine/cdm/__pycache__/key.cpython-38.pyc b/pywidevine/cdm/__pycache__/key.cpython-38.pyc new file mode 100644 index 0000000..0cb5fce Binary files /dev/null and b/pywidevine/cdm/__pycache__/key.cpython-38.pyc differ diff --git a/pywidevine/cdm/__pycache__/key.cpython-39.pyc b/pywidevine/cdm/__pycache__/key.cpython-39.pyc new file mode 100644 index 0000000..4a76196 Binary files /dev/null and b/pywidevine/cdm/__pycache__/key.cpython-39.pyc differ diff --git a/pywidevine/cdm/__pycache__/session.cpython-36.pyc b/pywidevine/cdm/__pycache__/session.cpython-36.pyc new file mode 100644 index 0000000..c8a2136 Binary files /dev/null and b/pywidevine/cdm/__pycache__/session.cpython-36.pyc differ diff --git a/pywidevine/cdm/__pycache__/session.cpython-37.pyc b/pywidevine/cdm/__pycache__/session.cpython-37.pyc new file mode 100644 index 0000000..f9ea22a Binary files /dev/null and b/pywidevine/cdm/__pycache__/session.cpython-37.pyc differ diff --git a/pywidevine/cdm/__pycache__/session.cpython-38.pyc b/pywidevine/cdm/__pycache__/session.cpython-38.pyc new file mode 100644 index 0000000..f5929a4 Binary files /dev/null and b/pywidevine/cdm/__pycache__/session.cpython-38.pyc differ diff --git a/pywidevine/cdm/__pycache__/session.cpython-39.pyc b/pywidevine/cdm/__pycache__/session.cpython-39.pyc new file mode 100644 index 0000000..915ea76 Binary files /dev/null and b/pywidevine/cdm/__pycache__/session.cpython-39.pyc differ diff --git a/pywidevine/cdm/cdm.py b/pywidevine/cdm/cdm.py new file mode 100644 index 0000000..3e690aa --- /dev/null +++ b/pywidevine/cdm/cdm.py @@ -0,0 +1,407 @@ +import base64 + +import os +import time +import binascii + +from google.protobuf.message import DecodeError +from google.protobuf import text_format + +from pywidevine.cdm.formats import wv_proto2_pb2 as wv_proto2 +from pywidevine.cdm.session import Session +from pywidevine.cdm.key import Key +from Cryptodome.Random import get_random_bytes +from Cryptodome.Random import random +from Cryptodome.Cipher import PKCS1_OAEP, AES +from Cryptodome.Hash import CMAC, SHA256, HMAC, SHA1 +from Cryptodome.PublicKey import RSA +from Cryptodome.Signature import pss +from Cryptodome.Util import Padding +import logging + + +class Cdm: + def __init__(self): + self.logger = logging.getLogger(__name__) + self.sessions = {} + + def open_session(self, init_data_b64, device, raw_init_data=None, offline=False): + self.logger.debug( + "open_session(init_data_b64={}, device={}".format(init_data_b64, device) + ) + #self.logger.info("opening new cdm session") + if device.session_id_type == "android": + # format: 16 random hexdigits, 2 digit counter, 14 0s + rand_ascii = "".join(random.choice("ABCDEF0123456789") for _ in range(16)) + counter = "01" # this resets regularly so its fine to use 01 + rest = "00000000000000" + session_id = rand_ascii + counter + rest + session_id = session_id.encode("ascii") + elif device.session_id_type == "chrome": + rand_bytes = get_random_bytes(16) + session_id = rand_bytes + else: + # other formats NYI + self.logger.error("device type is unusable") + return 1 + if raw_init_data and isinstance(raw_init_data, (bytes, bytearray)): + # used for NF key exchange, where they don't provide a valid PSSH + init_data = raw_init_data + self.raw_pssh = True + else: + init_data = self._parse_init_data(init_data_b64) + self.raw_pssh = False + + if init_data: + new_session = Session(session_id, init_data, device, offline) + else: + self.logger.error("unable to parse init data") + return 1 + self.sessions[session_id] = new_session + #self.logger.info("session opened and init data parsed successfully") + return session_id + + def _parse_init_data(self, init_data_b64): + parsed_init_data = wv_proto2.WidevineCencHeader() + try: + self.logger.debug("trying to parse init_data directly") + parsed_init_data.ParseFromString(base64.b64decode(init_data_b64)[32:]) + except DecodeError: + self.logger.debug( + "unable to parse as-is, trying with removed pssh box header" + ) + try: + id_bytes = parsed_init_data.ParseFromString( + base64.b64decode(init_data_b64)[32:] + ) + except DecodeError: + self.logger.error("unable to parse, unsupported init data format") + return None + self.logger.debug("init_data:") + for line in text_format.MessageToString(parsed_init_data).splitlines(): + self.logger.debug(line) + return parsed_init_data + + def close_session(self, session_id): + self.logger.debug("close_session(session_id={})".format(session_id)) + #self.logger.info("closing cdm session") + if session_id in self.sessions: + self.sessions.pop(session_id) + self.logger.info("cdm session closed") + return 0 + else: + self.logger.info("session {} not found".format(session_id)) + return 1 + + def set_service_certificate(self, session_id, cert_b64): + self.logger.debug( + "set_service_certificate(session_id={}, cert={})".format( + session_id, cert_b64 + ) + ) + #self.logger.info("setting service certificate") + + if session_id not in self.sessions: + self.logger.error("session id doesn't exist") + return 1 + + session = self.sessions[session_id] + + message = wv_proto2.SignedMessage() + + try: + message.ParseFromString(base64.b64decode(cert_b64)) + except DecodeError: + self.logger.error("failed to parse cert as SignedMessage") + + service_certificate = wv_proto2.SignedDeviceCertificate() + + if message.Type: + self.logger.debug("service cert provided as signedmessage") + try: + service_certificate.ParseFromString(message.Msg) + except DecodeError: + # self.logger.error("failed to parse service certificate") + return 1 + else: + self.logger.debug("service cert provided as signeddevicecertificate") + try: + service_certificate.ParseFromString(base64.b64decode(cert_b64)) + except DecodeError: + # self.logger.error("failed to parse service certificate") + return 1 + + self.logger.debug("service certificate:") + for line in text_format.MessageToString(service_certificate).splitlines(): + self.logger.debug(line) + + session.service_certificate = service_certificate + session.privacy_mode = True + + return 0 + + def get_license_request(self, session_id): + self.logger.debug("get_license_request(session_id={})".format(session_id)) + #self.logger.info("getting license request") + + if session_id not in self.sessions: + self.logger.error("session ID does not exist") + return 1 + + session = self.sessions[session_id] + + # raw pssh will be treated as bytes and not parsed + if self.raw_pssh: + license_request = wv_proto2.SignedLicenseRequestRaw() + else: + license_request = wv_proto2.SignedLicenseRequest() + client_id = wv_proto2.ClientIdentification() + + if not os.path.exists(session.device_config.device_client_id_blob_filename): + self.logger.error("no client ID blob available for this device") + return 1 + + with open(session.device_config.device_client_id_blob_filename, "rb") as f: + try: + cid_bytes = client_id.ParseFromString(f.read()) + except DecodeError: + self.logger.error("client id failed to parse as protobuf") + return 1 + + self.logger.debug("building license request") + if not self.raw_pssh: + license_request.Type = wv_proto2.SignedLicenseRequest.MessageType.Value( + "LICENSE_REQUEST" + ) + license_request.Msg.ContentId.CencId.Pssh.CopyFrom(session.init_data) + else: + license_request.Type = wv_proto2.SignedLicenseRequestRaw.MessageType.Value( + "LICENSE_REQUEST" + ) + license_request.Msg.ContentId.CencId.Pssh = session.init_data # bytes + + if session.offline: + license_type = wv_proto2.LicenseType.Value("OFFLINE") + else: + license_type = wv_proto2.LicenseType.Value("DEFAULT") + license_request.Msg.ContentId.CencId.LicenseType = license_type + license_request.Msg.ContentId.CencId.RequestId = session_id + license_request.Msg.Type = wv_proto2.LicenseRequest.RequestType.Value("NEW") + license_request.Msg.RequestTime = int(time.time()) + license_request.Msg.ProtocolVersion = wv_proto2.ProtocolVersion.Value("CURRENT") + if session.device_config.send_key_control_nonce: + license_request.Msg.KeyControlNonce = random.randrange(1, 2 ** 31) + + if session.privacy_mode: + if session.device_config.vmp: + self.logger.debug("vmp required, adding to client_id") + self.logger.debug("reading vmp hashes") + vmp_hashes = wv_proto2.FileHashes() + with open(session.device_config.device_vmp_blob_filename, "rb") as f: + try: + vmp_bytes = vmp_hashes.ParseFromString(f.read()) + except DecodeError: + self.logger.error("vmp hashes failed to parse as protobuf") + return 1 + client_id._FileHashes.CopyFrom(vmp_hashes) + self.logger.debug( + "privacy mode & service certificate loaded, encrypting client id" + ) + self.logger.debug("unencrypted client id:") + for line in text_format.MessageToString(client_id).splitlines(): + self.logger.debug(line) + cid_aes_key = get_random_bytes(16) + cid_iv = get_random_bytes(16) + + cid_cipher = AES.new(cid_aes_key, AES.MODE_CBC, cid_iv) + + encrypted_client_id = cid_cipher.encrypt( + Padding.pad(client_id.SerializeToString(), 16) + ) + + service_public_key = RSA.importKey( + session.service_certificate._DeviceCertificate.PublicKey + ) + + service_cipher = PKCS1_OAEP.new(service_public_key) + + encrypted_cid_key = service_cipher.encrypt(cid_aes_key) + + encrypted_client_id_proto = wv_proto2.EncryptedClientIdentification() + + encrypted_client_id_proto.ServiceId = ( + session.service_certificate._DeviceCertificate.ServiceId + ) + encrypted_client_id_proto.ServiceCertificateSerialNumber = ( + session.service_certificate._DeviceCertificate.SerialNumber + ) + encrypted_client_id_proto.EncryptedClientId = encrypted_client_id + encrypted_client_id_proto.EncryptedClientIdIv = cid_iv + encrypted_client_id_proto.EncryptedPrivacyKey = encrypted_cid_key + + license_request.Msg.EncryptedClientId.CopyFrom(encrypted_client_id_proto) + else: + license_request.Msg.ClientId.CopyFrom(client_id) + + if session.device_config.private_key_available: + key = RSA.importKey( + open(session.device_config.device_private_key_filename).read() + ) + session.device_key = key + else: + self.logger.error("need device private key, other methods unimplemented") + return 1 + + self.logger.debug("signing license request") + + hash = SHA1.new(license_request.Msg.SerializeToString()) + signature = pss.new(key).sign(hash) + + license_request.Signature = signature + + session.license_request = license_request + + self.logger.debug("license request:") + for line in text_format.MessageToString(session.license_request).splitlines(): + self.logger.debug(line) + #self.logger.info("license request created") + self.logger.debug( + "license request b64: {}".format( + base64.b64encode(license_request.SerializeToString()) + ) + ) + return license_request.SerializeToString() + + def provide_license(self, session_id, license_b64): + self.logger.debug( + "provide_license(session_id={}, license_b64={})".format( + session_id, license_b64 + ) + ) + #self.logger.info("decrypting provided license") + + if session_id not in self.sessions: + self.logger.error("session does not exist") + return 1 + + session = self.sessions[session_id] + + if not session.license_request: + self.logger.error("generate a license request first!") + return 1 + + license = wv_proto2.SignedLicense() + try: + license.ParseFromString(base64.b64decode(license_b64)) + except DecodeError: + self.logger.error("unable to parse license - check protobufs") + return 1 + + session.license = license + + self.logger.debug("license:") + for line in text_format.MessageToString(license).splitlines(): + self.logger.debug(line) + + self.logger.debug("deriving keys from session key") + + oaep_cipher = PKCS1_OAEP.new(session.device_key) + + session.session_key = oaep_cipher.decrypt(license.SessionKey) + + lic_req_msg = session.license_request.Msg.SerializeToString() + + enc_key_base = b"ENCRYPTION\000" + lic_req_msg + b"\0\0\0\x80" + auth_key_base = b"AUTHENTICATION\0" + lic_req_msg + b"\0\0\2\0" + + enc_key = b"\x01" + enc_key_base + auth_key_1 = b"\x01" + auth_key_base + auth_key_2 = b"\x02" + auth_key_base + auth_key_3 = b"\x03" + auth_key_base + auth_key_4 = b"\x04" + auth_key_base + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(enc_key) + + enc_cmac_key = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_1) + auth_cmac_key_1 = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_2) + auth_cmac_key_2 = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_3) + auth_cmac_key_3 = cmac_obj.digest() + + cmac_obj = CMAC.new(session.session_key, ciphermod=AES) + cmac_obj.update(auth_key_4) + auth_cmac_key_4 = cmac_obj.digest() + + auth_cmac_combined_1 = auth_cmac_key_1 + auth_cmac_key_2 + auth_cmac_combined_2 = auth_cmac_key_3 + auth_cmac_key_4 + + session.derived_keys["enc"] = enc_cmac_key + session.derived_keys["auth_1"] = auth_cmac_combined_1 + session.derived_keys["auth_2"] = auth_cmac_combined_2 + + self.logger.debug("verifying license signature") + + lic_hmac = HMAC.new(session.derived_keys["auth_1"], digestmod=SHA256) + lic_hmac.update(license.Msg.SerializeToString()) + + self.logger.debug( + "calculated sig: {} actual sig: {}".format( + lic_hmac.hexdigest(), binascii.hexlify(license.Signature) + ) + ) + + if lic_hmac.digest() != license.Signature: + self.logger.info( + "license signature doesn't match - writing bin so they can be debugged" + ) + with open("original_lic.bin", "wb") as f: + f.write(base64.b64decode(license_b64)) + with open("parsed_lic.bin", "wb") as f: + f.write(license.SerializeToString()) + self.logger.info("continuing anyway") + + self.logger.debug("key count: {}".format(len(license.Msg.Key))) + for key in license.Msg.Key: + if key.Id: + key_id = key.Id + else: + key_id = wv_proto2.License.KeyContainer.KeyType.Name(key.Type).encode( + "utf-8" + ) + encrypted_key = key.Key + iv = key.Iv + type = wv_proto2.License.KeyContainer.KeyType.Name(key.Type) + + cipher = AES.new(session.derived_keys["enc"], AES.MODE_CBC, iv=iv) + decrypted_key = cipher.decrypt(encrypted_key) + if type == "OPERATOR_SESSION": + permissions = [] + perms = key._OperatorSessionKeyPermissions + for (descriptor, value) in perms.ListFields(): + if value == 1: + permissions.append(descriptor.name) + # print(permissions) + else: + permissions = [] + session.keys.append( + Key(key_id, type, Padding.unpad(decrypted_key, 16), permissions) + ) + + #self.logger.info("decrypted all keys") + return 0 + + def get_keys(self, session_id): + if session_id in self.sessions: + return self.sessions[session_id].keys + else: + self.logger.error("session not found") + return 1 diff --git a/pywidevine/cdm/deviceconfig.py b/pywidevine/cdm/deviceconfig.py new file mode 100644 index 0000000..5232a75 --- /dev/null +++ b/pywidevine/cdm/deviceconfig.py @@ -0,0 +1,115 @@ +import os + +device_chromecdm_903 = { + "name": "chromecdm_903", + "description": "chrome cdm windows 903", + "security_level": 3, + "session_id_type": "chrome", + "private_key_available": True, + "vmp": False, + "send_key_control_nonce": False, +} + +device_android_general = { + "name": "android_general", + "description": "android_general lvl3 security level", + "security_level": 3, + "session_id_type": "android", + "private_key_available": True, + "vmp": False, + "send_key_control_nonce": True, +} + +devices_available = [ + device_android_general, + device_chromecdm_903, +] + +FILES_FOLDER = "devices" + + +class DeviceConfig: + def __init__(self, device): + self.device_name = device["name"] + self.description = device["description"] + self.security_level = device["security_level"] + self.session_id_type = device["session_id_type"] + self.private_key_available = device["private_key_available"] + self.vmp = device["vmp"] + self.send_key_control_nonce = device["send_key_control_nonce"] + if "keybox_filename" in device: + self.keybox_filename = os.path.join( + os.path.dirname(__file__), + FILES_FOLDER, + device["name"], + device["keybox_filename"], + ) + else: + self.keybox_filename = os.path.join( + os.path.dirname(__file__), FILES_FOLDER, device["name"], "keybox" + ) + if "device_cert_filename" in device: + self.device_cert_filename = os.path.join( + os.path.dirname(__file__), + FILES_FOLDER, + device["name"], + device["device_cert_filename"], + ) + else: + self.device_cert_filename = os.path.join( + os.path.dirname(__file__), FILES_FOLDER, device["name"], "device_cert" + ) + if "device_private_key_filename" in device: + self.device_private_key_filename = os.path.join( + os.path.dirname(__file__), + FILES_FOLDER, + device["name"], + device["device_private_key_filename"], + ) + else: + self.device_private_key_filename = os.path.join( + os.path.dirname(__file__), + FILES_FOLDER, + device["name"], + "device_private_key", + ) + if "device_client_id_blob_filename" in device: + self.device_client_id_blob_filename = os.path.join( + os.path.dirname(__file__), + FILES_FOLDER, + device["name"], + device["device_client_id_blob_filename"], + ) + else: + self.device_client_id_blob_filename = os.path.join( + os.path.dirname(__file__), + FILES_FOLDER, + device["name"], + "device_client_id_blob", + ) + if "device_vmp_blob_filename" in device: + self.device_vmp_blob_filename = os.path.join( + os.path.dirname(__file__), + FILES_FOLDER, + device["name"], + device["device_vmp_blob_filename"], + ) + else: + self.device_vmp_blob_filename = os.path.join( + os.path.dirname(__file__), + FILES_FOLDER, + device["name"], + "device_vmp_blob", + ) + + def __repr__(self): + return ( + "DeviceConfig(name={}, description={}, security_level={}, session_id_type={}, private_key_available={}, vmp={})" + ).format( + self.device_name, + self.description, + self.security_level, + self.session_id_type, + self.private_key_available, + self.vmp, + ) diff --git a/pywidevine/cdm/devices/android_general/device_client_id_blob b/pywidevine/cdm/devices/android_general/device_client_id_blob new file mode 100644 index 0000000..cc32780 Binary files /dev/null and b/pywidevine/cdm/devices/android_general/device_client_id_blob differ diff --git a/pywidevine/cdm/devices/android_general/device_private_key b/pywidevine/cdm/devices/android_general/device_private_key new file mode 100644 index 0000000..8eab693 --- /dev/null +++ b/pywidevine/cdm/devices/android_general/device_private_key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEA4sUKDpvMG/idF8oCH5AVSwFd5Mk+rEwOBsLZMYdliXWe1hn9 +mdE6u9pjsr+bLrZjlKxMFqPPxbIUcC1Ii7BFSje2Fd8kxnaIprQWxDPgK+NSSx7v +Un452TyB1L9lx39ZBt0PlRfwjkCodX+I9y+oBga73NRh7hPbtLzXe/r/ubFBaEu+ +aRkDZBwYPqHgH1RoFLuyFNMjfqGcPosGxceDtvPysmBxB93Hk2evml5fjdYGg6tx +z510g+XFPDFv7GSy1KuWqit83MqzPls9qAQMkwUc05ggjDhGCKW4/p97fn23WDFE +3TzSSsQvyJLKA3s9oJbtJCD/gOHYqDvnWn8zPwIDAQABAoIBAQDCWe1Mp+o+7sx0 +XwWC15HoPruiIXg9YtGCqexLrqcvMEd5Z70Z32BfL8TSpbTyTA78lM6BeNPRs9Yg +bi8GyYQZH7ZG+IAkN+LWPPJmJa+y7ZjSGSkzoksiC+GZ3I/2cwZyA3Qfa+0XfgLi +8PMKJyXyREMt+DgWO57JQC/OakhRdCR19mM6NKd+ynd/IEz/NIbjMLDVKwW8HEPx +N3r5CU9O96nr62DI68KVj3jwUR3cDi/5xfhosYhCQjHJuobNbeFR18dY2nQNLWYd +S0wtskla1fl9eYHwYAzwru4wHT4WJC7+V4pscfCI0YZB6PslxDKrv73l5H1tz4cf +Vy58NRSBAoGBAPSmjoVtQzTvQ6PZIs81SF1ulJI9kUpyFaBoSSgt+2ZkeNtF6Hih +Zm7OVJ9wg9sfjpB3SFBUjuhXz/ts/t6dkA2PgCbrvhBMRKSGbfyhhtM2gRf002I4 +bJ7Y0C/ont4WzC/XbXEkAmh+fG2/JRvbdVQaIdyS6MmVHtCtRsHEQZS5AoGBAO1K +IXOKAFA+320+Hkbqskfevmxrv+JHIdetliaREZwQH+VYUUM8u5/Kt3oyMat+mH90 +rZOKQK2zM8cz4tKclTUT54nrtICxeo6UHVc56FqXZ6sVvVgm8Cnvt1md4XwG4FwQ +r/OlaM6Hr5HRf8dkzuzqm4ZQYRHGzZ6AMphj8Xu3AoGAdmo7p5dIJVH98kuCDrsi +iJ6iaNpF/buUfiyb5EfFXD0bRj7jE6hDdTSHPxjtqVzv2zrxFHipJwqBz5dlEYlA +FWA0ziHiv+66dsveZp4kLQ0/lMHaorre0E/vDJFSe/qa4DksbsvYIo2+WjxfkMk7 +U/bGFwZAiHmWDbkg+16rw3kCgYEAyyodWf9eJVavlakJ404vNrnP8KSQtfyRTUii +toKewTBNHuBvM1JckoPOdCFlxZ+ukfIka56DojU8r+IM4qaOWdOg+sWE1mses9S9 +CmHaPzZC3IjQhRlRp5ZHNcOnu7lnf2wKOmH1Sl+CQydMcDwvr0lvv6AyfDXq9zps +F2365CECgYEAmYgs/qwnh9m0aGDw/ZGrASoE0TxlpizPvsVDGx9t9UGC2Z+5QvAE +ZcQeKoLCbktr0BnRLI+W1g+KpXQGcnSF9VX/qwUlf72XA6C6kobQvW+Yd/H/IN5d +jPqoL/m41rRzm+J+9/Tfc8Aiy1kkllUYnVJdC5QLAIswuhI8lkaFTN4= +-----END RSA PRIVATE KEY----- diff --git a/pywidevine/cdm/formats/__init__.py b/pywidevine/cdm/formats/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pywidevine/cdm/formats/__pycache__/__init__.cpython-36.pyc b/pywidevine/cdm/formats/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..50d9eb6 Binary files /dev/null and b/pywidevine/cdm/formats/__pycache__/__init__.cpython-36.pyc differ diff --git a/pywidevine/cdm/formats/__pycache__/__init__.cpython-37.pyc b/pywidevine/cdm/formats/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..1a31cc2 Binary files /dev/null and b/pywidevine/cdm/formats/__pycache__/__init__.cpython-37.pyc differ diff --git a/pywidevine/cdm/formats/__pycache__/__init__.cpython-38.pyc b/pywidevine/cdm/formats/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..d378cd1 Binary files /dev/null and b/pywidevine/cdm/formats/__pycache__/__init__.cpython-38.pyc differ diff --git a/pywidevine/cdm/formats/__pycache__/__init__.cpython-39.pyc b/pywidevine/cdm/formats/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..b5863d8 Binary files /dev/null and b/pywidevine/cdm/formats/__pycache__/__init__.cpython-39.pyc differ diff --git a/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-36.pyc b/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-36.pyc new file mode 100644 index 0000000..45a9098 Binary files /dev/null and b/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-36.pyc differ diff --git a/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-37.pyc b/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-37.pyc new file mode 100644 index 0000000..5d53f3b Binary files /dev/null and b/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-37.pyc differ diff --git a/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-38.pyc b/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-38.pyc new file mode 100644 index 0000000..d477911 Binary files /dev/null and b/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-38.pyc differ diff --git a/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-39.pyc b/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-39.pyc new file mode 100644 index 0000000..3ca31c5 Binary files /dev/null and b/pywidevine/cdm/formats/__pycache__/wv_proto2_pb2.cpython-39.pyc differ diff --git a/pywidevine/cdm/formats/wv_proto2.proto b/pywidevine/cdm/formats/wv_proto2.proto new file mode 100644 index 0000000..04c9809 --- /dev/null +++ b/pywidevine/cdm/formats/wv_proto2.proto @@ -0,0 +1,466 @@ +syntax = "proto2"; + +// from x86 (partial), most of it from the ARM version: +message ClientIdentification { + enum TokenType { + KEYBOX = 0; + DEVICE_CERTIFICATE = 1; + REMOTE_ATTESTATION_CERTIFICATE = 2; + } + message NameValue { + required string Name = 1; + required string Value = 2; + } + message ClientCapabilities { + enum HdcpVersion { + HDCP_NONE = 0; + HDCP_V1 = 1; + HDCP_V2 = 2; + HDCP_V2_1 = 3; + HDCP_V2_2 = 4; + } + optional uint32 ClientToken = 1; + optional uint32 SessionToken = 2; + optional uint32 VideoResolutionConstraints = 3; + optional HdcpVersion MaxHdcpVersion = 4; + optional uint32 OemCryptoApiVersion = 5; + } + required TokenType Type = 1; + //optional bytes Token = 2; // by default the client treats this as blob, but it's usually a DeviceCertificate, so for usefulness sake, I'm replacing it with this one: + optional SignedDeviceCertificate Token = 2; // use this when parsing, "bytes" when building a client id blob + repeated NameValue ClientInfo = 3; + optional bytes ProviderClientToken = 4; + optional uint32 LicenseCounter = 5; + optional ClientCapabilities _ClientCapabilities = 6; // how should we deal with duped names? will have to look at proto docs later + optional FileHashes _FileHashes = 7; // vmp blob goes here +} + +message DeviceCertificate { + enum CertificateType { + ROOT = 0; + INTERMEDIATE = 1; + USER_DEVICE = 2; + SERVICE = 3; + } + required CertificateType Type = 1; // the compiled code reused this as ProvisionedDeviceInfo.WvSecurityLevel, however that is incorrect (compiler aliased it as they're both identical as a structure) + optional bytes SerialNumber = 2; + optional uint32 CreationTimeSeconds = 3; + optional bytes PublicKey = 4; + optional uint32 SystemId = 5; + optional uint32 TestDeviceDeprecated = 6; // is it bool or int? + optional bytes ServiceId = 7; // service URL for service certificates +} + +// missing some references, +message DeviceCertificateStatus { + enum CertificateStatus { + VALID = 0; + REVOKED = 1; + } + optional bytes SerialNumber = 1; + optional CertificateStatus Status = 2; + optional ProvisionedDeviceInfo DeviceInfo = 4; // where is 3? is it deprecated? +} + +message DeviceCertificateStatusList { + optional uint32 CreationTimeSeconds = 1; + repeated DeviceCertificateStatus CertificateStatus = 2; +} + +message EncryptedClientIdentification { + required string ServiceId = 1; + optional bytes ServiceCertificateSerialNumber = 2; + required bytes EncryptedClientId = 3; + required bytes EncryptedClientIdIv = 4; + required bytes EncryptedPrivacyKey = 5; +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +enum LicenseType { + ZERO = 0; + DEFAULT = 1; // 1 is STREAMING/temporary license; on recent versions may go up to 3 (latest x86); it might be persist/don't persist type, unconfirmed + OFFLINE = 2; +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +// this is just a guess because these globals got lost, but really, do we need more? +enum ProtocolVersion { + CURRENT = 21; // don't have symbols for this +} + + +message LicenseIdentification { + optional bytes RequestId = 1; + optional bytes SessionId = 2; + optional bytes PurchaseId = 3; + optional LicenseType Type = 4; + optional uint32 Version = 5; + optional bytes ProviderSessionToken = 6; +} + + +message License { + message Policy { + optional bool CanPlay = 1; // changed from uint32 to bool + optional bool CanPersist = 2; + optional bool CanRenew = 3; + optional uint32 RentalDurationSeconds = 4; + optional uint32 PlaybackDurationSeconds = 5; + optional uint32 LicenseDurationSeconds = 6; + optional uint32 RenewalRecoveryDurationSeconds = 7; + optional string RenewalServerUrl = 8; + optional uint32 RenewalDelaySeconds = 9; + optional uint32 RenewalRetryIntervalSeconds = 10; + optional bool RenewWithUsage = 11; // was uint32 + } + message KeyContainer { + enum KeyType { + SIGNING = 1; + CONTENT = 2; + KEY_CONTROL = 3; + OPERATOR_SESSION = 4; + } + enum SecurityLevel { + SW_SECURE_CRYPTO = 1; + SW_SECURE_DECODE = 2; + HW_SECURE_CRYPTO = 3; + HW_SECURE_DECODE = 4; + HW_SECURE_ALL = 5; + } + message OutputProtection { + enum CGMS { + COPY_FREE = 0; + COPY_ONCE = 2; + COPY_NEVER = 3; + CGMS_NONE = 0x2A; // PC default! + } + optional ClientIdentification.ClientCapabilities.HdcpVersion Hdcp = 1; // it's most likely a copy of Hdcp version available here, but compiler optimized it away + optional CGMS CgmsFlags = 2; + } + message KeyControl { + required bytes KeyControlBlock = 1; // what is this? + required bytes Iv = 2; + } + message OperatorSessionKeyPermissions { + optional uint32 AllowEncrypt = 1; + optional uint32 AllowDecrypt = 2; + optional uint32 AllowSign = 3; + optional uint32 AllowSignatureVerify = 4; + } + message VideoResolutionConstraint { + optional uint32 MinResolutionPixels = 1; + optional uint32 MaxResolutionPixels = 2; + optional OutputProtection RequiredProtection = 3; + } + optional bytes Id = 1; + optional bytes Iv = 2; + optional bytes Key = 3; + optional KeyType Type = 4; + optional SecurityLevel Level = 5; + optional OutputProtection RequiredProtection = 6; + optional OutputProtection RequestedProtection = 7; + optional KeyControl _KeyControl = 8; // duped names, etc + optional OperatorSessionKeyPermissions _OperatorSessionKeyPermissions = 9; // duped names, etc + repeated VideoResolutionConstraint VideoResolutionConstraints = 10; + } + optional LicenseIdentification Id = 1; + optional Policy _Policy = 2; // duped names, etc + repeated KeyContainer Key = 3; + optional uint32 LicenseStartTime = 4; + optional uint32 RemoteAttestationVerified = 5; // bool? + optional bytes ProviderClientToken = 6; + // there might be more, check with newer versions (I see field 7-8 in a lic) + // this appeared in latest x86: + optional uint32 ProtectionScheme = 7; // type unconfirmed fully, but it's likely as WidevineCencHeader describesit (fourcc) +} + +message LicenseError { + enum Error { + INVALID_DEVICE_CERTIFICATE = 1; + REVOKED_DEVICE_CERTIFICATE = 2; + SERVICE_UNAVAILABLE = 3; + } + //LicenseRequest.RequestType ErrorCode; // clang mismatch + optional Error ErrorCode = 1; +} + +message LicenseRequest { + message ContentIdentification { + message CENC { + //optional bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + optional WidevineCencHeader Pssh = 1; + optional LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) + optional bytes RequestId = 3; + } + message WebM { + optional bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used + optional LicenseType LicenseType = 2; + optional bytes RequestId = 3; + } + message ExistingLicense { + optional LicenseIdentification LicenseId = 1; + optional uint32 SecondsSinceStarted = 2; + optional uint32 SecondsSinceLastPlayed = 3; + optional bytes SessionUsageTableEntry = 4; // interesting! try to figure out the connection between the usage table blob and KCB! + } + optional CENC CencId = 1; + optional WebM WebmId = 2; + optional ExistingLicense License = 3; + } + enum RequestType { + NEW = 1; + RENEWAL = 2; + RELEASE = 3; + } + optional ClientIdentification ClientId = 1; + optional ContentIdentification ContentId = 2; + optional RequestType Type = 3; + optional uint32 RequestTime = 4; + optional bytes KeyControlNonceDeprecated = 5; + optional ProtocolVersion ProtocolVersion = 6; // lacking symbols for this + optional uint32 KeyControlNonce = 7; + optional EncryptedClientIdentification EncryptedClientId = 8; +} + +// raw pssh hack +message LicenseRequestRaw { + message ContentIdentification { + message CENC { + optional bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + //optional WidevineCencHeader Pssh = 1; + optional LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) + optional bytes RequestId = 3; + } + message WebM { + optional bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used + optional LicenseType LicenseType = 2; + optional bytes RequestId = 3; + } + message ExistingLicense { + optional LicenseIdentification LicenseId = 1; + optional uint32 SecondsSinceStarted = 2; + optional uint32 SecondsSinceLastPlayed = 3; + optional bytes SessionUsageTableEntry = 4; // interesting! try to figure out the connection between the usage table blob and KCB! + } + optional CENC CencId = 1; + optional WebM WebmId = 2; + optional ExistingLicense License = 3; + } + enum RequestType { + NEW = 1; + RENEWAL = 2; + RELEASE = 3; + } + optional ClientIdentification ClientId = 1; + optional ContentIdentification ContentId = 2; + optional RequestType Type = 3; + optional uint32 RequestTime = 4; + optional bytes KeyControlNonceDeprecated = 5; + optional ProtocolVersion ProtocolVersion = 6; // lacking symbols for this + optional uint32 KeyControlNonce = 7; + optional EncryptedClientIdentification EncryptedClientId = 8; +} + + +message ProvisionedDeviceInfo { + enum WvSecurityLevel { + LEVEL_UNSPECIFIED = 0; + LEVEL_1 = 1; + LEVEL_2 = 2; + LEVEL_3 = 3; + } + optional uint32 SystemId = 1; + optional string Soc = 2; + optional string Manufacturer = 3; + optional string Model = 4; + optional string DeviceType = 5; + optional uint32 ModelYear = 6; + optional WvSecurityLevel SecurityLevel = 7; + optional uint32 TestDevice = 8; // bool? +} + + +// todo: fill +message ProvisioningOptions { +} + +// todo: fill +message ProvisioningRequest { +} + +// todo: fill +message ProvisioningResponse { +} + +message RemoteAttestation { + optional EncryptedClientIdentification Certificate = 1; + optional string Salt = 2; + optional string Signature = 3; +} + +// todo: fill +message SessionInit { +} + +// todo: fill +message SessionState { +} + +// todo: fill +message SignedCertificateStatusList { +} + +message SignedDeviceCertificate { + + //optional bytes DeviceCertificate = 1; // again, they use a buffer where it's supposed to be a message, so we'll replace it with what it really is: + optional DeviceCertificate _DeviceCertificate = 1; // how should we deal with duped names? will have to look at proto docs later + optional bytes Signature = 2; + optional SignedDeviceCertificate Signer = 3; +} + + +// todo: fill +message SignedProvisioningMessage { +} + +// the root of all messages, from either server or client +message SignedMessage { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional bytes Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + + + +// This message is copied from google's docs, not reversed: +message WidevineCencHeader { + enum Algorithm { + UNENCRYPTED = 0; + AESCTR = 1; + }; + optional Algorithm algorithm = 1; + repeated bytes key_id = 2; + + // Content provider name. + optional string provider = 3; + + // A content identifier, specified by content provider. + optional bytes content_id = 4; + + // Track type. Acceptable values are SD, HD and AUDIO. Used to + // differentiate content keys used by an asset. + optional string track_type_deprecated = 5; + + // The name of a registered policy to be used for this asset. + optional string policy = 6; + + // Crypto period index, for media using key rotation. + optional uint32 crypto_period_index = 7; + + // Optional protected context for group content. The grouped_license is a + // serialized SignedMessage. + optional bytes grouped_license = 8; + + // Protection scheme identifying the encryption algorithm. + // Represented as one of the following 4CC values: + // 'cenc' (AESCTR), 'cbc1' (AESCBC), + // 'cens' (AESCTR subsample), 'cbcs' (AESCBC subsample). + optional uint32 protection_scheme = 9; + + // Optional. For media using key rotation, this represents the duration + // of each crypto period in seconds. + optional uint32 crypto_period_seconds = 10; +} + + +// remove these when using it outside of protoc: + +// from here on, it's just for testing, these messages don't exist in the binaries, I'm adding them to avoid detecting type programmatically +message SignedLicenseRequest { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional LicenseRequest Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + +// hack +message SignedLicenseRequestRaw { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional LicenseRequestRaw Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + + +message SignedLicense { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional License Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + +message SignedServiceCertificate { + enum MessageType { + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + optional SignedDeviceCertificate Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + optional bytes SessionKey = 4; // often RSA wrapped for licenses + optional RemoteAttestation RemoteAttestation = 5; +} + +//vmp support +message FileHashes { + message Signature { + optional string filename = 1; + optional bool test_signing = 2; //0 - release, 1 - testing + optional bytes SHA512Hash = 3; + optional bool main_exe = 4; //0 for dlls, 1 for exe, this is field 3 in file + optional bytes signature = 5; + } + optional bytes signer = 1; + repeated Signature signatures = 2; +} diff --git a/pywidevine/cdm/formats/wv_proto2_pb2.py b/pywidevine/cdm/formats/wv_proto2_pb2.py new file mode 100644 index 0000000..4c2a6d1 --- /dev/null +++ b/pywidevine/cdm/formats/wv_proto2_pb2.py @@ -0,0 +1,3324 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: pywidevine/cdm/formats/wv_proto2.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='pywidevine/cdm/formats/wv_proto2.proto', + package='', + syntax='proto2', + serialized_pb=_b('\n&pywidevine/cdm/formats/wv_proto2.proto\"\xe7\x05\n\x14\x43lientIdentification\x12-\n\x04Type\x18\x01 \x02(\x0e\x32\x1f.ClientIdentification.TokenType\x12\'\n\x05Token\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x33\n\nClientInfo\x18\x03 \x03(\x0b\x32\x1f.ClientIdentification.NameValue\x12\x1b\n\x13ProviderClientToken\x18\x04 \x01(\x0c\x12\x16\n\x0eLicenseCounter\x18\x05 \x01(\r\x12\x45\n\x13_ClientCapabilities\x18\x06 \x01(\x0b\x32(.ClientIdentification.ClientCapabilities\x12 \n\x0b_FileHashes\x18\x07 \x01(\x0b\x32\x0b.FileHashes\x1a(\n\tNameValue\x12\x0c\n\x04Name\x18\x01 \x02(\t\x12\r\n\x05Value\x18\x02 \x02(\t\x1a\xa4\x02\n\x12\x43lientCapabilities\x12\x13\n\x0b\x43lientToken\x18\x01 \x01(\r\x12\x14\n\x0cSessionToken\x18\x02 \x01(\r\x12\"\n\x1aVideoResolutionConstraints\x18\x03 \x01(\r\x12L\n\x0eMaxHdcpVersion\x18\x04 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12\x1b\n\x13OemCryptoApiVersion\x18\x05 \x01(\r\"T\n\x0bHdcpVersion\x12\r\n\tHDCP_NONE\x10\x00\x12\x0b\n\x07HDCP_V1\x10\x01\x12\x0b\n\x07HDCP_V2\x10\x02\x12\r\n\tHDCP_V2_1\x10\x03\x12\r\n\tHDCP_V2_2\x10\x04\"S\n\tTokenType\x12\n\n\x06KEYBOX\x10\x00\x12\x16\n\x12\x44\x45VICE_CERTIFICATE\x10\x01\x12\"\n\x1eREMOTE_ATTESTATION_CERTIFICATE\x10\x02\"\x9b\x02\n\x11\x44\x65viceCertificate\x12\x30\n\x04Type\x18\x01 \x02(\x0e\x32\".DeviceCertificate.CertificateType\x12\x14\n\x0cSerialNumber\x18\x02 \x01(\x0c\x12\x1b\n\x13\x43reationTimeSeconds\x18\x03 \x01(\r\x12\x11\n\tPublicKey\x18\x04 \x01(\x0c\x12\x10\n\x08SystemId\x18\x05 \x01(\r\x12\x1c\n\x14TestDeviceDeprecated\x18\x06 \x01(\r\x12\x11\n\tServiceId\x18\x07 \x01(\x0c\"K\n\x0f\x43\x65rtificateType\x12\x08\n\x04ROOT\x10\x00\x12\x10\n\x0cINTERMEDIATE\x10\x01\x12\x0f\n\x0bUSER_DEVICE\x10\x02\x12\x0b\n\x07SERVICE\x10\x03\"\xc4\x01\n\x17\x44\x65viceCertificateStatus\x12\x14\n\x0cSerialNumber\x18\x01 \x01(\x0c\x12:\n\x06Status\x18\x02 \x01(\x0e\x32*.DeviceCertificateStatus.CertificateStatus\x12*\n\nDeviceInfo\x18\x04 \x01(\x0b\x32\x16.ProvisionedDeviceInfo\"+\n\x11\x43\x65rtificateStatus\x12\t\n\x05VALID\x10\x00\x12\x0b\n\x07REVOKED\x10\x01\"o\n\x1b\x44\x65viceCertificateStatusList\x12\x1b\n\x13\x43reationTimeSeconds\x18\x01 \x01(\r\x12\x33\n\x11\x43\x65rtificateStatus\x18\x02 \x03(\x0b\x32\x18.DeviceCertificateStatus\"\xaf\x01\n\x1d\x45ncryptedClientIdentification\x12\x11\n\tServiceId\x18\x01 \x02(\t\x12&\n\x1eServiceCertificateSerialNumber\x18\x02 \x01(\x0c\x12\x19\n\x11\x45ncryptedClientId\x18\x03 \x02(\x0c\x12\x1b\n\x13\x45ncryptedClientIdIv\x18\x04 \x02(\x0c\x12\x1b\n\x13\x45ncryptedPrivacyKey\x18\x05 \x02(\x0c\"\x9c\x01\n\x15LicenseIdentification\x12\x11\n\tRequestId\x18\x01 \x01(\x0c\x12\x11\n\tSessionId\x18\x02 \x01(\x0c\x12\x12\n\nPurchaseId\x18\x03 \x01(\x0c\x12\x1a\n\x04Type\x18\x04 \x01(\x0e\x32\x0c.LicenseType\x12\x0f\n\x07Version\x18\x05 \x01(\r\x12\x1c\n\x14ProviderSessionToken\x18\x06 \x01(\x0c\"\xa1\x0e\n\x07License\x12\"\n\x02Id\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12 \n\x07_Policy\x18\x02 \x01(\x0b\x32\x0f.License.Policy\x12\"\n\x03Key\x18\x03 \x03(\x0b\x32\x15.License.KeyContainer\x12\x18\n\x10LicenseStartTime\x18\x04 \x01(\r\x12!\n\x19RemoteAttestationVerified\x18\x05 \x01(\r\x12\x1b\n\x13ProviderClientToken\x18\x06 \x01(\x0c\x12\x18\n\x10ProtectionScheme\x18\x07 \x01(\r\x1a\xbb\x02\n\x06Policy\x12\x0f\n\x07\x43\x61nPlay\x18\x01 \x01(\x08\x12\x12\n\nCanPersist\x18\x02 \x01(\x08\x12\x10\n\x08\x43\x61nRenew\x18\x03 \x01(\x08\x12\x1d\n\x15RentalDurationSeconds\x18\x04 \x01(\r\x12\x1f\n\x17PlaybackDurationSeconds\x18\x05 \x01(\r\x12\x1e\n\x16LicenseDurationSeconds\x18\x06 \x01(\r\x12&\n\x1eRenewalRecoveryDurationSeconds\x18\x07 \x01(\r\x12\x18\n\x10RenewalServerUrl\x18\x08 \x01(\t\x12\x1b\n\x13RenewalDelaySeconds\x18\t \x01(\r\x12#\n\x1bRenewalRetryIntervalSeconds\x18\n \x01(\r\x12\x16\n\x0eRenewWithUsage\x18\x0b \x01(\x08\x1a\xf9\t\n\x0cKeyContainer\x12\n\n\x02Id\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x12\x0b\n\x03Key\x18\x03 \x01(\x0c\x12+\n\x04Type\x18\x04 \x01(\x0e\x32\x1d.License.KeyContainer.KeyType\x12\x32\n\x05Level\x18\x05 \x01(\x0e\x32#.License.KeyContainer.SecurityLevel\x12\x42\n\x12RequiredProtection\x18\x06 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x43\n\x13RequestedProtection\x18\x07 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x35\n\x0b_KeyControl\x18\x08 \x01(\x0b\x32 .License.KeyContainer.KeyControl\x12[\n\x1e_OperatorSessionKeyPermissions\x18\t \x01(\x0b\x32\x33.License.KeyContainer.OperatorSessionKeyPermissions\x12S\n\x1aVideoResolutionConstraints\x18\n \x03(\x0b\x32/.License.KeyContainer.VideoResolutionConstraint\x1a\xdb\x01\n\x10OutputProtection\x12\x42\n\x04Hdcp\x18\x01 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12>\n\tCgmsFlags\x18\x02 \x01(\x0e\x32+.License.KeyContainer.OutputProtection.CGMS\"C\n\x04\x43GMS\x12\r\n\tCOPY_FREE\x10\x00\x12\r\n\tCOPY_ONCE\x10\x02\x12\x0e\n\nCOPY_NEVER\x10\x03\x12\r\n\tCGMS_NONE\x10*\x1a\x31\n\nKeyControl\x12\x17\n\x0fKeyControlBlock\x18\x01 \x02(\x0c\x12\n\n\x02Iv\x18\x02 \x02(\x0c\x1a|\n\x1dOperatorSessionKeyPermissions\x12\x14\n\x0c\x41llowEncrypt\x18\x01 \x01(\r\x12\x14\n\x0c\x41llowDecrypt\x18\x02 \x01(\r\x12\x11\n\tAllowSign\x18\x03 \x01(\r\x12\x1c\n\x14\x41llowSignatureVerify\x18\x04 \x01(\r\x1a\x99\x01\n\x19VideoResolutionConstraint\x12\x1b\n\x13MinResolutionPixels\x18\x01 \x01(\r\x12\x1b\n\x13MaxResolutionPixels\x18\x02 \x01(\r\x12\x42\n\x12RequiredProtection\x18\x03 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\"J\n\x07KeyType\x12\x0b\n\x07SIGNING\x10\x01\x12\x0b\n\x07\x43ONTENT\x10\x02\x12\x0f\n\x0bKEY_CONTROL\x10\x03\x12\x14\n\x10OPERATOR_SESSION\x10\x04\"z\n\rSecurityLevel\x12\x14\n\x10SW_SECURE_CRYPTO\x10\x01\x12\x14\n\x10SW_SECURE_DECODE\x10\x02\x12\x14\n\x10HW_SECURE_CRYPTO\x10\x03\x12\x14\n\x10HW_SECURE_DECODE\x10\x04\x12\x11\n\rHW_SECURE_ALL\x10\x05\"\x98\x01\n\x0cLicenseError\x12&\n\tErrorCode\x18\x01 \x01(\x0e\x32\x13.LicenseError.Error\"`\n\x05\x45rror\x12\x1e\n\x1aINVALID_DEVICE_CERTIFICATE\x10\x01\x12\x1e\n\x1aREVOKED_DEVICE_CERTIFICATE\x10\x02\x12\x17\n\x13SERVICE_UNAVAILABLE\x10\x03\"\xac\x07\n\x0eLicenseRequest\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12\x38\n\tContentId\x18\x02 \x01(\x0b\x32%.LicenseRequest.ContentIdentification\x12)\n\x04Type\x18\x03 \x01(\x0e\x32\x1b.LicenseRequest.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\xa2\x04\n\x15\x43ontentIdentification\x12:\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.CENC\x12:\n\x06WebmId\x18\x02 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.WebM\x12\x46\n\x07License\x18\x03 \x01(\x0b\x32\x35.LicenseRequest.ContentIdentification.ExistingLicense\x1a_\n\x04\x43\x45NC\x12!\n\x04Pssh\x18\x01 \x01(\x0b\x32\x13.WidevineCencHeader\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"0\n\x0bRequestType\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa9\x07\n\x11LicenseRequestRaw\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12;\n\tContentId\x18\x02 \x01(\x0b\x32(.LicenseRequestRaw.ContentIdentification\x12,\n\x04Type\x18\x03 \x01(\x0e\x32\x1e.LicenseRequestRaw.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\x96\x04\n\x15\x43ontentIdentification\x12=\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32-.LicenseRequestRaw.ContentIdentification.CENC\x12=\n\x06WebmId\x18\x02 \x01(\x0b\x32-.LicenseRequestRaw.ContentIdentification.WebM\x12I\n\x07License\x18\x03 \x01(\x0b\x32\x38.LicenseRequestRaw.ContentIdentification.ExistingLicense\x1aJ\n\x04\x43\x45NC\x12\x0c\n\x04Pssh\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"0\n\x0bRequestType\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa6\x02\n\x15ProvisionedDeviceInfo\x12\x10\n\x08SystemId\x18\x01 \x01(\r\x12\x0b\n\x03Soc\x18\x02 \x01(\t\x12\x14\n\x0cManufacturer\x18\x03 \x01(\t\x12\r\n\x05Model\x18\x04 \x01(\t\x12\x12\n\nDeviceType\x18\x05 \x01(\t\x12\x11\n\tModelYear\x18\x06 \x01(\r\x12=\n\rSecurityLevel\x18\x07 \x01(\x0e\x32&.ProvisionedDeviceInfo.WvSecurityLevel\x12\x12\n\nTestDevice\x18\x08 \x01(\r\"O\n\x0fWvSecurityLevel\x12\x15\n\x11LEVEL_UNSPECIFIED\x10\x00\x12\x0b\n\x07LEVEL_1\x10\x01\x12\x0b\n\x07LEVEL_2\x10\x02\x12\x0b\n\x07LEVEL_3\x10\x03\"\x15\n\x13ProvisioningOptions\"\x15\n\x13ProvisioningRequest\"\x16\n\x14ProvisioningResponse\"i\n\x11RemoteAttestation\x12\x33\n\x0b\x43\x65rtificate\x18\x01 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x12\x0c\n\x04Salt\x18\x02 \x01(\t\x12\x11\n\tSignature\x18\x03 \x01(\t\"\r\n\x0bSessionInit\"\x0e\n\x0cSessionState\"\x1d\n\x1bSignedCertificateStatusList\"\x86\x01\n\x17SignedDeviceCertificate\x12.\n\x12_DeviceCertificate\x18\x01 \x01(\x0b\x32\x12.DeviceCertificate\x12\x11\n\tSignature\x18\x02 \x01(\x0c\x12(\n\x06Signer\x18\x03 \x01(\x0b\x32\x18.SignedDeviceCertificate\"\x1b\n\x19SignedProvisioningMessage\"\x9b\x02\n\rSignedMessage\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedMessage.MessageType\x12\x0b\n\x03Msg\x18\x02 \x01(\x0c\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc5\x02\n\x12WidevineCencHeader\x12\x30\n\talgorithm\x18\x01 \x01(\x0e\x32\x1d.WidevineCencHeader.Algorithm\x12\x0e\n\x06key_id\x18\x02 \x03(\x0c\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c\x12\x1d\n\x15track_type_deprecated\x18\x05 \x01(\t\x12\x0e\n\x06policy\x18\x06 \x01(\t\x12\x1b\n\x13\x63rypto_period_index\x18\x07 \x01(\r\x12\x17\n\x0fgrouped_license\x18\x08 \x01(\x0c\x12\x19\n\x11protection_scheme\x18\t \x01(\r\x12\x1d\n\x15\x63rypto_period_seconds\x18\n \x01(\r\"(\n\tAlgorithm\x12\x0f\n\x0bUNENCRYPTED\x10\x00\x12\n\n\x06\x41\x45SCTR\x10\x01\"\xba\x02\n\x14SignedLicenseRequest\x12/\n\x04Type\x18\x01 \x01(\x0e\x32!.SignedLicenseRequest.MessageType\x12\x1c\n\x03Msg\x18\x02 \x01(\x0b\x32\x0f.LicenseRequest\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc3\x02\n\x17SignedLicenseRequestRaw\x12\x32\n\x04Type\x18\x01 \x01(\x0e\x32$.SignedLicenseRequestRaw.MessageType\x12\x1f\n\x03Msg\x18\x02 \x01(\x0b\x32\x12.LicenseRequestRaw\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xa5\x02\n\rSignedLicense\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedLicense.MessageType\x12\x15\n\x03Msg\x18\x02 \x01(\x0b\x32\x08.License\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xcb\x02\n\x18SignedServiceCertificate\x12\x33\n\x04Type\x18\x01 \x01(\x0e\x32%.SignedServiceCertificate.MessageType\x12%\n\x03Msg\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xb5\x01\n\nFileHashes\x12\x0e\n\x06signer\x18\x01 \x01(\x0c\x12)\n\nsignatures\x18\x02 \x03(\x0b\x32\x15.FileHashes.Signature\x1al\n\tSignature\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\x14\n\x0ctest_signing\x18\x02 \x01(\x08\x12\x12\n\nSHA512Hash\x18\x03 \x01(\x0c\x12\x10\n\x08main_exe\x18\x04 \x01(\x08\x12\x11\n\tsignature\x18\x05 \x01(\x0c*1\n\x0bLicenseType\x12\x08\n\x04ZERO\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01\x12\x0b\n\x07OFFLINE\x10\x02*\x1e\n\x0fProtocolVersion\x12\x0b\n\x07\x43URRENT\x10\x15') +) +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +_LICENSETYPE = _descriptor.EnumDescriptor( + name='LicenseType', + full_name='LicenseType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ZERO', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OFFLINE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=8362, + serialized_end=8411, +) +_sym_db.RegisterEnumDescriptor(_LICENSETYPE) + +LicenseType = enum_type_wrapper.EnumTypeWrapper(_LICENSETYPE) +_PROTOCOLVERSION = _descriptor.EnumDescriptor( + name='ProtocolVersion', + full_name='ProtocolVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='CURRENT', index=0, number=21, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=8413, + serialized_end=8443, +) +_sym_db.RegisterEnumDescriptor(_PROTOCOLVERSION) + +ProtocolVersion = enum_type_wrapper.EnumTypeWrapper(_PROTOCOLVERSION) +ZERO = 0 +DEFAULT = 1 +OFFLINE = 2 +CURRENT = 21 + + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION = _descriptor.EnumDescriptor( + name='HdcpVersion', + full_name='ClientIdentification.ClientCapabilities.HdcpVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='HDCP_NONE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_1', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_2', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=617, + serialized_end=701, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION) + +_CLIENTIDENTIFICATION_TOKENTYPE = _descriptor.EnumDescriptor( + name='TokenType', + full_name='ClientIdentification.TokenType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='KEYBOX', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEVICE_CERTIFICATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REMOTE_ATTESTATION_CERTIFICATE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=703, + serialized_end=786, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_TOKENTYPE) + +_DEVICECERTIFICATE_CERTIFICATETYPE = _descriptor.EnumDescriptor( + name='CertificateType', + full_name='DeviceCertificate.CertificateType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ROOT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INTERMEDIATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='USER_DEVICE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=997, + serialized_end=1072, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATE_CERTIFICATETYPE) + +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS = _descriptor.EnumDescriptor( + name='CertificateStatus', + full_name='DeviceCertificateStatus.CertificateStatus', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='VALID', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1228, + serialized_end=1271, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS = _descriptor.EnumDescriptor( + name='CGMS', + full_name='License.KeyContainer.OutputProtection.CGMS', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='COPY_FREE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_ONCE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_NEVER', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CGMS_NONE', index=3, number=42, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2949, + serialized_end=3016, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS) + +_LICENSE_KEYCONTAINER_KEYTYPE = _descriptor.EnumDescriptor( + name='KeyType', + full_name='License.KeyContainer.KeyType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SIGNING', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONTENT', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='KEY_CONTROL', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OPERATOR_SESSION', index=3, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3351, + serialized_end=3425, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_KEYTYPE) + +_LICENSE_KEYCONTAINER_SECURITYLEVEL = _descriptor.EnumDescriptor( + name='SecurityLevel', + full_name='License.KeyContainer.SecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SW_SECURE_CRYPTO', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SW_SECURE_DECODE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_CRYPTO', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_DECODE', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_ALL', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3427, + serialized_end=3549, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_SECURITYLEVEL) + +_LICENSEERROR_ERROR = _descriptor.EnumDescriptor( + name='Error', + full_name='LicenseError.Error', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='INVALID_DEVICE_CERTIFICATE', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED_DEVICE_CERTIFICATE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_UNAVAILABLE', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3608, + serialized_end=3704, +) +_sym_db.RegisterEnumDescriptor(_LICENSEERROR_ERROR) + +_LICENSEREQUEST_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='LicenseRequest.RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NEW', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RENEWAL', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELEASE', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4599, + serialized_end=4647, +) +_sym_db.RegisterEnumDescriptor(_LICENSEREQUEST_REQUESTTYPE) + +_LICENSEREQUESTRAW_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='LicenseRequestRaw.RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='NEW', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RENEWAL', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELEASE', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4599, + serialized_end=4647, +) +_sym_db.RegisterEnumDescriptor(_LICENSEREQUESTRAW_REQUESTTYPE) + +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL = _descriptor.EnumDescriptor( + name='WvSecurityLevel', + full_name='ProvisionedDeviceInfo.WvSecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LEVEL_UNSPECIFIED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_3', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5805, + serialized_end=5884, +) +_sym_db.RegisterEnumDescriptor(_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL) + +_SIGNEDMESSAGE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedMessage.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDMESSAGE_MESSAGETYPE) + +_WIDEVINECENCHEADER_ALGORITHM = _descriptor.EnumDescriptor( + name='Algorithm', + full_name='WidevineCencHeader.Algorithm', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNENCRYPTED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AESCTR', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6863, + serialized_end=6903, +) +_sym_db.RegisterEnumDescriptor(_WIDEVINECENCHEADER_ALGORITHM) + +_SIGNEDLICENSEREQUEST_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicenseRequest.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUEST_MESSAGETYPE) + +_SIGNEDLICENSEREQUESTRAW_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicenseRequestRaw.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUESTRAW_MESSAGETYPE) + +_SIGNEDLICENSE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicense.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSE_MESSAGETYPE) + +_SIGNEDSERVICECERTIFICATE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedServiceCertificate.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6450, + serialized_end=6575, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDSERVICECERTIFICATE_MESSAGETYPE) + + +_CLIENTIDENTIFICATION_NAMEVALUE = _descriptor.Descriptor( + name='NameValue', + full_name='ClientIdentification.NameValue', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Name', full_name='ClientIdentification.NameValue.Name', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Value', full_name='ClientIdentification.NameValue.Value', index=1, + number=2, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=366, + serialized_end=406, +) + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES = _descriptor.Descriptor( + name='ClientCapabilities', + full_name='ClientIdentification.ClientCapabilities', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientToken', full_name='ClientIdentification.ClientCapabilities.ClientToken', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionToken', full_name='ClientIdentification.ClientCapabilities.SessionToken', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='ClientIdentification.ClientCapabilities.VideoResolutionConstraints', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxHdcpVersion', full_name='ClientIdentification.ClientCapabilities.MaxHdcpVersion', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='OemCryptoApiVersion', full_name='ClientIdentification.ClientCapabilities.OemCryptoApiVersion', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=409, + serialized_end=701, +) + +_CLIENTIDENTIFICATION = _descriptor.Descriptor( + name='ClientIdentification', + full_name='ClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='ClientIdentification.Type', index=0, + number=1, type=14, cpp_type=8, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Token', full_name='ClientIdentification.Token', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ClientInfo', full_name='ClientIdentification.ClientInfo', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='ClientIdentification.ProviderClientToken', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseCounter', full_name='ClientIdentification.LicenseCounter', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_ClientCapabilities', full_name='ClientIdentification._ClientCapabilities', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_FileHashes', full_name='ClientIdentification._FileHashes', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_CLIENTIDENTIFICATION_NAMEVALUE, _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, ], + enum_types=[ + _CLIENTIDENTIFICATION_TOKENTYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=43, + serialized_end=786, +) + + +_DEVICECERTIFICATE = _descriptor.Descriptor( + name='DeviceCertificate', + full_name='DeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='DeviceCertificate.Type', index=0, + number=1, type=14, cpp_type=8, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificate.SerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificate.CreationTimeSeconds', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PublicKey', full_name='DeviceCertificate.PublicKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SystemId', full_name='DeviceCertificate.SystemId', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDeviceDeprecated', full_name='DeviceCertificate.TestDeviceDeprecated', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceId', full_name='DeviceCertificate.ServiceId', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATE_CERTIFICATETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=789, + serialized_end=1072, +) + + +_DEVICECERTIFICATESTATUS = _descriptor.Descriptor( + name='DeviceCertificateStatus', + full_name='DeviceCertificateStatus', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificateStatus.SerialNumber', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Status', full_name='DeviceCertificateStatus.Status', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceInfo', full_name='DeviceCertificateStatus.DeviceInfo', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1075, + serialized_end=1271, +) + + +_DEVICECERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='DeviceCertificateStatusList', + full_name='DeviceCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificateStatusList.CreationTimeSeconds', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CertificateStatus', full_name='DeviceCertificateStatusList.CertificateStatus', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1273, + serialized_end=1384, +) + + +_ENCRYPTEDCLIENTIDENTIFICATION = _descriptor.Descriptor( + name='EncryptedClientIdentification', + full_name='EncryptedClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ServiceId', full_name='EncryptedClientIdentification.ServiceId', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceCertificateSerialNumber', full_name='EncryptedClientIdentification.ServiceCertificateSerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='EncryptedClientIdentification.EncryptedClientId', index=2, + number=3, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientIdIv', full_name='EncryptedClientIdentification.EncryptedClientIdIv', index=3, + number=4, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedPrivacyKey', full_name='EncryptedClientIdentification.EncryptedPrivacyKey', index=4, + number=5, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1387, + serialized_end=1562, +) + + +_LICENSEIDENTIFICATION = _descriptor.Descriptor( + name='LicenseIdentification', + full_name='LicenseIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseIdentification.RequestId', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionId', full_name='LicenseIdentification.SessionId', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PurchaseId', full_name='LicenseIdentification.PurchaseId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseIdentification.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Version', full_name='LicenseIdentification.Version', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderSessionToken', full_name='LicenseIdentification.ProviderSessionToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1565, + serialized_end=1721, +) + + +_LICENSE_POLICY = _descriptor.Descriptor( + name='Policy', + full_name='License.Policy', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CanPlay', full_name='License.Policy.CanPlay', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanPersist', full_name='License.Policy.CanPersist', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanRenew', full_name='License.Policy.CanRenew', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RentalDurationSeconds', full_name='License.Policy.RentalDurationSeconds', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PlaybackDurationSeconds', full_name='License.Policy.PlaybackDurationSeconds', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseDurationSeconds', full_name='License.Policy.LicenseDurationSeconds', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRecoveryDurationSeconds', full_name='License.Policy.RenewalRecoveryDurationSeconds', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalServerUrl', full_name='License.Policy.RenewalServerUrl', index=7, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalDelaySeconds', full_name='License.Policy.RenewalDelaySeconds', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRetryIntervalSeconds', full_name='License.Policy.RenewalRetryIntervalSeconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewWithUsage', full_name='License.Policy.RenewWithUsage', index=10, + number=11, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1958, + serialized_end=2273, +) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION = _descriptor.Descriptor( + name='OutputProtection', + full_name='License.KeyContainer.OutputProtection', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Hdcp', full_name='License.KeyContainer.OutputProtection.Hdcp', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CgmsFlags', full_name='License.KeyContainer.OutputProtection.CgmsFlags', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2797, + serialized_end=3016, +) + +_LICENSE_KEYCONTAINER_KEYCONTROL = _descriptor.Descriptor( + name='KeyControl', + full_name='License.KeyContainer.KeyControl', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='KeyControlBlock', full_name='License.KeyContainer.KeyControl.KeyControlBlock', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.KeyControl.Iv', index=1, + number=2, type=12, cpp_type=9, label=2, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3018, + serialized_end=3067, +) + +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS = _descriptor.Descriptor( + name='OperatorSessionKeyPermissions', + full_name='License.KeyContainer.OperatorSessionKeyPermissions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='AllowEncrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowEncrypt', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowDecrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowDecrypt', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSign', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSign', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSignatureVerify', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSignatureVerify', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3069, + serialized_end=3193, +) + +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT = _descriptor.Descriptor( + name='VideoResolutionConstraint', + full_name='License.KeyContainer.VideoResolutionConstraint', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='MinResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MinResolutionPixels', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MaxResolutionPixels', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.VideoResolutionConstraint.RequiredProtection', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3196, + serialized_end=3349, +) + +_LICENSE_KEYCONTAINER = _descriptor.Descriptor( + name='KeyContainer', + full_name='License.KeyContainer', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.KeyContainer.Id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.Iv', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.KeyContainer.Key', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='License.KeyContainer.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Level', full_name='License.KeyContainer.Level', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.RequiredProtection', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestedProtection', full_name='License.KeyContainer.RequestedProtection', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_KeyControl', full_name='License.KeyContainer._KeyControl', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_OperatorSessionKeyPermissions', full_name='License.KeyContainer._OperatorSessionKeyPermissions', index=8, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='License.KeyContainer.VideoResolutionConstraints', index=9, + number=10, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_KEYCONTAINER_OUTPUTPROTECTION, _LICENSE_KEYCONTAINER_KEYCONTROL, _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, ], + enum_types=[ + _LICENSE_KEYCONTAINER_KEYTYPE, + _LICENSE_KEYCONTAINER_SECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2276, + serialized_end=3549, +) + +_LICENSE = _descriptor.Descriptor( + name='License', + full_name='License', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.Id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_Policy', full_name='License._Policy', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.Key', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseStartTime', full_name='License.LicenseStartTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestationVerified', full_name='License.RemoteAttestationVerified', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='License.ProviderClientToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtectionScheme', full_name='License.ProtectionScheme', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_POLICY, _LICENSE_KEYCONTAINER, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1724, + serialized_end=3549, +) + + +_LICENSEERROR = _descriptor.Descriptor( + name='LicenseError', + full_name='LicenseError', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ErrorCode', full_name='LicenseError.ErrorCode', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSEERROR_ERROR, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3552, + serialized_end=3704, +) + + +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( + name='CENC', + full_name='LicenseRequest.ContentIdentification.CENC', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Pssh', full_name='LicenseRequest.ContentIdentification.CENC.Pssh', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.CENC.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.CENC.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4268, + serialized_end=4363, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( + name='WebM', + full_name='LicenseRequest.ContentIdentification.WebM', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Header', full_name='LicenseRequest.ContentIdentification.WebM.Header', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.WebM.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.WebM.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4365, + serialized_end=4441, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( + name='ExistingLicense', + full_name='LicenseRequest.ContentIdentification.ExistingLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='LicenseId', full_name='LicenseRequest.ContentIdentification.ExistingLicense.LicenseId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceStarted', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceLastPlayed', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionUsageTableEntry', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4444, + serialized_end=4597, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION = _descriptor.Descriptor( + name='ContentIdentification', + full_name='LicenseRequest.ContentIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CencId', full_name='LicenseRequest.ContentIdentification.CencId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='WebmId', full_name='LicenseRequest.ContentIdentification.WebmId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='License', full_name='LicenseRequest.ContentIdentification.License', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4051, + serialized_end=4597, +) + +_LICENSEREQUEST = _descriptor.Descriptor( + name='LicenseRequest', + full_name='LicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientId', full_name='LicenseRequest.ClientId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ContentId', full_name='LicenseRequest.ContentId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseRequest.Type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestTime', full_name='LicenseRequest.RequestTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonceDeprecated', full_name='LicenseRequest.KeyControlNonceDeprecated', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtocolVersion', full_name='LicenseRequest.ProtocolVersion', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=21, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonce', full_name='LicenseRequest.KeyControlNonce', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='LicenseRequest.EncryptedClientId', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION, ], + enum_types=[ + _LICENSEREQUEST_REQUESTTYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3707, + serialized_end=4647, +) + + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( + name='CENC', + full_name='LicenseRequestRaw.ContentIdentification.CENC', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Pssh', full_name='LicenseRequestRaw.ContentIdentification.CENC.Pssh', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequestRaw.ContentIdentification.CENC.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequestRaw.ContentIdentification.CENC.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5229, + serialized_end=5303, +) + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( + name='WebM', + full_name='LicenseRequestRaw.ContentIdentification.WebM', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Header', full_name='LicenseRequestRaw.ContentIdentification.WebM.Header', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequestRaw.ContentIdentification.WebM.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequestRaw.ContentIdentification.WebM.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4365, + serialized_end=4441, +) + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( + name='ExistingLicense', + full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='LicenseId', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.LicenseId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceStarted', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceLastPlayed', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionUsageTableEntry', full_name='LicenseRequestRaw.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4444, + serialized_end=4597, +) + +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION = _descriptor.Descriptor( + name='ContentIdentification', + full_name='LicenseRequestRaw.ContentIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CencId', full_name='LicenseRequestRaw.ContentIdentification.CencId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='WebmId', full_name='LicenseRequestRaw.ContentIdentification.WebmId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='License', full_name='LicenseRequestRaw.ContentIdentification.License', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC, _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5003, + serialized_end=5537, +) + +_LICENSEREQUESTRAW = _descriptor.Descriptor( + name='LicenseRequestRaw', + full_name='LicenseRequestRaw', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientId', full_name='LicenseRequestRaw.ClientId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ContentId', full_name='LicenseRequestRaw.ContentId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseRequestRaw.Type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestTime', full_name='LicenseRequestRaw.RequestTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonceDeprecated', full_name='LicenseRequestRaw.KeyControlNonceDeprecated', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtocolVersion', full_name='LicenseRequestRaw.ProtocolVersion', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=21, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonce', full_name='LicenseRequestRaw.KeyControlNonce', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='LicenseRequestRaw.EncryptedClientId', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUESTRAW_CONTENTIDENTIFICATION, ], + enum_types=[ + _LICENSEREQUESTRAW_REQUESTTYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4650, + serialized_end=5587, +) + + +_PROVISIONEDDEVICEINFO = _descriptor.Descriptor( + name='ProvisionedDeviceInfo', + full_name='ProvisionedDeviceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SystemId', full_name='ProvisionedDeviceInfo.SystemId', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Soc', full_name='ProvisionedDeviceInfo.Soc', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Manufacturer', full_name='ProvisionedDeviceInfo.Manufacturer', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Model', full_name='ProvisionedDeviceInfo.Model', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceType', full_name='ProvisionedDeviceInfo.DeviceType', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ModelYear', full_name='ProvisionedDeviceInfo.ModelYear', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecurityLevel', full_name='ProvisionedDeviceInfo.SecurityLevel', index=6, + number=7, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDevice', full_name='ProvisionedDeviceInfo.TestDevice', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5590, + serialized_end=5884, +) + + +_PROVISIONINGOPTIONS = _descriptor.Descriptor( + name='ProvisioningOptions', + full_name='ProvisioningOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5886, + serialized_end=5907, +) + + +_PROVISIONINGREQUEST = _descriptor.Descriptor( + name='ProvisioningRequest', + full_name='ProvisioningRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5909, + serialized_end=5930, +) + + +_PROVISIONINGRESPONSE = _descriptor.Descriptor( + name='ProvisioningResponse', + full_name='ProvisioningResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5932, + serialized_end=5954, +) + + +_REMOTEATTESTATION = _descriptor.Descriptor( + name='RemoteAttestation', + full_name='RemoteAttestation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Certificate', full_name='RemoteAttestation.Certificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Salt', full_name='RemoteAttestation.Salt', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='RemoteAttestation.Signature', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5956, + serialized_end=6061, +) + + +_SESSIONINIT = _descriptor.Descriptor( + name='SessionInit', + full_name='SessionInit', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6063, + serialized_end=6076, +) + + +_SESSIONSTATE = _descriptor.Descriptor( + name='SessionState', + full_name='SessionState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6078, + serialized_end=6092, +) + + +_SIGNEDCERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='SignedCertificateStatusList', + full_name='SignedCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6094, + serialized_end=6123, +) + + +_SIGNEDDEVICECERTIFICATE = _descriptor.Descriptor( + name='SignedDeviceCertificate', + full_name='SignedDeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='_DeviceCertificate', full_name='SignedDeviceCertificate._DeviceCertificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedDeviceCertificate.Signature', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signer', full_name='SignedDeviceCertificate.Signer', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6126, + serialized_end=6260, +) + + +_SIGNEDPROVISIONINGMESSAGE = _descriptor.Descriptor( + name='SignedProvisioningMessage', + full_name='SignedProvisioningMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6262, + serialized_end=6289, +) + + +_SIGNEDMESSAGE = _descriptor.Descriptor( + name='SignedMessage', + full_name='SignedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedMessage.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedMessage.Msg', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedMessage.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedMessage.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedMessage.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDMESSAGE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6292, + serialized_end=6575, +) + + +_WIDEVINECENCHEADER = _descriptor.Descriptor( + name='WidevineCencHeader', + full_name='WidevineCencHeader', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='algorithm', full_name='WidevineCencHeader.algorithm', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='key_id', full_name='WidevineCencHeader.key_id', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='provider', full_name='WidevineCencHeader.provider', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='content_id', full_name='WidevineCencHeader.content_id', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='track_type_deprecated', full_name='WidevineCencHeader.track_type_deprecated', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='policy', full_name='WidevineCencHeader.policy', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_index', full_name='WidevineCencHeader.crypto_period_index', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='grouped_license', full_name='WidevineCencHeader.grouped_license', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='protection_scheme', full_name='WidevineCencHeader.protection_scheme', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_seconds', full_name='WidevineCencHeader.crypto_period_seconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _WIDEVINECENCHEADER_ALGORITHM, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6578, + serialized_end=6903, +) + + +_SIGNEDLICENSEREQUEST = _descriptor.Descriptor( + name='SignedLicenseRequest', + full_name='SignedLicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicenseRequest.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicenseRequest.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicenseRequest.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicenseRequest.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicenseRequest.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSEREQUEST_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6906, + serialized_end=7220, +) + + +_SIGNEDLICENSEREQUESTRAW = _descriptor.Descriptor( + name='SignedLicenseRequestRaw', + full_name='SignedLicenseRequestRaw', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicenseRequestRaw.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicenseRequestRaw.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicenseRequestRaw.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicenseRequestRaw.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicenseRequestRaw.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSEREQUESTRAW_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7223, + serialized_end=7546, +) + + +_SIGNEDLICENSE = _descriptor.Descriptor( + name='SignedLicense', + full_name='SignedLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicense.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicense.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicense.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicense.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicense.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7549, + serialized_end=7842, +) + + +_SIGNEDSERVICECERTIFICATE = _descriptor.Descriptor( + name='SignedServiceCertificate', + full_name='SignedServiceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedServiceCertificate.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedServiceCertificate.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedServiceCertificate.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedServiceCertificate.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedServiceCertificate.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDSERVICECERTIFICATE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=7845, + serialized_end=8176, +) + + +_FILEHASHES_SIGNATURE = _descriptor.Descriptor( + name='Signature', + full_name='FileHashes.Signature', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='filename', full_name='FileHashes.Signature.filename', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='test_signing', full_name='FileHashes.Signature.test_signing', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SHA512Hash', full_name='FileHashes.Signature.SHA512Hash', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='main_exe', full_name='FileHashes.Signature.main_exe', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signature', full_name='FileHashes.Signature.signature', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8252, + serialized_end=8360, +) + +_FILEHASHES = _descriptor.Descriptor( + name='FileHashes', + full_name='FileHashes', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='signer', full_name='FileHashes.signer', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signatures', full_name='FileHashes.signatures', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_FILEHASHES_SIGNATURE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=8179, + serialized_end=8360, +) + +_CLIENTIDENTIFICATION_NAMEVALUE.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.fields_by_name['MaxHdcpVersion'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION.containing_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION.fields_by_name['Type'].enum_type = _CLIENTIDENTIFICATION_TOKENTYPE +_CLIENTIDENTIFICATION.fields_by_name['Token'].message_type = _SIGNEDDEVICECERTIFICATE +_CLIENTIDENTIFICATION.fields_by_name['ClientInfo'].message_type = _CLIENTIDENTIFICATION_NAMEVALUE +_CLIENTIDENTIFICATION.fields_by_name['_ClientCapabilities'].message_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION.fields_by_name['_FileHashes'].message_type = _FILEHASHES +_CLIENTIDENTIFICATION_TOKENTYPE.containing_type = _CLIENTIDENTIFICATION +_DEVICECERTIFICATE.fields_by_name['Type'].enum_type = _DEVICECERTIFICATE_CERTIFICATETYPE +_DEVICECERTIFICATE_CERTIFICATETYPE.containing_type = _DEVICECERTIFICATE +_DEVICECERTIFICATESTATUS.fields_by_name['Status'].enum_type = _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS +_DEVICECERTIFICATESTATUS.fields_by_name['DeviceInfo'].message_type = _PROVISIONEDDEVICEINFO +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS.containing_type = _DEVICECERTIFICATESTATUS +_DEVICECERTIFICATESTATUSLIST.fields_by_name['CertificateStatus'].message_type = _DEVICECERTIFICATESTATUS +_LICENSEIDENTIFICATION.fields_by_name['Type'].enum_type = _LICENSETYPE +_LICENSE_POLICY.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['Hdcp'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['CgmsFlags'].enum_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS.containing_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_KEYCONTROL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER.fields_by_name['Type'].enum_type = _LICENSE_KEYCONTAINER_KEYTYPE +_LICENSE_KEYCONTAINER.fields_by_name['Level'].enum_type = _LICENSE_KEYCONTAINER_SECURITYLEVEL +_LICENSE_KEYCONTAINER.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['RequestedProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['_KeyControl'].message_type = _LICENSE_KEYCONTAINER_KEYCONTROL +_LICENSE_KEYCONTAINER.fields_by_name['_OperatorSessionKeyPermissions'].message_type = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS +_LICENSE_KEYCONTAINER.fields_by_name['VideoResolutionConstraints'].message_type = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT +_LICENSE_KEYCONTAINER.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_KEYTYPE.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_SECURITYLEVEL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE.fields_by_name['Id'].message_type = _LICENSEIDENTIFICATION +_LICENSE.fields_by_name['_Policy'].message_type = _LICENSE_POLICY +_LICENSE.fields_by_name['Key'].message_type = _LICENSE_KEYCONTAINER +_LICENSEERROR.fields_by_name['ErrorCode'].enum_type = _LICENSEERROR_ERROR +_LICENSEERROR_ERROR.containing_type = _LICENSEERROR +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['Pssh'].message_type = _WIDEVINECENCHEADER +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE +_LICENSEREQUEST_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUEST +_LICENSEREQUEST.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['ContentId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['Type'].enum_type = _LICENSEREQUEST_REQUESTTYPE +_LICENSEREQUEST.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION +_LICENSEREQUEST.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_LICENSEREQUEST_REQUESTTYPE.containing_type = _LICENSEREQUEST +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE +_LICENSEREQUESTRAW_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUESTRAW +_LICENSEREQUESTRAW.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION +_LICENSEREQUESTRAW.fields_by_name['ContentId'].message_type = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION +_LICENSEREQUESTRAW.fields_by_name['Type'].enum_type = _LICENSEREQUESTRAW_REQUESTTYPE +_LICENSEREQUESTRAW.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION +_LICENSEREQUESTRAW.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_LICENSEREQUESTRAW_REQUESTTYPE.containing_type = _LICENSEREQUESTRAW +_PROVISIONEDDEVICEINFO.fields_by_name['SecurityLevel'].enum_type = _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL.containing_type = _PROVISIONEDDEVICEINFO +_REMOTEATTESTATION.fields_by_name['Certificate'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_SIGNEDDEVICECERTIFICATE.fields_by_name['_DeviceCertificate'].message_type = _DEVICECERTIFICATE +_SIGNEDDEVICECERTIFICATE.fields_by_name['Signer'].message_type = _SIGNEDDEVICECERTIFICATE +_SIGNEDMESSAGE.fields_by_name['Type'].enum_type = _SIGNEDMESSAGE_MESSAGETYPE +_SIGNEDMESSAGE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDMESSAGE_MESSAGETYPE.containing_type = _SIGNEDMESSAGE +_WIDEVINECENCHEADER.fields_by_name['algorithm'].enum_type = _WIDEVINECENCHEADER_ALGORITHM +_WIDEVINECENCHEADER_ALGORITHM.containing_type = _WIDEVINECENCHEADER +_SIGNEDLICENSEREQUEST.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUEST_MESSAGETYPE +_SIGNEDLICENSEREQUEST.fields_by_name['Msg'].message_type = _LICENSEREQUEST +_SIGNEDLICENSEREQUEST.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSEREQUEST_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUEST +_SIGNEDLICENSEREQUESTRAW.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUESTRAW_MESSAGETYPE +_SIGNEDLICENSEREQUESTRAW.fields_by_name['Msg'].message_type = _LICENSEREQUESTRAW +_SIGNEDLICENSEREQUESTRAW.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSEREQUESTRAW_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUESTRAW +_SIGNEDLICENSE.fields_by_name['Type'].enum_type = _SIGNEDLICENSE_MESSAGETYPE +_SIGNEDLICENSE.fields_by_name['Msg'].message_type = _LICENSE +_SIGNEDLICENSE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSE_MESSAGETYPE.containing_type = _SIGNEDLICENSE +_SIGNEDSERVICECERTIFICATE.fields_by_name['Type'].enum_type = _SIGNEDSERVICECERTIFICATE_MESSAGETYPE +_SIGNEDSERVICECERTIFICATE.fields_by_name['Msg'].message_type = _SIGNEDDEVICECERTIFICATE +_SIGNEDSERVICECERTIFICATE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDSERVICECERTIFICATE_MESSAGETYPE.containing_type = _SIGNEDSERVICECERTIFICATE +_FILEHASHES_SIGNATURE.containing_type = _FILEHASHES +_FILEHASHES.fields_by_name['signatures'].message_type = _FILEHASHES_SIGNATURE +DESCRIPTOR.message_types_by_name['ClientIdentification'] = _CLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['DeviceCertificate'] = _DEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['DeviceCertificateStatus'] = _DEVICECERTIFICATESTATUS +DESCRIPTOR.message_types_by_name['DeviceCertificateStatusList'] = _DEVICECERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['EncryptedClientIdentification'] = _ENCRYPTEDCLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['LicenseIdentification'] = _LICENSEIDENTIFICATION +DESCRIPTOR.message_types_by_name['License'] = _LICENSE +DESCRIPTOR.message_types_by_name['LicenseError'] = _LICENSEERROR +DESCRIPTOR.message_types_by_name['LicenseRequest'] = _LICENSEREQUEST +DESCRIPTOR.message_types_by_name['LicenseRequestRaw'] = _LICENSEREQUESTRAW +DESCRIPTOR.message_types_by_name['ProvisionedDeviceInfo'] = _PROVISIONEDDEVICEINFO +DESCRIPTOR.message_types_by_name['ProvisioningOptions'] = _PROVISIONINGOPTIONS +DESCRIPTOR.message_types_by_name['ProvisioningRequest'] = _PROVISIONINGREQUEST +DESCRIPTOR.message_types_by_name['ProvisioningResponse'] = _PROVISIONINGRESPONSE +DESCRIPTOR.message_types_by_name['RemoteAttestation'] = _REMOTEATTESTATION +DESCRIPTOR.message_types_by_name['SessionInit'] = _SESSIONINIT +DESCRIPTOR.message_types_by_name['SessionState'] = _SESSIONSTATE +DESCRIPTOR.message_types_by_name['SignedCertificateStatusList'] = _SIGNEDCERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['SignedDeviceCertificate'] = _SIGNEDDEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['SignedProvisioningMessage'] = _SIGNEDPROVISIONINGMESSAGE +DESCRIPTOR.message_types_by_name['SignedMessage'] = _SIGNEDMESSAGE +DESCRIPTOR.message_types_by_name['WidevineCencHeader'] = _WIDEVINECENCHEADER +DESCRIPTOR.message_types_by_name['SignedLicenseRequest'] = _SIGNEDLICENSEREQUEST +DESCRIPTOR.message_types_by_name['SignedLicenseRequestRaw'] = _SIGNEDLICENSEREQUESTRAW +DESCRIPTOR.message_types_by_name['SignedLicense'] = _SIGNEDLICENSE +DESCRIPTOR.message_types_by_name['SignedServiceCertificate'] = _SIGNEDSERVICECERTIFICATE +DESCRIPTOR.message_types_by_name['FileHashes'] = _FILEHASHES +DESCRIPTOR.enum_types_by_name['LicenseType'] = _LICENSETYPE +DESCRIPTOR.enum_types_by_name['ProtocolVersion'] = _PROTOCOLVERSION + +ClientIdentification = _reflection.GeneratedProtocolMessageType('ClientIdentification', (_message.Message,), dict( + + NameValue = _reflection.GeneratedProtocolMessageType('NameValue', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_NAMEVALUE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.NameValue) + )) + , + + ClientCapabilities = _reflection.GeneratedProtocolMessageType('ClientCapabilities', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.ClientCapabilities) + )) + , + DESCRIPTOR = _CLIENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification) + )) +_sym_db.RegisterMessage(ClientIdentification) +_sym_db.RegisterMessage(ClientIdentification.NameValue) +_sym_db.RegisterMessage(ClientIdentification.ClientCapabilities) + +DeviceCertificate = _reflection.GeneratedProtocolMessageType('DeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificate) + )) +_sym_db.RegisterMessage(DeviceCertificate) + +DeviceCertificateStatus = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatus', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUS, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatus) + )) +_sym_db.RegisterMessage(DeviceCertificateStatus) + +DeviceCertificateStatusList = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUSLIST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatusList) + )) +_sym_db.RegisterMessage(DeviceCertificateStatusList) + +EncryptedClientIdentification = _reflection.GeneratedProtocolMessageType('EncryptedClientIdentification', (_message.Message,), dict( + DESCRIPTOR = _ENCRYPTEDCLIENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:EncryptedClientIdentification) + )) +_sym_db.RegisterMessage(EncryptedClientIdentification) + +LicenseIdentification = _reflection.GeneratedProtocolMessageType('LicenseIdentification', (_message.Message,), dict( + DESCRIPTOR = _LICENSEIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseIdentification) + )) +_sym_db.RegisterMessage(LicenseIdentification) + +License = _reflection.GeneratedProtocolMessageType('License', (_message.Message,), dict( + + Policy = _reflection.GeneratedProtocolMessageType('Policy', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_POLICY, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.Policy) + )) + , + + KeyContainer = _reflection.GeneratedProtocolMessageType('KeyContainer', (_message.Message,), dict( + + OutputProtection = _reflection.GeneratedProtocolMessageType('OutputProtection', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OutputProtection) + )) + , + + KeyControl = _reflection.GeneratedProtocolMessageType('KeyControl', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_KEYCONTROL, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.KeyControl) + )) + , + + OperatorSessionKeyPermissions = _reflection.GeneratedProtocolMessageType('OperatorSessionKeyPermissions', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OperatorSessionKeyPermissions) + )) + , + + VideoResolutionConstraint = _reflection.GeneratedProtocolMessageType('VideoResolutionConstraint', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.VideoResolutionConstraint) + )) + , + DESCRIPTOR = _LICENSE_KEYCONTAINER, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer) + )) + , + DESCRIPTOR = _LICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:License) + )) +_sym_db.RegisterMessage(License) +_sym_db.RegisterMessage(License.Policy) +_sym_db.RegisterMessage(License.KeyContainer) +_sym_db.RegisterMessage(License.KeyContainer.OutputProtection) +_sym_db.RegisterMessage(License.KeyContainer.KeyControl) +_sym_db.RegisterMessage(License.KeyContainer.OperatorSessionKeyPermissions) +_sym_db.RegisterMessage(License.KeyContainer.VideoResolutionConstraint) + +LicenseError = _reflection.GeneratedProtocolMessageType('LicenseError', (_message.Message,), dict( + DESCRIPTOR = _LICENSEERROR, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseError) + )) +_sym_db.RegisterMessage(LicenseError) + +LicenseRequest = _reflection.GeneratedProtocolMessageType('LicenseRequest', (_message.Message,), dict( + + ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( + + CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.CENC) + )) + , + + WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.WebM) + )) + , + + ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.ExistingLicense) + )) + , + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification) + )) + , + DESCRIPTOR = _LICENSEREQUEST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest) + )) +_sym_db.RegisterMessage(LicenseRequest) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.CENC) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.WebM) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.ExistingLicense) + +LicenseRequestRaw = _reflection.GeneratedProtocolMessageType('LicenseRequestRaw', (_message.Message,), dict( + + ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( + + CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification.CENC) + )) + , + + WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification.WebM) + )) + , + + ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification.ExistingLicense) + )) + , + DESCRIPTOR = _LICENSEREQUESTRAW_CONTENTIDENTIFICATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw.ContentIdentification) + )) + , + DESCRIPTOR = _LICENSEREQUESTRAW, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequestRaw) + )) +_sym_db.RegisterMessage(LicenseRequestRaw) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification.CENC) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification.WebM) +_sym_db.RegisterMessage(LicenseRequestRaw.ContentIdentification.ExistingLicense) + +ProvisionedDeviceInfo = _reflection.GeneratedProtocolMessageType('ProvisionedDeviceInfo', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONEDDEVICEINFO, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisionedDeviceInfo) + )) +_sym_db.RegisterMessage(ProvisionedDeviceInfo) + +ProvisioningOptions = _reflection.GeneratedProtocolMessageType('ProvisioningOptions', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGOPTIONS, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningOptions) + )) +_sym_db.RegisterMessage(ProvisioningOptions) + +ProvisioningRequest = _reflection.GeneratedProtocolMessageType('ProvisioningRequest', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGREQUEST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningRequest) + )) +_sym_db.RegisterMessage(ProvisioningRequest) + +ProvisioningResponse = _reflection.GeneratedProtocolMessageType('ProvisioningResponse', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGRESPONSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningResponse) + )) +_sym_db.RegisterMessage(ProvisioningResponse) + +RemoteAttestation = _reflection.GeneratedProtocolMessageType('RemoteAttestation', (_message.Message,), dict( + DESCRIPTOR = _REMOTEATTESTATION, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:RemoteAttestation) + )) +_sym_db.RegisterMessage(RemoteAttestation) + +SessionInit = _reflection.GeneratedProtocolMessageType('SessionInit', (_message.Message,), dict( + DESCRIPTOR = _SESSIONINIT, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SessionInit) + )) +_sym_db.RegisterMessage(SessionInit) + +SessionState = _reflection.GeneratedProtocolMessageType('SessionState', (_message.Message,), dict( + DESCRIPTOR = _SESSIONSTATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SessionState) + )) +_sym_db.RegisterMessage(SessionState) + +SignedCertificateStatusList = _reflection.GeneratedProtocolMessageType('SignedCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDCERTIFICATESTATUSLIST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedCertificateStatusList) + )) +_sym_db.RegisterMessage(SignedCertificateStatusList) + +SignedDeviceCertificate = _reflection.GeneratedProtocolMessageType('SignedDeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDDEVICECERTIFICATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedDeviceCertificate) + )) +_sym_db.RegisterMessage(SignedDeviceCertificate) + +SignedProvisioningMessage = _reflection.GeneratedProtocolMessageType('SignedProvisioningMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDPROVISIONINGMESSAGE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedProvisioningMessage) + )) +_sym_db.RegisterMessage(SignedProvisioningMessage) + +SignedMessage = _reflection.GeneratedProtocolMessageType('SignedMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDMESSAGE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedMessage) + )) +_sym_db.RegisterMessage(SignedMessage) + +WidevineCencHeader = _reflection.GeneratedProtocolMessageType('WidevineCencHeader', (_message.Message,), dict( + DESCRIPTOR = _WIDEVINECENCHEADER, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:WidevineCencHeader) + )) +_sym_db.RegisterMessage(WidevineCencHeader) + +SignedLicenseRequest = _reflection.GeneratedProtocolMessageType('SignedLicenseRequest', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSEREQUEST, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedLicenseRequest) + )) +_sym_db.RegisterMessage(SignedLicenseRequest) + +SignedLicenseRequestRaw = _reflection.GeneratedProtocolMessageType('SignedLicenseRequestRaw', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSEREQUESTRAW, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedLicenseRequestRaw) + )) +_sym_db.RegisterMessage(SignedLicenseRequestRaw) + +SignedLicense = _reflection.GeneratedProtocolMessageType('SignedLicense', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedLicense) + )) +_sym_db.RegisterMessage(SignedLicense) + +SignedServiceCertificate = _reflection.GeneratedProtocolMessageType('SignedServiceCertificate', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDSERVICECERTIFICATE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:SignedServiceCertificate) + )) +_sym_db.RegisterMessage(SignedServiceCertificate) + +FileHashes = _reflection.GeneratedProtocolMessageType('FileHashes', (_message.Message,), dict( + + Signature = _reflection.GeneratedProtocolMessageType('Signature', (_message.Message,), dict( + DESCRIPTOR = _FILEHASHES_SIGNATURE, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:FileHashes.Signature) + )) + , + DESCRIPTOR = _FILEHASHES, + __module__ = 'pywidevine.cdm.formats.wv_proto2_pb2' + # @@protoc_insertion_point(class_scope:FileHashes) + )) +_sym_db.RegisterMessage(FileHashes) +_sym_db.RegisterMessage(FileHashes.Signature) + + +# @@protoc_insertion_point(module_scope) diff --git a/pywidevine/cdm/formats/wv_proto3.proto b/pywidevine/cdm/formats/wv_proto3.proto new file mode 100644 index 0000000..7861b02 --- /dev/null +++ b/pywidevine/cdm/formats/wv_proto3.proto @@ -0,0 +1,389 @@ +// beware proto3 won't show missing fields it seems, need to change to "proto2" and add "optional" before every field, and remove all the dummy enum members I added: +syntax = "proto3"; + +// from x86 (partial), most of it from the ARM version: +message ClientIdentification { + enum TokenType { + KEYBOX = 0; + DEVICE_CERTIFICATE = 1; + REMOTE_ATTESTATION_CERTIFICATE = 2; + } + message NameValue { + string Name = 1; + string Value = 2; + } + message ClientCapabilities { + enum HdcpVersion { + HDCP_NONE = 0; + HDCP_V1 = 1; + HDCP_V2 = 2; + HDCP_V2_1 = 3; + HDCP_V2_2 = 4; + } + uint32 ClientToken = 1; + uint32 SessionToken = 2; + uint32 VideoResolutionConstraints = 3; + HdcpVersion MaxHdcpVersion = 4; + uint32 OemCryptoApiVersion = 5; + } + TokenType Type = 1; + //bytes Token = 2; // by default the client treats this as blob, but it's usually a DeviceCertificate, so for usefulness sake, I'm replacing it with this one: + SignedDeviceCertificate Token = 2; + repeated NameValue ClientInfo = 3; + bytes ProviderClientToken = 4; + uint32 LicenseCounter = 5; + ClientCapabilities _ClientCapabilities = 6; // how should we deal with duped names? will have to look at proto docs later +} + +message DeviceCertificate { + enum CertificateType { + ROOT = 0; + INTERMEDIATE = 1; + USER_DEVICE = 2; + SERVICE = 3; + } + //ProvisionedDeviceInfo.WvSecurityLevel Type = 1; // is this how one is supposed to call it? (it's an enum) there might be a bug here, with CertificateType getting confused with WvSecurityLevel, for now renaming it (verify against other binaries) + CertificateType Type = 1; + bytes SerialNumber = 2; + uint32 CreationTimeSeconds = 3; + bytes PublicKey = 4; + uint32 SystemId = 5; + uint32 TestDeviceDeprecated = 6; // is it bool or int? + bytes ServiceId = 7; // service URL for service certificates +} + +// missing some references, +message DeviceCertificateStatus { + enum CertificateStatus { + VALID = 0; + REVOKED = 1; + } + bytes SerialNumber = 1; + CertificateStatus Status = 2; + ProvisionedDeviceInfo DeviceInfo = 4; // where is 3? is it deprecated? +} + +message DeviceCertificateStatusList { + uint32 CreationTimeSeconds = 1; + repeated DeviceCertificateStatus CertificateStatus = 2; +} + +message EncryptedClientIdentification { + string ServiceId = 1; + bytes ServiceCertificateSerialNumber = 2; + bytes EncryptedClientId = 3; + bytes EncryptedClientIdIv = 4; + bytes EncryptedPrivacyKey = 5; +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +enum LicenseType { + ZERO = 0; + DEFAULT = 1; // do not know what this is either, but should be 1; on recent versions may go up to 3 (latest x86) +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +// this is just a guess because these globals got lost, but really, do we need more? +enum ProtocolVersion { + DUMMY = 0; + CURRENT = 21; // don't have symbols for this +} + + +message LicenseIdentification { + bytes RequestId = 1; + bytes SessionId = 2; + bytes PurchaseId = 3; + LicenseType Type = 4; + uint32 Version = 5; + bytes ProviderSessionToken = 6; +} + + +message License { + message Policy { + uint32 CanPlay = 1; + uint32 CanPersist = 2; + uint32 CanRenew = 3; + uint32 RentalDurationSeconds = 4; + uint32 PlaybackDurationSeconds = 5; + uint32 LicenseDurationSeconds = 6; + uint32 RenewalRecoveryDurationSeconds = 7; + string RenewalServerUrl = 8; + uint32 RenewalDelaySeconds = 9; + uint32 RenewalRetryIntervalSeconds = 10; + uint32 RenewWithUsage = 11; + uint32 UnknownPolicy12 = 12; + } + message KeyContainer { + enum KeyType { + _NOKEYTYPE = 0; // dummy, added to satisfy proto3, not present in original + SIGNING = 1; + CONTENT = 2; + KEY_CONTROL = 3; + OPERATOR_SESSION = 4; + } + enum SecurityLevel { + _NOSECLEVEL = 0; // dummy, added to satisfy proto3, not present in original + SW_SECURE_CRYPTO = 1; + SW_SECURE_DECODE = 2; + HW_SECURE_CRYPTO = 3; + HW_SECURE_DECODE = 4; + HW_SECURE_ALL = 5; + } + message OutputProtection { + enum CGMS { + COPY_FREE = 0; + COPY_ONCE = 2; + COPY_NEVER = 3; + CGMS_NONE = 0x2A; // PC default! + } + ClientIdentification.ClientCapabilities.HdcpVersion Hdcp = 1; // it's most likely a copy of Hdcp version available here, but compiler optimized it away + CGMS CgmsFlags = 2; + } + message KeyControl { + bytes KeyControlBlock = 1; // what is this? + bytes Iv = 2; + } + message OperatorSessionKeyPermissions { + uint32 AllowEncrypt = 1; + uint32 AllowDecrypt = 2; + uint32 AllowSign = 3; + uint32 AllowSignatureVerify = 4; + } + message VideoResolutionConstraint { + uint32 MinResolutionPixels = 1; + uint32 MaxResolutionPixels = 2; + OutputProtection RequiredProtection = 3; + } + bytes Id = 1; + bytes Iv = 2; + bytes Key = 3; + KeyType Type = 4; + SecurityLevel Level = 5; + OutputProtection RequiredProtection = 6; + OutputProtection RequestedProtection = 7; + KeyControl _KeyControl = 8; // duped names, etc + OperatorSessionKeyPermissions _OperatorSessionKeyPermissions = 9; // duped names, etc + repeated VideoResolutionConstraint VideoResolutionConstraints = 10; + } + LicenseIdentification Id = 1; + Policy _Policy = 2; // duped names, etc + repeated KeyContainer Key = 3; + uint32 LicenseStartTime = 4; + uint32 RemoteAttestationVerified = 5; // bool? + bytes ProviderClientToken = 6; + // there might be more, check with newer versions (I see field 7-8 in a lic) + // this appeared in latest x86: + uint32 ProtectionScheme = 7; // type unconfirmed fully, but it's likely as WidevineCencHeader describesit (fourcc) + bytes UnknownHdcpDataField = 8; +} + +message LicenseError { + enum Error { + DUMMY_NO_ERROR = 0; // dummy, added to satisfy proto3 + INVALID_DEVICE_CERTIFICATE = 1; + REVOKED_DEVICE_CERTIFICATE = 2; + SERVICE_UNAVAILABLE = 3; + } + //LicenseRequest.RequestType ErrorCode; // clang mismatch + Error ErrorCode = 1; +} + +message LicenseRequest { + message ContentIdentification { + message CENC { + // bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + WidevineCencHeader Pssh = 1; + LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 + bytes RequestId = 3; + } + message WebM { + bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used + LicenseType LicenseType = 2; + bytes RequestId = 3; + } + message ExistingLicense { + LicenseIdentification LicenseId = 1; + uint32 SecondsSinceStarted = 2; + uint32 SecondsSinceLastPlayed = 3; + bytes SessionUsageTableEntry = 4; + } + CENC CencId = 1; + WebM WebmId = 2; + ExistingLicense License = 3; + } + enum RequestType { + DUMMY_REQ_TYPE = 0; // dummy, added to satisfy proto3 + NEW = 1; + RENEWAL = 2; + RELEASE = 3; + } + ClientIdentification ClientId = 1; + ContentIdentification ContentId = 2; + RequestType Type = 3; + uint32 RequestTime = 4; + bytes KeyControlNonceDeprecated = 5; + ProtocolVersion ProtocolVersion = 6; // lacking symbols for this + uint32 KeyControlNonce = 7; + EncryptedClientIdentification EncryptedClientId = 8; +} + +message ProvisionedDeviceInfo { + enum WvSecurityLevel { + LEVEL_UNSPECIFIED = 0; + LEVEL_1 = 1; + LEVEL_2 = 2; + LEVEL_3 = 3; + } + uint32 SystemId = 1; + string Soc = 2; + string Manufacturer = 3; + string Model = 4; + string DeviceType = 5; + uint32 ModelYear = 6; + WvSecurityLevel SecurityLevel = 7; + uint32 TestDevice = 8; // bool? +} + + +// todo: fill +message ProvisioningOptions { +} + +// todo: fill +message ProvisioningRequest { +} + +// todo: fill +message ProvisioningResponse { +} + +message RemoteAttestation { + EncryptedClientIdentification Certificate = 1; + string Salt = 2; + string Signature = 3; +} + +// todo: fill +message SessionInit { +} + +// todo: fill +message SessionState { +} + +// todo: fill +message SignedCertificateStatusList { +} + +message SignedDeviceCertificate { + + //bytes DeviceCertificate = 1; // again, they use a buffer where it's supposed to be a message, so we'll replace it with what it really is: + DeviceCertificate _DeviceCertificate = 1; // how should we deal with duped names? will have to look at proto docs later + bytes Signature = 2; + SignedDeviceCertificate Signer = 3; +} + + +// todo: fill +message SignedProvisioningMessage { +} + +// the root of all messages, from either server or client +message SignedMessage { + enum MessageType { + DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + bytes Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + bytes SessionKey = 4; // often RSA wrapped for licenses + RemoteAttestation RemoteAttestation = 5; +} + + + +// This message is copied from google's docs, not reversed: +message WidevineCencHeader { + enum Algorithm { + UNENCRYPTED = 0; + AESCTR = 1; + }; + Algorithm algorithm = 1; + repeated bytes key_id = 2; + + // Content provider name. + string provider = 3; + + // A content identifier, specified by content provider. + bytes content_id = 4; + + // Track type. Acceptable values are SD, HD and AUDIO. Used to + // differentiate content keys used by an asset. + string track_type_deprecated = 5; + + // The name of a registered policy to be used for this asset. + string policy = 6; + + // Crypto period index, for media using key rotation. + uint32 crypto_period_index = 7; + + // Optional protected context for group content. The grouped_license is a + // serialized SignedMessage. + bytes grouped_license = 8; + + // Protection scheme identifying the encryption algorithm. + // Represented as one of the following 4CC values: + // 'cenc' (AESCTR), 'cbc1' (AESCBC), + // 'cens' (AESCTR subsample), 'cbcs' (AESCBC subsample). + uint32 protection_scheme = 9; + + // Optional. For media using key rotation, this represents the duration + // of each crypto period in seconds. + uint32 crypto_period_seconds = 10; +} + + + + +// from here on, it's just for testing, these messages don't exist in the binaries, I'm adding them to avoid detecting type programmatically +message SignedLicenseRequest { + enum MessageType { + DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + LicenseRequest Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + bytes SessionKey = 4; // often RSA wrapped for licenses + RemoteAttestation RemoteAttestation = 5; +} + +message SignedLicense { + enum MessageType { + DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 + LICENSE_REQUEST = 1; + LICENSE = 2; + ERROR_RESPONSE = 3; + SERVICE_CERTIFICATE_REQUEST = 4; + SERVICE_CERTIFICATE = 5; + } + MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel + License Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + bytes SessionKey = 4; // often RSA wrapped for licenses + RemoteAttestation RemoteAttestation = 5; +} \ No newline at end of file diff --git a/pywidevine/cdm/formats/wv_proto3_pb2.py b/pywidevine/cdm/formats/wv_proto3_pb2.py new file mode 100644 index 0000000..11ae09f --- /dev/null +++ b/pywidevine/cdm/formats/wv_proto3_pb2.py @@ -0,0 +1,2686 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: wv_proto3.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='wv_proto3.proto', + package='', + syntax='proto3', + serialized_pb=_b('\n\x0fwv_proto3.proto\"\xc5\x05\n\x14\x43lientIdentification\x12-\n\x04Type\x18\x01 \x01(\x0e\x32\x1f.ClientIdentification.TokenType\x12\'\n\x05Token\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x33\n\nClientInfo\x18\x03 \x03(\x0b\x32\x1f.ClientIdentification.NameValue\x12\x1b\n\x13ProviderClientToken\x18\x04 \x01(\x0c\x12\x16\n\x0eLicenseCounter\x18\x05 \x01(\r\x12\x45\n\x13_ClientCapabilities\x18\x06 \x01(\x0b\x32(.ClientIdentification.ClientCapabilities\x1a(\n\tNameValue\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\r\n\x05Value\x18\x02 \x01(\t\x1a\xa4\x02\n\x12\x43lientCapabilities\x12\x13\n\x0b\x43lientToken\x18\x01 \x01(\r\x12\x14\n\x0cSessionToken\x18\x02 \x01(\r\x12\"\n\x1aVideoResolutionConstraints\x18\x03 \x01(\r\x12L\n\x0eMaxHdcpVersion\x18\x04 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12\x1b\n\x13OemCryptoApiVersion\x18\x05 \x01(\r\"T\n\x0bHdcpVersion\x12\r\n\tHDCP_NONE\x10\x00\x12\x0b\n\x07HDCP_V1\x10\x01\x12\x0b\n\x07HDCP_V2\x10\x02\x12\r\n\tHDCP_V2_1\x10\x03\x12\r\n\tHDCP_V2_2\x10\x04\"S\n\tTokenType\x12\n\n\x06KEYBOX\x10\x00\x12\x16\n\x12\x44\x45VICE_CERTIFICATE\x10\x01\x12\"\n\x1eREMOTE_ATTESTATION_CERTIFICATE\x10\x02\"\x9b\x02\n\x11\x44\x65viceCertificate\x12\x30\n\x04Type\x18\x01 \x01(\x0e\x32\".DeviceCertificate.CertificateType\x12\x14\n\x0cSerialNumber\x18\x02 \x01(\x0c\x12\x1b\n\x13\x43reationTimeSeconds\x18\x03 \x01(\r\x12\x11\n\tPublicKey\x18\x04 \x01(\x0c\x12\x10\n\x08SystemId\x18\x05 \x01(\r\x12\x1c\n\x14TestDeviceDeprecated\x18\x06 \x01(\r\x12\x11\n\tServiceId\x18\x07 \x01(\x0c\"K\n\x0f\x43\x65rtificateType\x12\x08\n\x04ROOT\x10\x00\x12\x10\n\x0cINTERMEDIATE\x10\x01\x12\x0f\n\x0bUSER_DEVICE\x10\x02\x12\x0b\n\x07SERVICE\x10\x03\"\xc4\x01\n\x17\x44\x65viceCertificateStatus\x12\x14\n\x0cSerialNumber\x18\x01 \x01(\x0c\x12:\n\x06Status\x18\x02 \x01(\x0e\x32*.DeviceCertificateStatus.CertificateStatus\x12*\n\nDeviceInfo\x18\x04 \x01(\x0b\x32\x16.ProvisionedDeviceInfo\"+\n\x11\x43\x65rtificateStatus\x12\t\n\x05VALID\x10\x00\x12\x0b\n\x07REVOKED\x10\x01\"o\n\x1b\x44\x65viceCertificateStatusList\x12\x1b\n\x13\x43reationTimeSeconds\x18\x01 \x01(\r\x12\x33\n\x11\x43\x65rtificateStatus\x18\x02 \x03(\x0b\x32\x18.DeviceCertificateStatus\"\xaf\x01\n\x1d\x45ncryptedClientIdentification\x12\x11\n\tServiceId\x18\x01 \x01(\t\x12&\n\x1eServiceCertificateSerialNumber\x18\x02 \x01(\x0c\x12\x19\n\x11\x45ncryptedClientId\x18\x03 \x01(\x0c\x12\x1b\n\x13\x45ncryptedClientIdIv\x18\x04 \x01(\x0c\x12\x1b\n\x13\x45ncryptedPrivacyKey\x18\x05 \x01(\x0c\"\x9c\x01\n\x15LicenseIdentification\x12\x11\n\tRequestId\x18\x01 \x01(\x0c\x12\x11\n\tSessionId\x18\x02 \x01(\x0c\x12\x12\n\nPurchaseId\x18\x03 \x01(\x0c\x12\x1a\n\x04Type\x18\x04 \x01(\x0e\x32\x0c.LicenseType\x12\x0f\n\x07Version\x18\x05 \x01(\r\x12\x1c\n\x14ProviderSessionToken\x18\x06 \x01(\x0c\"\xfa\x0e\n\x07License\x12\"\n\x02Id\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12 \n\x07_Policy\x18\x02 \x01(\x0b\x32\x0f.License.Policy\x12\"\n\x03Key\x18\x03 \x03(\x0b\x32\x15.License.KeyContainer\x12\x18\n\x10LicenseStartTime\x18\x04 \x01(\r\x12!\n\x19RemoteAttestationVerified\x18\x05 \x01(\r\x12\x1b\n\x13ProviderClientToken\x18\x06 \x01(\x0c\x12\x18\n\x10ProtectionScheme\x18\x07 \x01(\r\x12\x1c\n\x14UnknownHdcpDataField\x18\x08 \x01(\x0c\x1a\xd4\x02\n\x06Policy\x12\x0f\n\x07\x43\x61nPlay\x18\x01 \x01(\r\x12\x12\n\nCanPersist\x18\x02 \x01(\r\x12\x10\n\x08\x43\x61nRenew\x18\x03 \x01(\r\x12\x1d\n\x15RentalDurationSeconds\x18\x04 \x01(\r\x12\x1f\n\x17PlaybackDurationSeconds\x18\x05 \x01(\r\x12\x1e\n\x16LicenseDurationSeconds\x18\x06 \x01(\r\x12&\n\x1eRenewalRecoveryDurationSeconds\x18\x07 \x01(\r\x12\x18\n\x10RenewalServerUrl\x18\x08 \x01(\t\x12\x1b\n\x13RenewalDelaySeconds\x18\t \x01(\r\x12#\n\x1bRenewalRetryIntervalSeconds\x18\n \x01(\r\x12\x16\n\x0eRenewWithUsage\x18\x0b \x01(\r\x12\x17\n\x0fUnknownPolicy12\x18\x0c \x01(\r\x1a\x9b\n\n\x0cKeyContainer\x12\n\n\x02Id\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x12\x0b\n\x03Key\x18\x03 \x01(\x0c\x12+\n\x04Type\x18\x04 \x01(\x0e\x32\x1d.License.KeyContainer.KeyType\x12\x32\n\x05Level\x18\x05 \x01(\x0e\x32#.License.KeyContainer.SecurityLevel\x12\x42\n\x12RequiredProtection\x18\x06 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x43\n\x13RequestedProtection\x18\x07 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x35\n\x0b_KeyControl\x18\x08 \x01(\x0b\x32 .License.KeyContainer.KeyControl\x12[\n\x1e_OperatorSessionKeyPermissions\x18\t \x01(\x0b\x32\x33.License.KeyContainer.OperatorSessionKeyPermissions\x12S\n\x1aVideoResolutionConstraints\x18\n \x03(\x0b\x32/.License.KeyContainer.VideoResolutionConstraint\x1a\xdb\x01\n\x10OutputProtection\x12\x42\n\x04Hdcp\x18\x01 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12>\n\tCgmsFlags\x18\x02 \x01(\x0e\x32+.License.KeyContainer.OutputProtection.CGMS\"C\n\x04\x43GMS\x12\r\n\tCOPY_FREE\x10\x00\x12\r\n\tCOPY_ONCE\x10\x02\x12\x0e\n\nCOPY_NEVER\x10\x03\x12\r\n\tCGMS_NONE\x10*\x1a\x31\n\nKeyControl\x12\x17\n\x0fKeyControlBlock\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x1a|\n\x1dOperatorSessionKeyPermissions\x12\x14\n\x0c\x41llowEncrypt\x18\x01 \x01(\r\x12\x14\n\x0c\x41llowDecrypt\x18\x02 \x01(\r\x12\x11\n\tAllowSign\x18\x03 \x01(\r\x12\x1c\n\x14\x41llowSignatureVerify\x18\x04 \x01(\r\x1a\x99\x01\n\x19VideoResolutionConstraint\x12\x1b\n\x13MinResolutionPixels\x18\x01 \x01(\r\x12\x1b\n\x13MaxResolutionPixels\x18\x02 \x01(\r\x12\x42\n\x12RequiredProtection\x18\x03 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\"Z\n\x07KeyType\x12\x0e\n\n_NOKEYTYPE\x10\x00\x12\x0b\n\x07SIGNING\x10\x01\x12\x0b\n\x07\x43ONTENT\x10\x02\x12\x0f\n\x0bKEY_CONTROL\x10\x03\x12\x14\n\x10OPERATOR_SESSION\x10\x04\"\x8b\x01\n\rSecurityLevel\x12\x0f\n\x0b_NOSECLEVEL\x10\x00\x12\x14\n\x10SW_SECURE_CRYPTO\x10\x01\x12\x14\n\x10SW_SECURE_DECODE\x10\x02\x12\x14\n\x10HW_SECURE_CRYPTO\x10\x03\x12\x14\n\x10HW_SECURE_DECODE\x10\x04\x12\x11\n\rHW_SECURE_ALL\x10\x05\"\xac\x01\n\x0cLicenseError\x12&\n\tErrorCode\x18\x01 \x01(\x0e\x32\x13.LicenseError.Error\"t\n\x05\x45rror\x12\x12\n\x0e\x44UMMY_NO_ERROR\x10\x00\x12\x1e\n\x1aINVALID_DEVICE_CERTIFICATE\x10\x01\x12\x1e\n\x1aREVOKED_DEVICE_CERTIFICATE\x10\x02\x12\x17\n\x13SERVICE_UNAVAILABLE\x10\x03\"\xc0\x07\n\x0eLicenseRequest\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12\x38\n\tContentId\x18\x02 \x01(\x0b\x32%.LicenseRequest.ContentIdentification\x12)\n\x04Type\x18\x03 \x01(\x0e\x32\x1b.LicenseRequest.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\xa2\x04\n\x15\x43ontentIdentification\x12:\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.CENC\x12:\n\x06WebmId\x18\x02 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.WebM\x12\x46\n\x07License\x18\x03 \x01(\x0b\x32\x35.LicenseRequest.ContentIdentification.ExistingLicense\x1a_\n\x04\x43\x45NC\x12!\n\x04Pssh\x18\x01 \x01(\x0b\x32\x13.WidevineCencHeader\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"D\n\x0bRequestType\x12\x12\n\x0e\x44UMMY_REQ_TYPE\x10\x00\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa6\x02\n\x15ProvisionedDeviceInfo\x12\x10\n\x08SystemId\x18\x01 \x01(\r\x12\x0b\n\x03Soc\x18\x02 \x01(\t\x12\x14\n\x0cManufacturer\x18\x03 \x01(\t\x12\r\n\x05Model\x18\x04 \x01(\t\x12\x12\n\nDeviceType\x18\x05 \x01(\t\x12\x11\n\tModelYear\x18\x06 \x01(\r\x12=\n\rSecurityLevel\x18\x07 \x01(\x0e\x32&.ProvisionedDeviceInfo.WvSecurityLevel\x12\x12\n\nTestDevice\x18\x08 \x01(\r\"O\n\x0fWvSecurityLevel\x12\x15\n\x11LEVEL_UNSPECIFIED\x10\x00\x12\x0b\n\x07LEVEL_1\x10\x01\x12\x0b\n\x07LEVEL_2\x10\x02\x12\x0b\n\x07LEVEL_3\x10\x03\"\x15\n\x13ProvisioningOptions\"\x15\n\x13ProvisioningRequest\"\x16\n\x14ProvisioningResponse\"i\n\x11RemoteAttestation\x12\x33\n\x0b\x43\x65rtificate\x18\x01 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x12\x0c\n\x04Salt\x18\x02 \x01(\t\x12\x11\n\tSignature\x18\x03 \x01(\t\"\r\n\x0bSessionInit\"\x0e\n\x0cSessionState\"\x1d\n\x1bSignedCertificateStatusList\"\x86\x01\n\x17SignedDeviceCertificate\x12.\n\x12_DeviceCertificate\x18\x01 \x01(\x0b\x32\x12.DeviceCertificate\x12\x11\n\tSignature\x18\x02 \x01(\x0c\x12(\n\x06Signer\x18\x03 \x01(\x0b\x32\x18.SignedDeviceCertificate\"\x1b\n\x19SignedProvisioningMessage\"\xb0\x02\n\rSignedMessage\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedMessage.MessageType\x12\x0b\n\x03Msg\x18\x02 \x01(\x0c\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc5\x02\n\x12WidevineCencHeader\x12\x30\n\talgorithm\x18\x01 \x01(\x0e\x32\x1d.WidevineCencHeader.Algorithm\x12\x0e\n\x06key_id\x18\x02 \x03(\x0c\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c\x12\x1d\n\x15track_type_deprecated\x18\x05 \x01(\t\x12\x0e\n\x06policy\x18\x06 \x01(\t\x12\x1b\n\x13\x63rypto_period_index\x18\x07 \x01(\r\x12\x17\n\x0fgrouped_license\x18\x08 \x01(\x0c\x12\x19\n\x11protection_scheme\x18\t \x01(\r\x12\x1d\n\x15\x63rypto_period_seconds\x18\n \x01(\r\"(\n\tAlgorithm\x12\x0f\n\x0bUNENCRYPTED\x10\x00\x12\n\n\x06\x41\x45SCTR\x10\x01\"\xcf\x02\n\x14SignedLicenseRequest\x12/\n\x04Type\x18\x01 \x01(\x0e\x32!.SignedLicenseRequest.MessageType\x12\x1c\n\x03Msg\x18\x02 \x01(\x0b\x32\x0f.LicenseRequest\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xba\x02\n\rSignedLicense\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedLicense.MessageType\x12\x15\n\x03Msg\x18\x02 \x01(\x0b\x32\x08.License\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05*$\n\x0bLicenseType\x12\x08\n\x04ZERO\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01*)\n\x0fProtocolVersion\x12\t\n\x05\x44UMMY\x10\x00\x12\x0b\n\x07\x43URRENT\x10\x15\x62\x06proto3') +) + +_LICENSETYPE = _descriptor.EnumDescriptor( + name='LicenseType', + full_name='LicenseType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ZERO', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEFAULT', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6713, + serialized_end=6749, +) +_sym_db.RegisterEnumDescriptor(_LICENSETYPE) + +LicenseType = enum_type_wrapper.EnumTypeWrapper(_LICENSETYPE) +_PROTOCOLVERSION = _descriptor.EnumDescriptor( + name='ProtocolVersion', + full_name='ProtocolVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CURRENT', index=1, number=21, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6751, + serialized_end=6792, +) +_sym_db.RegisterEnumDescriptor(_PROTOCOLVERSION) + +ProtocolVersion = enum_type_wrapper.EnumTypeWrapper(_PROTOCOLVERSION) +ZERO = 0 +DEFAULT = 1 +DUMMY = 0 +CURRENT = 21 + + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION = _descriptor.EnumDescriptor( + name='HdcpVersion', + full_name='ClientIdentification.ClientCapabilities.HdcpVersion', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='HDCP_NONE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_1', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HDCP_V2_2', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=560, + serialized_end=644, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION) + +_CLIENTIDENTIFICATION_TOKENTYPE = _descriptor.EnumDescriptor( + name='TokenType', + full_name='ClientIdentification.TokenType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='KEYBOX', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DEVICE_CERTIFICATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REMOTE_ATTESTATION_CERTIFICATE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=646, + serialized_end=729, +) +_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_TOKENTYPE) + +_DEVICECERTIFICATE_CERTIFICATETYPE = _descriptor.EnumDescriptor( + name='CertificateType', + full_name='DeviceCertificate.CertificateType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ROOT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INTERMEDIATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='USER_DEVICE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=940, + serialized_end=1015, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATE_CERTIFICATETYPE) + +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS = _descriptor.EnumDescriptor( + name='CertificateStatus', + full_name='DeviceCertificateStatus.CertificateStatus', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='VALID', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1171, + serialized_end=1214, +) +_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS = _descriptor.EnumDescriptor( + name='CGMS', + full_name='License.KeyContainer.OutputProtection.CGMS', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='COPY_FREE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_ONCE', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='COPY_NEVER', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CGMS_NONE', index=3, number=42, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2947, + serialized_end=3014, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS) + +_LICENSE_KEYCONTAINER_KEYTYPE = _descriptor.EnumDescriptor( + name='KeyType', + full_name='License.KeyContainer.KeyType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='_NOKEYTYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SIGNING', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONTENT', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='KEY_CONTROL', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OPERATOR_SESSION', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3349, + serialized_end=3439, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_KEYTYPE) + +_LICENSE_KEYCONTAINER_SECURITYLEVEL = _descriptor.EnumDescriptor( + name='SecurityLevel', + full_name='License.KeyContainer.SecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='_NOSECLEVEL', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SW_SECURE_CRYPTO', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SW_SECURE_DECODE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_CRYPTO', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_DECODE', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='HW_SECURE_ALL', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3442, + serialized_end=3581, +) +_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_SECURITYLEVEL) + +_LICENSEERROR_ERROR = _descriptor.EnumDescriptor( + name='Error', + full_name='LicenseError.Error', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_NO_ERROR', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='INVALID_DEVICE_CERTIFICATE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REVOKED_DEVICE_CERTIFICATE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_UNAVAILABLE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3640, + serialized_end=3756, +) +_sym_db.RegisterEnumDescriptor(_LICENSEERROR_ERROR) + +_LICENSEREQUEST_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='LicenseRequest.RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_REQ_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='NEW', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RENEWAL', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='RELEASE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4651, + serialized_end=4719, +) +_sym_db.RegisterEnumDescriptor(_LICENSEREQUEST_REQUESTTYPE) + +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL = _descriptor.EnumDescriptor( + name='WvSecurityLevel', + full_name='ProvisionedDeviceInfo.WvSecurityLevel', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='LEVEL_UNSPECIFIED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_1', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_2', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEVEL_3', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=4937, + serialized_end=5016, +) +_sym_db.RegisterEnumDescriptor(_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL) + +_SIGNEDMESSAGE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedMessage.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_MSG_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5583, + serialized_end=5728, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDMESSAGE_MESSAGETYPE) + +_WIDEVINECENCHEADER_ALGORITHM = _descriptor.EnumDescriptor( + name='Algorithm', + full_name='WidevineCencHeader.Algorithm', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNENCRYPTED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='AESCTR', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=6016, + serialized_end=6056, +) +_sym_db.RegisterEnumDescriptor(_WIDEVINECENCHEADER_ALGORITHM) + +_SIGNEDLICENSEREQUEST_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicenseRequest.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_MSG_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5583, + serialized_end=5728, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUEST_MESSAGETYPE) + +_SIGNEDLICENSE_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='SignedLicense.MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='DUMMY_MSG_TYPE', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE_REQUEST', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LICENSE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR_RESPONSE', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SERVICE_CERTIFICATE', index=5, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=5583, + serialized_end=5728, +) +_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSE_MESSAGETYPE) + + +_CLIENTIDENTIFICATION_NAMEVALUE = _descriptor.Descriptor( + name='NameValue', + full_name='ClientIdentification.NameValue', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Name', full_name='ClientIdentification.NameValue.Name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Value', full_name='ClientIdentification.NameValue.Value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=309, + serialized_end=349, +) + +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES = _descriptor.Descriptor( + name='ClientCapabilities', + full_name='ClientIdentification.ClientCapabilities', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientToken', full_name='ClientIdentification.ClientCapabilities.ClientToken', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionToken', full_name='ClientIdentification.ClientCapabilities.SessionToken', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='ClientIdentification.ClientCapabilities.VideoResolutionConstraints', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxHdcpVersion', full_name='ClientIdentification.ClientCapabilities.MaxHdcpVersion', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='OemCryptoApiVersion', full_name='ClientIdentification.ClientCapabilities.OemCryptoApiVersion', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=352, + serialized_end=644, +) + +_CLIENTIDENTIFICATION = _descriptor.Descriptor( + name='ClientIdentification', + full_name='ClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='ClientIdentification.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Token', full_name='ClientIdentification.Token', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ClientInfo', full_name='ClientIdentification.ClientInfo', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='ClientIdentification.ProviderClientToken', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseCounter', full_name='ClientIdentification.LicenseCounter', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_ClientCapabilities', full_name='ClientIdentification._ClientCapabilities', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_CLIENTIDENTIFICATION_NAMEVALUE, _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, ], + enum_types=[ + _CLIENTIDENTIFICATION_TOKENTYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=20, + serialized_end=729, +) + + +_DEVICECERTIFICATE = _descriptor.Descriptor( + name='DeviceCertificate', + full_name='DeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='DeviceCertificate.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificate.SerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificate.CreationTimeSeconds', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PublicKey', full_name='DeviceCertificate.PublicKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SystemId', full_name='DeviceCertificate.SystemId', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDeviceDeprecated', full_name='DeviceCertificate.TestDeviceDeprecated', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceId', full_name='DeviceCertificate.ServiceId', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATE_CERTIFICATETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=732, + serialized_end=1015, +) + + +_DEVICECERTIFICATESTATUS = _descriptor.Descriptor( + name='DeviceCertificateStatus', + full_name='DeviceCertificateStatus', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SerialNumber', full_name='DeviceCertificateStatus.SerialNumber', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Status', full_name='DeviceCertificateStatus.Status', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceInfo', full_name='DeviceCertificateStatus.DeviceInfo', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1018, + serialized_end=1214, +) + + +_DEVICECERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='DeviceCertificateStatusList', + full_name='DeviceCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CreationTimeSeconds', full_name='DeviceCertificateStatusList.CreationTimeSeconds', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CertificateStatus', full_name='DeviceCertificateStatusList.CertificateStatus', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1216, + serialized_end=1327, +) + + +_ENCRYPTEDCLIENTIDENTIFICATION = _descriptor.Descriptor( + name='EncryptedClientIdentification', + full_name='EncryptedClientIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ServiceId', full_name='EncryptedClientIdentification.ServiceId', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ServiceCertificateSerialNumber', full_name='EncryptedClientIdentification.ServiceCertificateSerialNumber', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='EncryptedClientIdentification.EncryptedClientId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientIdIv', full_name='EncryptedClientIdentification.EncryptedClientIdIv', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedPrivacyKey', full_name='EncryptedClientIdentification.EncryptedPrivacyKey', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1330, + serialized_end=1505, +) + + +_LICENSEIDENTIFICATION = _descriptor.Descriptor( + name='LicenseIdentification', + full_name='LicenseIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseIdentification.RequestId', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionId', full_name='LicenseIdentification.SessionId', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PurchaseId', full_name='LicenseIdentification.PurchaseId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseIdentification.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Version', full_name='LicenseIdentification.Version', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderSessionToken', full_name='LicenseIdentification.ProviderSessionToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1508, + serialized_end=1664, +) + + +_LICENSE_POLICY = _descriptor.Descriptor( + name='Policy', + full_name='License.Policy', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CanPlay', full_name='License.Policy.CanPlay', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanPersist', full_name='License.Policy.CanPersist', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CanRenew', full_name='License.Policy.CanRenew', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RentalDurationSeconds', full_name='License.Policy.RentalDurationSeconds', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='PlaybackDurationSeconds', full_name='License.Policy.PlaybackDurationSeconds', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseDurationSeconds', full_name='License.Policy.LicenseDurationSeconds', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRecoveryDurationSeconds', full_name='License.Policy.RenewalRecoveryDurationSeconds', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalServerUrl', full_name='License.Policy.RenewalServerUrl', index=7, + number=8, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalDelaySeconds', full_name='License.Policy.RenewalDelaySeconds', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewalRetryIntervalSeconds', full_name='License.Policy.RenewalRetryIntervalSeconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RenewWithUsage', full_name='License.Policy.RenewWithUsage', index=10, + number=11, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='UnknownPolicy12', full_name='License.Policy.UnknownPolicy12', index=11, + number=12, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1931, + serialized_end=2271, +) + +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION = _descriptor.Descriptor( + name='OutputProtection', + full_name='License.KeyContainer.OutputProtection', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Hdcp', full_name='License.KeyContainer.OutputProtection.Hdcp', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='CgmsFlags', full_name='License.KeyContainer.OutputProtection.CgmsFlags', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2795, + serialized_end=3014, +) + +_LICENSE_KEYCONTAINER_KEYCONTROL = _descriptor.Descriptor( + name='KeyControl', + full_name='License.KeyContainer.KeyControl', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='KeyControlBlock', full_name='License.KeyContainer.KeyControl.KeyControlBlock', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.KeyControl.Iv', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3016, + serialized_end=3065, +) + +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS = _descriptor.Descriptor( + name='OperatorSessionKeyPermissions', + full_name='License.KeyContainer.OperatorSessionKeyPermissions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='AllowEncrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowEncrypt', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowDecrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowDecrypt', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSign', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSign', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='AllowSignatureVerify', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSignatureVerify', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3067, + serialized_end=3191, +) + +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT = _descriptor.Descriptor( + name='VideoResolutionConstraint', + full_name='License.KeyContainer.VideoResolutionConstraint', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='MinResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MinResolutionPixels', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='MaxResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MaxResolutionPixels', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.VideoResolutionConstraint.RequiredProtection', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3194, + serialized_end=3347, +) + +_LICENSE_KEYCONTAINER = _descriptor.Descriptor( + name='KeyContainer', + full_name='License.KeyContainer', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.KeyContainer.Id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Iv', full_name='License.KeyContainer.Iv', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.KeyContainer.Key', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='License.KeyContainer.Type', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Level', full_name='License.KeyContainer.Level', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequiredProtection', full_name='License.KeyContainer.RequiredProtection', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestedProtection', full_name='License.KeyContainer.RequestedProtection', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_KeyControl', full_name='License.KeyContainer._KeyControl', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_OperatorSessionKeyPermissions', full_name='License.KeyContainer._OperatorSessionKeyPermissions', index=8, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='VideoResolutionConstraints', full_name='License.KeyContainer.VideoResolutionConstraints', index=9, + number=10, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_KEYCONTAINER_OUTPUTPROTECTION, _LICENSE_KEYCONTAINER_KEYCONTROL, _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, ], + enum_types=[ + _LICENSE_KEYCONTAINER_KEYTYPE, + _LICENSE_KEYCONTAINER_SECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2274, + serialized_end=3581, +) + +_LICENSE = _descriptor.Descriptor( + name='License', + full_name='License', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Id', full_name='License.Id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='_Policy', full_name='License._Policy', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Key', full_name='License.Key', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseStartTime', full_name='License.LicenseStartTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestationVerified', full_name='License.RemoteAttestationVerified', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProviderClientToken', full_name='License.ProviderClientToken', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtectionScheme', full_name='License.ProtectionScheme', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='UnknownHdcpDataField', full_name='License.UnknownHdcpDataField', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSE_POLICY, _LICENSE_KEYCONTAINER, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1667, + serialized_end=3581, +) + + +_LICENSEERROR = _descriptor.Descriptor( + name='LicenseError', + full_name='LicenseError', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ErrorCode', full_name='LicenseError.ErrorCode', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _LICENSEERROR_ERROR, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3584, + serialized_end=3756, +) + + +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( + name='CENC', + full_name='LicenseRequest.ContentIdentification.CENC', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Pssh', full_name='LicenseRequest.ContentIdentification.CENC.Pssh', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.CENC.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.CENC.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4320, + serialized_end=4415, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( + name='WebM', + full_name='LicenseRequest.ContentIdentification.WebM', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Header', full_name='LicenseRequest.ContentIdentification.WebM.Header', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='LicenseType', full_name='LicenseRequest.ContentIdentification.WebM.LicenseType', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestId', full_name='LicenseRequest.ContentIdentification.WebM.RequestId', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4417, + serialized_end=4493, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( + name='ExistingLicense', + full_name='LicenseRequest.ContentIdentification.ExistingLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='LicenseId', full_name='LicenseRequest.ContentIdentification.ExistingLicense.LicenseId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceStarted', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecondsSinceLastPlayed', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionUsageTableEntry', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4496, + serialized_end=4649, +) + +_LICENSEREQUEST_CONTENTIDENTIFICATION = _descriptor.Descriptor( + name='ContentIdentification', + full_name='LicenseRequest.ContentIdentification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='CencId', full_name='LicenseRequest.ContentIdentification.CencId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='WebmId', full_name='LicenseRequest.ContentIdentification.WebmId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='License', full_name='LicenseRequest.ContentIdentification.License', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4103, + serialized_end=4649, +) + +_LICENSEREQUEST = _descriptor.Descriptor( + name='LicenseRequest', + full_name='LicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ClientId', full_name='LicenseRequest.ClientId', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ContentId', full_name='LicenseRequest.ContentId', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Type', full_name='LicenseRequest.Type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RequestTime', full_name='LicenseRequest.RequestTime', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonceDeprecated', full_name='LicenseRequest.KeyControlNonceDeprecated', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ProtocolVersion', full_name='LicenseRequest.ProtocolVersion', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='KeyControlNonce', full_name='LicenseRequest.KeyControlNonce', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='EncryptedClientId', full_name='LicenseRequest.EncryptedClientId', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION, ], + enum_types=[ + _LICENSEREQUEST_REQUESTTYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=3759, + serialized_end=4719, +) + + +_PROVISIONEDDEVICEINFO = _descriptor.Descriptor( + name='ProvisionedDeviceInfo', + full_name='ProvisionedDeviceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='SystemId', full_name='ProvisionedDeviceInfo.SystemId', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Soc', full_name='ProvisionedDeviceInfo.Soc', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Manufacturer', full_name='ProvisionedDeviceInfo.Manufacturer', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Model', full_name='ProvisionedDeviceInfo.Model', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='DeviceType', full_name='ProvisionedDeviceInfo.DeviceType', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ModelYear', full_name='ProvisionedDeviceInfo.ModelYear', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SecurityLevel', full_name='ProvisionedDeviceInfo.SecurityLevel', index=6, + number=7, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='TestDevice', full_name='ProvisionedDeviceInfo.TestDevice', index=7, + number=8, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=4722, + serialized_end=5016, +) + + +_PROVISIONINGOPTIONS = _descriptor.Descriptor( + name='ProvisioningOptions', + full_name='ProvisioningOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5018, + serialized_end=5039, +) + + +_PROVISIONINGREQUEST = _descriptor.Descriptor( + name='ProvisioningRequest', + full_name='ProvisioningRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5041, + serialized_end=5062, +) + + +_PROVISIONINGRESPONSE = _descriptor.Descriptor( + name='ProvisioningResponse', + full_name='ProvisioningResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5064, + serialized_end=5086, +) + + +_REMOTEATTESTATION = _descriptor.Descriptor( + name='RemoteAttestation', + full_name='RemoteAttestation', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Certificate', full_name='RemoteAttestation.Certificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Salt', full_name='RemoteAttestation.Salt', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='RemoteAttestation.Signature', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5088, + serialized_end=5193, +) + + +_SESSIONINIT = _descriptor.Descriptor( + name='SessionInit', + full_name='SessionInit', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5195, + serialized_end=5208, +) + + +_SESSIONSTATE = _descriptor.Descriptor( + name='SessionState', + full_name='SessionState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5210, + serialized_end=5224, +) + + +_SIGNEDCERTIFICATESTATUSLIST = _descriptor.Descriptor( + name='SignedCertificateStatusList', + full_name='SignedCertificateStatusList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5226, + serialized_end=5255, +) + + +_SIGNEDDEVICECERTIFICATE = _descriptor.Descriptor( + name='SignedDeviceCertificate', + full_name='SignedDeviceCertificate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='_DeviceCertificate', full_name='SignedDeviceCertificate._DeviceCertificate', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedDeviceCertificate.Signature', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signer', full_name='SignedDeviceCertificate.Signer', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5258, + serialized_end=5392, +) + + +_SIGNEDPROVISIONINGMESSAGE = _descriptor.Descriptor( + name='SignedProvisioningMessage', + full_name='SignedProvisioningMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5394, + serialized_end=5421, +) + + +_SIGNEDMESSAGE = _descriptor.Descriptor( + name='SignedMessage', + full_name='SignedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedMessage.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedMessage.Msg', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedMessage.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedMessage.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedMessage.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDMESSAGE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5424, + serialized_end=5728, +) + + +_WIDEVINECENCHEADER = _descriptor.Descriptor( + name='WidevineCencHeader', + full_name='WidevineCencHeader', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='algorithm', full_name='WidevineCencHeader.algorithm', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='key_id', full_name='WidevineCencHeader.key_id', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='provider', full_name='WidevineCencHeader.provider', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='content_id', full_name='WidevineCencHeader.content_id', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='track_type_deprecated', full_name='WidevineCencHeader.track_type_deprecated', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='policy', full_name='WidevineCencHeader.policy', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_index', full_name='WidevineCencHeader.crypto_period_index', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='grouped_license', full_name='WidevineCencHeader.grouped_license', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='protection_scheme', full_name='WidevineCencHeader.protection_scheme', index=8, + number=9, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='crypto_period_seconds', full_name='WidevineCencHeader.crypto_period_seconds', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _WIDEVINECENCHEADER_ALGORITHM, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=5731, + serialized_end=6056, +) + + +_SIGNEDLICENSEREQUEST = _descriptor.Descriptor( + name='SignedLicenseRequest', + full_name='SignedLicenseRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicenseRequest.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicenseRequest.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicenseRequest.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicenseRequest.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicenseRequest.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSEREQUEST_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6059, + serialized_end=6394, +) + + +_SIGNEDLICENSE = _descriptor.Descriptor( + name='SignedLicense', + full_name='SignedLicense', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Type', full_name='SignedLicense.Type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Msg', full_name='SignedLicense.Msg', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='Signature', full_name='SignedLicense.Signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='SessionKey', full_name='SignedLicense.SessionKey', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='RemoteAttestation', full_name='SignedLicense.RemoteAttestation', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SIGNEDLICENSE_MESSAGETYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=6397, + serialized_end=6711, +) + +_CLIENTIDENTIFICATION_NAMEVALUE.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.fields_by_name['MaxHdcpVersion'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.containing_type = _CLIENTIDENTIFICATION +_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION.containing_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION.fields_by_name['Type'].enum_type = _CLIENTIDENTIFICATION_TOKENTYPE +_CLIENTIDENTIFICATION.fields_by_name['Token'].message_type = _SIGNEDDEVICECERTIFICATE +_CLIENTIDENTIFICATION.fields_by_name['ClientInfo'].message_type = _CLIENTIDENTIFICATION_NAMEVALUE +_CLIENTIDENTIFICATION.fields_by_name['_ClientCapabilities'].message_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES +_CLIENTIDENTIFICATION_TOKENTYPE.containing_type = _CLIENTIDENTIFICATION +_DEVICECERTIFICATE.fields_by_name['Type'].enum_type = _DEVICECERTIFICATE_CERTIFICATETYPE +_DEVICECERTIFICATE_CERTIFICATETYPE.containing_type = _DEVICECERTIFICATE +_DEVICECERTIFICATESTATUS.fields_by_name['Status'].enum_type = _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS +_DEVICECERTIFICATESTATUS.fields_by_name['DeviceInfo'].message_type = _PROVISIONEDDEVICEINFO +_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS.containing_type = _DEVICECERTIFICATESTATUS +_DEVICECERTIFICATESTATUSLIST.fields_by_name['CertificateStatus'].message_type = _DEVICECERTIFICATESTATUS +_LICENSEIDENTIFICATION.fields_by_name['Type'].enum_type = _LICENSETYPE +_LICENSE_POLICY.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['Hdcp'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['CgmsFlags'].enum_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS.containing_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_KEYCONTROL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER.fields_by_name['Type'].enum_type = _LICENSE_KEYCONTAINER_KEYTYPE +_LICENSE_KEYCONTAINER.fields_by_name['Level'].enum_type = _LICENSE_KEYCONTAINER_SECURITYLEVEL +_LICENSE_KEYCONTAINER.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['RequestedProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION +_LICENSE_KEYCONTAINER.fields_by_name['_KeyControl'].message_type = _LICENSE_KEYCONTAINER_KEYCONTROL +_LICENSE_KEYCONTAINER.fields_by_name['_OperatorSessionKeyPermissions'].message_type = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS +_LICENSE_KEYCONTAINER.fields_by_name['VideoResolutionConstraints'].message_type = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT +_LICENSE_KEYCONTAINER.containing_type = _LICENSE +_LICENSE_KEYCONTAINER_KEYTYPE.containing_type = _LICENSE_KEYCONTAINER +_LICENSE_KEYCONTAINER_SECURITYLEVEL.containing_type = _LICENSE_KEYCONTAINER +_LICENSE.fields_by_name['Id'].message_type = _LICENSEIDENTIFICATION +_LICENSE.fields_by_name['_Policy'].message_type = _LICENSE_POLICY +_LICENSE.fields_by_name['Key'].message_type = _LICENSE_KEYCONTAINER +_LICENSEERROR.fields_by_name['ErrorCode'].enum_type = _LICENSEERROR_ERROR +_LICENSEERROR_ERROR.containing_type = _LICENSEERROR +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['Pssh'].message_type = _WIDEVINECENCHEADER +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE +_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM +_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE +_LICENSEREQUEST_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUEST +_LICENSEREQUEST.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['ContentId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION +_LICENSEREQUEST.fields_by_name['Type'].enum_type = _LICENSEREQUEST_REQUESTTYPE +_LICENSEREQUEST.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION +_LICENSEREQUEST.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_LICENSEREQUEST_REQUESTTYPE.containing_type = _LICENSEREQUEST +_PROVISIONEDDEVICEINFO.fields_by_name['SecurityLevel'].enum_type = _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL +_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL.containing_type = _PROVISIONEDDEVICEINFO +_REMOTEATTESTATION.fields_by_name['Certificate'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION +_SIGNEDDEVICECERTIFICATE.fields_by_name['_DeviceCertificate'].message_type = _DEVICECERTIFICATE +_SIGNEDDEVICECERTIFICATE.fields_by_name['Signer'].message_type = _SIGNEDDEVICECERTIFICATE +_SIGNEDMESSAGE.fields_by_name['Type'].enum_type = _SIGNEDMESSAGE_MESSAGETYPE +_SIGNEDMESSAGE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDMESSAGE_MESSAGETYPE.containing_type = _SIGNEDMESSAGE +_WIDEVINECENCHEADER.fields_by_name['algorithm'].enum_type = _WIDEVINECENCHEADER_ALGORITHM +_WIDEVINECENCHEADER_ALGORITHM.containing_type = _WIDEVINECENCHEADER +_SIGNEDLICENSEREQUEST.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUEST_MESSAGETYPE +_SIGNEDLICENSEREQUEST.fields_by_name['Msg'].message_type = _LICENSEREQUEST +_SIGNEDLICENSEREQUEST.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSEREQUEST_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUEST +_SIGNEDLICENSE.fields_by_name['Type'].enum_type = _SIGNEDLICENSE_MESSAGETYPE +_SIGNEDLICENSE.fields_by_name['Msg'].message_type = _LICENSE +_SIGNEDLICENSE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION +_SIGNEDLICENSE_MESSAGETYPE.containing_type = _SIGNEDLICENSE +DESCRIPTOR.message_types_by_name['ClientIdentification'] = _CLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['DeviceCertificate'] = _DEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['DeviceCertificateStatus'] = _DEVICECERTIFICATESTATUS +DESCRIPTOR.message_types_by_name['DeviceCertificateStatusList'] = _DEVICECERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['EncryptedClientIdentification'] = _ENCRYPTEDCLIENTIDENTIFICATION +DESCRIPTOR.message_types_by_name['LicenseIdentification'] = _LICENSEIDENTIFICATION +DESCRIPTOR.message_types_by_name['License'] = _LICENSE +DESCRIPTOR.message_types_by_name['LicenseError'] = _LICENSEERROR +DESCRIPTOR.message_types_by_name['LicenseRequest'] = _LICENSEREQUEST +DESCRIPTOR.message_types_by_name['ProvisionedDeviceInfo'] = _PROVISIONEDDEVICEINFO +DESCRIPTOR.message_types_by_name['ProvisioningOptions'] = _PROVISIONINGOPTIONS +DESCRIPTOR.message_types_by_name['ProvisioningRequest'] = _PROVISIONINGREQUEST +DESCRIPTOR.message_types_by_name['ProvisioningResponse'] = _PROVISIONINGRESPONSE +DESCRIPTOR.message_types_by_name['RemoteAttestation'] = _REMOTEATTESTATION +DESCRIPTOR.message_types_by_name['SessionInit'] = _SESSIONINIT +DESCRIPTOR.message_types_by_name['SessionState'] = _SESSIONSTATE +DESCRIPTOR.message_types_by_name['SignedCertificateStatusList'] = _SIGNEDCERTIFICATESTATUSLIST +DESCRIPTOR.message_types_by_name['SignedDeviceCertificate'] = _SIGNEDDEVICECERTIFICATE +DESCRIPTOR.message_types_by_name['SignedProvisioningMessage'] = _SIGNEDPROVISIONINGMESSAGE +DESCRIPTOR.message_types_by_name['SignedMessage'] = _SIGNEDMESSAGE +DESCRIPTOR.message_types_by_name['WidevineCencHeader'] = _WIDEVINECENCHEADER +DESCRIPTOR.message_types_by_name['SignedLicenseRequest'] = _SIGNEDLICENSEREQUEST +DESCRIPTOR.message_types_by_name['SignedLicense'] = _SIGNEDLICENSE +DESCRIPTOR.enum_types_by_name['LicenseType'] = _LICENSETYPE +DESCRIPTOR.enum_types_by_name['ProtocolVersion'] = _PROTOCOLVERSION +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ClientIdentification = _reflection.GeneratedProtocolMessageType('ClientIdentification', (_message.Message,), dict( + + NameValue = _reflection.GeneratedProtocolMessageType('NameValue', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_NAMEVALUE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.NameValue) + )) + , + + ClientCapabilities = _reflection.GeneratedProtocolMessageType('ClientCapabilities', (_message.Message,), dict( + DESCRIPTOR = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification.ClientCapabilities) + )) + , + DESCRIPTOR = _CLIENTIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ClientIdentification) + )) +_sym_db.RegisterMessage(ClientIdentification) +_sym_db.RegisterMessage(ClientIdentification.NameValue) +_sym_db.RegisterMessage(ClientIdentification.ClientCapabilities) + +DeviceCertificate = _reflection.GeneratedProtocolMessageType('DeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificate) + )) +_sym_db.RegisterMessage(DeviceCertificate) + +DeviceCertificateStatus = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatus', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUS, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatus) + )) +_sym_db.RegisterMessage(DeviceCertificateStatus) + +DeviceCertificateStatusList = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _DEVICECERTIFICATESTATUSLIST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:DeviceCertificateStatusList) + )) +_sym_db.RegisterMessage(DeviceCertificateStatusList) + +EncryptedClientIdentification = _reflection.GeneratedProtocolMessageType('EncryptedClientIdentification', (_message.Message,), dict( + DESCRIPTOR = _ENCRYPTEDCLIENTIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:EncryptedClientIdentification) + )) +_sym_db.RegisterMessage(EncryptedClientIdentification) + +LicenseIdentification = _reflection.GeneratedProtocolMessageType('LicenseIdentification', (_message.Message,), dict( + DESCRIPTOR = _LICENSEIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseIdentification) + )) +_sym_db.RegisterMessage(LicenseIdentification) + +License = _reflection.GeneratedProtocolMessageType('License', (_message.Message,), dict( + + Policy = _reflection.GeneratedProtocolMessageType('Policy', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_POLICY, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.Policy) + )) + , + + KeyContainer = _reflection.GeneratedProtocolMessageType('KeyContainer', (_message.Message,), dict( + + OutputProtection = _reflection.GeneratedProtocolMessageType('OutputProtection', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OutputProtection) + )) + , + + KeyControl = _reflection.GeneratedProtocolMessageType('KeyControl', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_KEYCONTROL, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.KeyControl) + )) + , + + OperatorSessionKeyPermissions = _reflection.GeneratedProtocolMessageType('OperatorSessionKeyPermissions', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.OperatorSessionKeyPermissions) + )) + , + + VideoResolutionConstraint = _reflection.GeneratedProtocolMessageType('VideoResolutionConstraint', (_message.Message,), dict( + DESCRIPTOR = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer.VideoResolutionConstraint) + )) + , + DESCRIPTOR = _LICENSE_KEYCONTAINER, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License.KeyContainer) + )) + , + DESCRIPTOR = _LICENSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:License) + )) +_sym_db.RegisterMessage(License) +_sym_db.RegisterMessage(License.Policy) +_sym_db.RegisterMessage(License.KeyContainer) +_sym_db.RegisterMessage(License.KeyContainer.OutputProtection) +_sym_db.RegisterMessage(License.KeyContainer.KeyControl) +_sym_db.RegisterMessage(License.KeyContainer.OperatorSessionKeyPermissions) +_sym_db.RegisterMessage(License.KeyContainer.VideoResolutionConstraint) + +LicenseError = _reflection.GeneratedProtocolMessageType('LicenseError', (_message.Message,), dict( + DESCRIPTOR = _LICENSEERROR, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseError) + )) +_sym_db.RegisterMessage(LicenseError) + +LicenseRequest = _reflection.GeneratedProtocolMessageType('LicenseRequest', (_message.Message,), dict( + + ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( + + CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.CENC) + )) + , + + WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.WebM) + )) + , + + ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.ExistingLicense) + )) + , + DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification) + )) + , + DESCRIPTOR = _LICENSEREQUEST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:LicenseRequest) + )) +_sym_db.RegisterMessage(LicenseRequest) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.CENC) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.WebM) +_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.ExistingLicense) + +ProvisionedDeviceInfo = _reflection.GeneratedProtocolMessageType('ProvisionedDeviceInfo', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONEDDEVICEINFO, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisionedDeviceInfo) + )) +_sym_db.RegisterMessage(ProvisionedDeviceInfo) + +ProvisioningOptions = _reflection.GeneratedProtocolMessageType('ProvisioningOptions', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGOPTIONS, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningOptions) + )) +_sym_db.RegisterMessage(ProvisioningOptions) + +ProvisioningRequest = _reflection.GeneratedProtocolMessageType('ProvisioningRequest', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGREQUEST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningRequest) + )) +_sym_db.RegisterMessage(ProvisioningRequest) + +ProvisioningResponse = _reflection.GeneratedProtocolMessageType('ProvisioningResponse', (_message.Message,), dict( + DESCRIPTOR = _PROVISIONINGRESPONSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:ProvisioningResponse) + )) +_sym_db.RegisterMessage(ProvisioningResponse) + +RemoteAttestation = _reflection.GeneratedProtocolMessageType('RemoteAttestation', (_message.Message,), dict( + DESCRIPTOR = _REMOTEATTESTATION, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:RemoteAttestation) + )) +_sym_db.RegisterMessage(RemoteAttestation) + +SessionInit = _reflection.GeneratedProtocolMessageType('SessionInit', (_message.Message,), dict( + DESCRIPTOR = _SESSIONINIT, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SessionInit) + )) +_sym_db.RegisterMessage(SessionInit) + +SessionState = _reflection.GeneratedProtocolMessageType('SessionState', (_message.Message,), dict( + DESCRIPTOR = _SESSIONSTATE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SessionState) + )) +_sym_db.RegisterMessage(SessionState) + +SignedCertificateStatusList = _reflection.GeneratedProtocolMessageType('SignedCertificateStatusList', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDCERTIFICATESTATUSLIST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedCertificateStatusList) + )) +_sym_db.RegisterMessage(SignedCertificateStatusList) + +SignedDeviceCertificate = _reflection.GeneratedProtocolMessageType('SignedDeviceCertificate', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDDEVICECERTIFICATE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedDeviceCertificate) + )) +_sym_db.RegisterMessage(SignedDeviceCertificate) + +SignedProvisioningMessage = _reflection.GeneratedProtocolMessageType('SignedProvisioningMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDPROVISIONINGMESSAGE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedProvisioningMessage) + )) +_sym_db.RegisterMessage(SignedProvisioningMessage) + +SignedMessage = _reflection.GeneratedProtocolMessageType('SignedMessage', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDMESSAGE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedMessage) + )) +_sym_db.RegisterMessage(SignedMessage) + +WidevineCencHeader = _reflection.GeneratedProtocolMessageType('WidevineCencHeader', (_message.Message,), dict( + DESCRIPTOR = _WIDEVINECENCHEADER, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:WidevineCencHeader) + )) +_sym_db.RegisterMessage(WidevineCencHeader) + +SignedLicenseRequest = _reflection.GeneratedProtocolMessageType('SignedLicenseRequest', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSEREQUEST, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedLicenseRequest) + )) +_sym_db.RegisterMessage(SignedLicenseRequest) + +SignedLicense = _reflection.GeneratedProtocolMessageType('SignedLicense', (_message.Message,), dict( + DESCRIPTOR = _SIGNEDLICENSE, + __module__ = 'wv_proto3_pb2' + # @@protoc_insertion_point(class_scope:SignedLicense) + )) +_sym_db.RegisterMessage(SignedLicense) + + +# @@protoc_insertion_point(module_scope) diff --git a/pywidevine/cdm/key.py b/pywidevine/cdm/key.py new file mode 100644 index 0000000..2fe17ac --- /dev/null +++ b/pywidevine/cdm/key.py @@ -0,0 +1,19 @@ +# uncompyle6 version 3.3.2 +# Python bytecode 3.6 (3379) +# Decompiled from: Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] +# Embedded file name: pywidevine\cdm\key.py +import binascii + +class Key: + + def __init__(self, kid, type, key, permissions=[]): + self.kid = kid + self.type = type + self.key = key + self.permissions = permissions + + def __repr__(self): + if self.type == 'OPERATOR_SESSION': + return ('key(kid={}, type={}, key={}, permissions={})').format(self.kid, self.type, binascii.hexlify(self.key), self.permissions) + else: + return ('key(kid={}, type={}, key={})').format(self.kid, self.type, binascii.hexlify(self.key)) \ No newline at end of file diff --git a/pywidevine/cdm/session.py b/pywidevine/cdm/session.py new file mode 100644 index 0000000..531d66b --- /dev/null +++ b/pywidevine/cdm/session.py @@ -0,0 +1,23 @@ +# uncompyle6 version 3.3.2 +# Python bytecode 3.6 (3379) +# Decompiled from: Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] +# Embedded file name: pywidevine\cdm\session.py + + +class Session: + + def __init__(self, session_id, init_data, device_config, offline): + self.session_id = session_id + self.init_data = init_data + self.offline = offline + self.device_config = device_config + self.device_key = None + self.session_key = None + self.derived_keys = {'enc':None, + 'auth_1':None, + 'auth_2':None} + self.license_request = None + self.license = None + self.service_certificate = None + self.privacy_mode = False + self.keys = [] \ No newline at end of file diff --git a/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-36.pyc b/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-36.pyc new file mode 100644 index 0000000..0aae8c8 Binary files /dev/null and b/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-36.pyc differ diff --git a/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-37.pyc b/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-37.pyc new file mode 100644 index 0000000..b9c5b9b Binary files /dev/null and b/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-37.pyc differ diff --git a/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-38.pyc b/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-38.pyc new file mode 100644 index 0000000..a4aa1c2 Binary files /dev/null and b/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-38.pyc differ diff --git a/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-39.pyc b/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-39.pyc new file mode 100644 index 0000000..81e800a Binary files /dev/null and b/pywidevine/decrypt/__pycache__/wvdecryptcustom.cpython-39.pyc differ diff --git a/pywidevine/decrypt/wvdecryptcustom.py b/pywidevine/decrypt/wvdecryptcustom.py new file mode 100644 index 0000000..53afde0 --- /dev/null +++ b/pywidevine/decrypt/wvdecryptcustom.py @@ -0,0 +1,79 @@ +import logging +import subprocess +import re +import base64 + +from pywidevine.cdm import cdm, deviceconfig + + +class WvDecrypt(object): + WV_SYSTEM_ID = [ + 237, + 239, + 139, + 169, + 121, + 214, + 74, + 206, + 163, + 200, + 39, + 220, + 213, + 29, + 33, + 237, + ] + + def __init__(self, init_data_b64, cert_data_b64, device): + self.init_data_b64 = init_data_b64 + self.cert_data_b64 = cert_data_b64 + self.device = device + + self.cdm = cdm.Cdm() + + def check_pssh(pssh_b64): + pssh = base64.b64decode(pssh_b64) + if not pssh[12:28] == bytes(self.WV_SYSTEM_ID): + new_pssh = bytearray([0, 0, 0]) + new_pssh.append(32 + len(pssh)) + new_pssh[4:] = bytearray(b"pssh") + new_pssh[8:] = [0, 0, 0, 0] + new_pssh[13:] = self.WV_SYSTEM_ID + new_pssh[29:] = [0, 0, 0, 0] + new_pssh[31] = len(pssh) + new_pssh[32:] = pssh + return base64.b64encode(new_pssh) + else: + return pssh_b64 + + self.session = self.cdm.open_session( + check_pssh(self.init_data_b64), deviceconfig.DeviceConfig(self.device) + ) + + if self.cert_data_b64: + self.cdm.set_service_certificate(self.session, self.cert_data_b64) + + def log_message(self, msg): + return "{}".format(msg) + + def start_process(self): + keyswvdecrypt = [] + try: + for key in self.cdm.get_keys(self.session): + if key.type == "CONTENT": + keyswvdecrypt.append( + self.log_message("{}:{}".format(key.kid.hex(), key.key.hex())) + ) + except Exception: + return False, keyswvdecrypt + + return True, keyswvdecrypt + def get_challenge(self): + return self.cdm.get_license_request(self.session) + + def update_license(self, license_b64): + self.cdm.provide_license(self.session, license_b64) + return True + diff --git a/services/__pycache__/netflix.cpython-36.pyc b/services/__pycache__/netflix.cpython-36.pyc new file mode 100644 index 0000000..e81b4dc Binary files /dev/null and b/services/__pycache__/netflix.cpython-36.pyc differ diff --git a/services/__pycache__/netflix.cpython-39.pyc b/services/__pycache__/netflix.cpython-39.pyc new file mode 100644 index 0000000..b703372 Binary files /dev/null and b/services/__pycache__/netflix.cpython-39.pyc differ diff --git a/services/netflix.py b/services/netflix.py new file mode 100644 index 0000000..96d0a37 --- /dev/null +++ b/services/netflix.py @@ -0,0 +1,969 @@ +import argparse, configparser, glob, json, logging, os, re, shutil, subprocess, sys, time, ffmpy, pycountry, requests, tqdm +from bs4 import BeautifulSoup +from threading import Thread +from urllib.parse import urlsplit +import utils.modules.pycaption as pycaption +from http.cookiejar import MozillaCookieJar +from configs.config import tool +from helpers.aria2 import aria2 +from helpers.dfxp_to_srt import dfxp_to_srt +from helpers.keyloader import keysaver +from helpers.Muxer import Muxer +from helpers.Parsers.Netflix import get_keys +from helpers.Parsers.Netflix.get_manifest import get_manifest +from helpers.ripprocess import EpisodesNumbersHandler, ripprocess +from helpers.vpn import connect +from pywidevine.cdm import cdm, deviceconfig +from pywidevine.decrypt.wvdecryptcustom import WvDecrypt + +class netflix: + def __init__(self, args, commands): + self.logger = logging.getLogger(__name__) + self.args = args + self.tool = tool() + self.config = self.tool.config("NETFLIX") + self.bin = self.tool.bin() + self.ripprocess = ripprocess() + self.EpisodesNumbersHandler = EpisodesNumbersHandler() + self.commands = commands + self.keysaver = keysaver(keys_file=self.config["keys_file"]) + self.logdata = {} # to save title data for debug or use later + self.source_tag = "NF" + self.dfxp_to_srt = dfxp_to_srt() + self.aria2 = aria2() + self.video_settings = self.tool.video_settings() + self.checkList = list() + + def DumpStoredData(self, nfid): + if nfid: + return + name = "NETFLIX-{}.json".format(nfid) + nfid_json = os.path.join(self.config["jsonpath"], name) + with open(nfid_json, "w", encoding="utf-8") as file_: + file_.write(json.dumps(self.logdata, indent=4)) + file_.flush() + file_.close() + + def store(self, data, keyword): + self.logdata.update({keyword: data}) + return + + def get_build(self, cookies): # + BUILD_REGEX = r'"BUILD_IDENTIFIER":"([a-z0-9]+)"' + + session = requests.Session() + session.headers = { + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + "Sec-Fetch-Site": "none", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Dest": "document", + "Accept-Language": "en,en-US;q=0.9", + } + + r = session.get("https://www.netflix.com/browse", cookies=cookies) + + if not re.search(BUILD_REGEX, r.text): + print( + "cannot get BUILD_IDENTIFIER from the cookies you saved from the browser..." + ) + sys.exit() + + return re.search(BUILD_REGEX, r.text).group(1) + + def save(self, cookies, build): # + cookie_data = {} + for name, value in cookies.items(): + cookie_data[name] = [value, 0] + logindata = {"BUILD_IDENTIFIER": build, "cookies": cookie_data} + with open(self.config["cookies_file"], "w", encoding="utf8") as f: + f.write(json.dumps(logindata, indent=4)) + f.close() + os.remove(self.config["cookies_txt"]) + + def read_userdata(self): # + cookies = None + build = None + + if not os.path.isfile(self.config["cookies_file"]): + try: + cj = MozillaCookieJar(self.config["cookies_txt"]) + cj.load() + except Exception: + print("invalid netscape format cookies file") + sys.exit() + + cookies = dict() + + for cookie in cj: + cookies[cookie.name] = cookie.value + + build = self.get_build(cookies) + self.save(cookies, build) + + with open(self.config["cookies_file"], "rb") as f: + content = f.read().decode("utf-8") + + if "NetflixId" not in content: + self.logger.warning("(Some) cookies expired, renew...") + return cookies, build + + jso = json.loads(content) + build = jso["BUILD_IDENTIFIER"] + cookies = jso["cookies"] + for cookie in cookies: + cookie_data = cookies[cookie] + value = cookie_data[0] + if cookie != "flwssn": + cookies[cookie] = value + if cookies.get("flwssn"): + del cookies["flwssn"] + + return cookies, build + + def shakti_api(self, nfid): # + url = f"https://www.netflix.com/api/shakti/{self.build}/metadata" + headers = { + "Accept": "*/*", + "Accept-Encoding": "gzip, deflate, br", + "Accept-Language": "es,ca;q=0.9,en;q=0.8", + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "Host": "www.netflix.com", + "Pragma": "no-cache", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36", + "X-Netflix.browserName": "Chrome", + "X-Netflix.browserVersion": "79", + "X-Netflix.clientType": "akira", + "X-Netflix.esnPrefix": "NFCDCH-02-", + "X-Netflix.osFullName": "Windows 10", + "X-Netflix.osName": "Windows", + "X-Netflix.osVersion": "10.0", + "X-Netflix.playerThroughput": "1706", + "X-Netflix.uiVersion": self.build, + } + + params = { + "movieid": nfid, + "drmSystem": "widevine", + "isWatchlistEnabled": "false", + "isShortformEnabled": "false", + "isVolatileBillboardsEnabled": "false", + "languages": self.config["metada_language"], + } + + while True: + resp = requests.get( + url=url, headers=headers, params=params, cookies=self.cookies + ) + + if resp.status_code == 401: + self.logger.warning("401 Unauthorized, cookies is invalid.") + elif resp.text.strip() == "": + self.logger.error("title is not available in your Netflix region.") + exit(-1) + + try: + t = resp.json()["video"]["type"] + return resp.json() + except Exception: + os.remove(self.config["cookies_file"]) + self.logger.warning( + "Error getting metadata: Cookies expired\nplease fetch new cookies.txt" + ) + exit(-1) + + def Search(self, query): + session = requests.Session() + session.headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" + } + # select profile + '''profiles = list() + resp = session.get("https://www.netflix.com/browse", cookies=self.cookies) + bs = BeautifulSoup(resp.text, "html.parser") + profiles_ = bs.find_all("a", {"class": "profile-link"}) + + for profile in profiles_: + profiles.append( + (profile.find("span", {"class": "profile-name"}).text, profile["href"]) + ) + + if profiles == []: + self.logger.warning( + "Cannot select user profile, maybe cookies is invalid or the account has no profies." + ) + return None + + # request page with the profile + session.get("https://www.netflix.com" + profiles[0][1], cookies=self.cookies)''' + # search for title + resp = session.get( + "https://www.netflix.com/search?q=" + query, cookies=self.cookies + ) + + if not resp.status_code == 200: + self.logger.error("error searching, maybe invalid cookies.") + return None + + # add all search itmes + itmes = [] + bs = BeautifulSoup(resp.text, "html.parser") + titles = bs.find_all("div", {"class": "title-card-container"}) + + for title in titles: + itmes.append( + { + "name": title.find( + "div", {"class": "fallback-text-container"} + ).text, + "id": title.find("a", href=True)["href"] + .split("?")[0] + .split("/")[2], + } + ) + + if itmes == []: + self.logger.error( + f'Your search for "{query}" did not have any matches, try different keywords.' + ) + return None + + # usually first item is the right items + self.logger.info("Founded: {} items".format(str(len(itmes)))) + self.logger.info("id: {} - name: {}".format(itmes[0]["id"], itmes[0]["name"])) + isRightItem = input("if this what you looking: Enter yes or no: ").strip() + if isRightItem.lower() == "y" or isRightItem.lower() == "yes": + return int(itmes[0]["id"]) + + # first item is wrong + + self.logger.info("The available items is: ") + for idx, item in enumerate(itmes, start=1): + self.logger.info( + "[{}] - id: {} - name: {}".format(idx, item["id"], item["name"]) + ) + + item_number = input("\nChoose item number: ").strip() + if item_number.isdigit(): + item = itmes[item_number - 1]["id"] + return int(item) + + return None + + def get_nfid(self, content_id): # + if content_id.isdigit(): + return int(content_id) + + validUrl = re.compile( + r'https?://(?:www\.)?netflix\.com/(\w+)?/?(?:title|watch|browse?jbv=)/?(?P\d+)' + ) + + nfID = validUrl.match(content_id) + + if nfID: + return int(nfID.group('id')) + + else: + nfID = re.search(r'[0-9]{8}$', content_id) + + if nfID: + return int(nfID[0]) + + else: + self.logger.error('Detection of NF ID from the given url: Failed.') + sys.exit() + + def CleanSubtitleVTT(self, file_content): + file_content = re.sub(r"{.*?}", "", file_content) + file_content = re.sub( + r"(.*\bposition:50.00%.*\bline:10.00%)\s*(.*)", + r"\1\n{\\an8}\2", + file_content, + ) + + file_content = re.sub(r"‏", "\u202B", file_content) + file_content = re.sub(r"‎", "\u202A", file_content) + file_content = re.sub(r"&", "&", file_content) + file_content = re.sub(r"([\d]+)\.([\d]+)", r"\1,\2", file_content) + file_content = re.sub(r"WEBVTT\n\n", "", file_content) + file_content = re.sub(r"NOTE.*\n", "", file_content) + file_content = re.sub(r"\n\s+\n", "", file_content) + file_content = re.sub(r" position:.+%", "", file_content) + file_content = re.sub(r"", "", file_content) + return file_content + + def downloadFile2(self, url, file_name): + with open(file_name, "wb") as f: + response = requests.get(url, stream=True) + #response.encoding = 'UTF-8' + f.write(response.content) + + return + + def downloadFile(self, url, file_name, silent=False): + self.logger.info("\n" + file_name) + + if self.args.noaria2c: + self.ripprocess.tqdm_downloader(url, file_name) + return + + options = self.aria2.aria2Options( + allow_overwrite=True, + quiet=silent, + file_allocation=None, + auto_file_renaming=False, + async_dns="skip", + retry_wait=5, + summary_interval=0, + enable_color=True, + connection=16, + concurrent_downloads=16, + split=16, + uri_selector="inorder", + console_log_level="warn", + download_result="hide", + extra_commands=[] + if self.args.no_download_proxy + else self.commands["aria2c_extra_commands"], + ) + + self.aria2.aria2DownloadUrl( + url=url, output=file_name, options=options, debug=False, moded=False + ) + + return + + def GetKeys(self, IDNet, profilename): + video_keys = [] + available_profiles = [ + "High KEYS", + "HEVC KEYS", + "HDR-10 KEYS", + "Main KEYS" + ] + + if not profilename in available_profiles: + self.logger.error("Error: Unknown profile: {}".format(profilename)) + sys.exit(1) + + try: + video_keys = get_keys.GettingKEYS_Netflixv2(IDNet, profilename) + if not video_keys == []: + video_keys = list(set(video_keys)) + video_keys = [profilename] + video_keys + self.logger.info("Done!") + else: + self.logger.error("Error!") + except Exception as e: + self.logger.error("Error!: {}".format(e)) + + return video_keys + + def GetAudioCocedName(self, audioList): + codecs = { + "ddplus-atmos-dash": "DDP5.1.Atmos", + "ddplus-5.1hq-dash": "DDP5.1", + "ddplus-5.1-dash": "DDP5.1", + "dd-5.1-dash": "DD5.1", + "ddplus-2.0-dash": "DDP2.0", + "heaac-5.1hq-dash": "AAC5.1", + "heaac-5.1-dash": "AAC5.1", + "heaac-2-dash": "AAC2.0", + "heaac-2hq-dash": "AAC2.0", + "playready-oggvorbis-2-dash": "OGG2.0", + } + + profiles = [x["Profile"] for x in audioList] + if not profiles == []: + for profile in profiles: + try: + return codecs[profile] + except KeyError: + pass + + return "DDP5.1" + + def RemuxVideo(self, outputVideoTemp, outputVideo, Name): + self.logger.info("\nRemuxing video...") + ff = ffmpy.FFmpeg( + executable=self.bin["ffmpeg"], + inputs={outputVideoTemp: None}, + outputs={outputVideo: "-c copy"}, + global_options="-y -hide_banner -loglevel warning", + ) + + ff.run() + time.sleep(50.0 / 1000.0) + os.remove(outputVideoTemp) + self.logger.info("Done!") + return True + + def DecryptVideo_withtxtkeys(self, inputVideo, outputVideoTemp, outputVideo, kid, Name): + with open(self.config["keys_file"] + "NETFLIX.keys", "r") as keys_file_netflix: + keys_video = keys_file_netflix.readlines() + + keys_video = [x.strip() for x in keys_video if ":" in x] + if not keys_video == []: + for key in keys_video: + if key[0:32] == kid: + self.logger.info("\nDecrypting video...") + self.logger.info("Using KEY: " + key) + subprocess.call( + [ + self.bin["mp4decrypt"], + "--show-progress", + "--key", + key, + inputVideo, + outputVideoTemp, + ] + ) + self.RemuxVideo(outputVideoTemp, outputVideo, Name) + return True + self.logger.warning("\nKEY for " + inputVideo + " is not in txt.") + return False + + def DecryptVideo(self, inputVideo, outputVideoTemp, outputVideo, IDNet, Name, Profile, silent=False): + KID = self.keysaver.generate_kid(inputVideo) + KEYS = self.keysaver.get_key_by_kid(KID) + + if KEYS == []: + self.logger.info("\nKEY for {} not saved before.".format(inputVideo)) + self.logger.info("\nGetting Video KEYS...") + + if self.args.video_high: + KEYS = self.GetKeys(IDNet, "High KEYS") + else: + if self.args.hevc: + KEYS = self.GetKeys(IDNet, "HEVC KEYS") + else: + if self.args.hdr: + KEYS = self.GetKeys(IDNet, "HDR-10 KEYS") + else: + if "playready-h264hpl" in Profile: + KEYS = self.GetKeys(IDNet, "High KEYS") + else: + KEYS = self.GetKeys(IDNet, "Main KEYS") + # ~ + if KEYS == []: + return False + + KEYS = self.keysaver.dump_keys( + keys=[key for key in KEYS if ":" in key], pssh=None, name=Name + ) + + only1key = [x for x in KEYS if x["KID"] == KID] + if not only1key == []: + KEYS = only1key + + self.ripprocess.mp4_decrypt( + encrypted=inputVideo, + decrypted=outputVideoTemp, + keys=KEYS, + moded_decrypter=True, + no_kid=False, + silent=silent, + ) + + if not "NETFLIX".lower() in list( + map(lambda x: x.lower(), self.video_settings["skip_video_demux"]) + ): + self.ripprocess.DemuxVideo( + outputVideoTemp=outputVideoTemp, + outputVideo=outputVideo, + ffmpeg=True, + mp4box=False, + ) + else: + os.rename(outputVideoTemp, outputVideo) + + return True + + def SubtitleThreader(self, subtitlesList, name): + for z in subtitlesList: + if str(dict(z)["isForced"]) == "YES": + langAbbrev = "forced-" + str(dict(z)["langAbbrev"]) + elif str(dict(z)["isForced"]) == "SDH": + langAbbrev = "sdh-" + str(dict(z)["langAbbrev"]) + else: + langAbbrev = str(dict(z)["langAbbrev"]) + + ext = "dfxp" if str(dict(z)["Profile"]) == "dfxp-ls-sdh" else "vtt" + inputSubtitleDFXP = f"{name} {langAbbrev}.{ext}" + inputSubtitleSrt = f"{name} {langAbbrev}.srt" + if os.path.isfile(inputSubtitleDFXP) or os.path.isfile(inputSubtitleSrt): + pass + else: + self.downloadFile2(str(dict(z)["Url"]), inputSubtitleDFXP) + + dfxp = glob.glob(name + "*.dfxp") + vtt = glob.glob(name + "*.vtt") + if not dfxp == []: + for f in dfxp: + self.dfxp_to_srt.convert(f, f.replace(".dfxp", ".srt")) + os.remove(f) + + if not vtt == []: + for f in vtt: + with open(f, "r+", encoding="utf-8") as x: + old = x.read() + with open(f.replace(".vtt", ".srt"), "w+", encoding="utf-8") as x: + x.write(self.CleanSubtitleVTT(old)) + os.remove(f) + + def downloadItem(self, item): + + TitleName = item["TitleName"] + FolderName = item["FolderName"] + + try: + CurrentHeigh = str(item["video"]["Height"]) + CurrentWidth = str(item["video"]["Width"]) + except Exception: + CurrentHeigh = "None" + CurrentWidth = "None" + + if not self.args.nosubs: + SubsThread = Thread( + target=self.SubtitleThreader, + args=(item["subtitle"] + item["forced"], TitleName,), + ) + SubsThread.start() + self.logger.info("\nSubtitle Thread download started.") + + if not self.args.novideo: + self.logger.info("\nDownloading video...") + if self.args.hevc: + inputVideo = f"{TitleName} [{CurrentHeigh}p] [HEVC].mp4" + outputVideoTemp = ( + f"{TitleName} [{CurrentHeigh}p] [HEVC]_DecryptTemp.mp4" + ) + inputVideo_demuxed = f"{TitleName} [{CurrentHeigh}p] [HEVC]_Demuxed.mp4" + elif self.args.hdr: + inputVideo = f"{TitleName} [{CurrentHeigh}p] [HDR].mp4" + outputVideoTemp = f"{TitleName} [{CurrentHeigh}p] [HDR]_DecryptTemp.mp4" + inputVideo_demuxed = f"{TitleName} [{CurrentHeigh}p] [HDR]_Demuxed.mp4" + else: + if "playready-h264hpl" in str( + item["video"]["Profile"] + ) or "playready-h264shpl" in str(item["video"]["Profile"]): + inputVideo = f"{TitleName} [{CurrentHeigh}p] [HIGH].mp4" + outputVideoTemp = ( + f"{TitleName} [{CurrentHeigh}p] [HIGH]_DecryptTemp.mp4" + ) + inputVideo_demuxed = ( + f"{TitleName} [{CurrentHeigh}p] [HIGH]_Demuxed.mp4" + ) + else: + inputVideo = f"{TitleName} [{CurrentHeigh}p].mp4" + outputVideoTemp = f"{TitleName} [{CurrentHeigh}p]_DecryptTemp.mp4" + inputVideo_demuxed = f"{TitleName} [{CurrentHeigh}p]_Demuxed.mp4" + + if ( + os.path.isfile(inputVideo) + and not os.path.isfile(inputVideo + ".aria2") + or os.path.isfile(inputVideo_demuxed) + ): + self.logger.info( + "\n" + + inputVideo + + "\nFile has already been successfully downloaded previously." + ) + else: + self.downloadFile(item["video"]["Url"], inputVideo) + + ################################################################################# + + if not self.args.noaudio: + self.logger.info("\nDownloading audio...") + for audio in item["audio"]: + langAbbrev = dict(audio)["Language"] + inputAudio = f"{TitleName} {langAbbrev}-audio.mp4" + inputAudio2 = f"{TitleName} {langAbbrev}.ac3" + inputAudio3 = f"{TitleName} {langAbbrev}.eac3" + inputAudio4 = f"{TitleName} {langAbbrev}.m4a" + inputAudio5 = f"{TitleName} {langAbbrev}.oga" + if ( + os.path.isfile(inputAudio) + and not os.path.isfile(inputAudio + ".aria2") + or os.path.isfile(inputAudio2) + or os.path.isfile(inputAudio3) + or os.path.isfile(inputAudio4) + or os.path.isfile(inputAudio5) + ): + self.logger.info( + "\n" + + inputAudio + + "\nFile has already been successfully downloaded previously." + ) + else: + self.downloadFile(str(dict(audio)["Url"]), inputAudio) + + ################################################################################# + + IDNet = item["NetflixID"] + self.CorrectDecryptVideo = False + + if not self.args.novideo: + if not os.path.isfile(inputVideo_demuxed): + self.CorrectDecryptVideo = self.DecryptVideo( + inputVideo=inputVideo, + outputVideoTemp=outputVideoTemp, + outputVideo=inputVideo_demuxed, + IDNet=IDNet, + Name=TitleName, + Profile=str(item["video"]["Profile"]), + ) + else: + self.CorrectDecryptVideo = True + + if not self.args.noaudio: + for audio in item["audio"]: + langAbbrev = dict(audio)["Language"] + inputAudio = f"{TitleName} {langAbbrev}-audio.mp4" + inputAudio2 = f"{TitleName} {langAbbrev}.ac3" + inputAudio3 = f"{TitleName} {langAbbrev}.eac3" + inputAudio4 = f"{TitleName} {langAbbrev}.m4a" + inputAudio5 = f"{TitleName} {langAbbrev}.oga" + if ( + os.path.isfile(inputAudio2) + or os.path.isfile(inputAudio3) + or os.path.isfile(inputAudio4) + or os.path.isfile(inputAudio5) + ): + pass + else: + self.ripprocess.DemuxAudio(inputAudio, "-audio.mp4") + + ################################################################################# + + if not self.args.nosubs: + SubsThread.join() + + muxedFile = None + + if ( + not self.args.novideo + and not self.args.noaudio + and self.CorrectDecryptVideo is True + ): + mkvmuxer = Muxer( + CurrentName=TitleName, + SeasonFolder=FolderName, + CurrentHeigh=CurrentHeigh, + CurrentWidth=CurrentWidth, + mkvmerge=self.bin["mkvmerge"], + Source=self.source_tag, + group=self.commands["group"], + ) + muxedFile = mkvmuxer.startMux() + + if not self.args.keep: + self.ripprocess.do_clean( + TitleName, exclude=self.args.clean_exclude, added=self.args.clean_add + ) + + self.store(item, "item_info") + self.DumpStoredData(item["NetflixID"]) + self.logger.info("Done!") + + return + + def getItem(self, NetflixID, TitleName, FolderName): + + self.FilesInFolder = [] + if FolderName: + GlobFiles = glob.glob(f"{FolderName}/*.*", recursive=True) + if not GlobFiles == []: + for files in GlobFiles: + self.FilesInFolder.append(os.path.basename(files)) + + if self.args.license: + KEYS = [] + + self.logger.info("\nGetting KEYS...") + + if self.args.hevc: + KEYS += self.GetKeys(NetflixID, "HEVC KEYS") + + elif self.args.hdr: + KEYS += self.GetKeys(NetflixID, "HDR-10 KEYS") + + else: + for profile in ["Main KEYS", "High KEYS"]: + KEYS += self.GetKeys(NetflixID, profile) + + self.logger.info("\n" + TitleName + "\n") + self.logger.info("\n".join(KEYS)) + KEYS = [x for x in KEYS if ":" in x] + if not KEYS == []: + KEYS = self.keysaver.dump_keys(keys=KEYS, pssh=None, name=TitleName) + return + + VideoList, AudioList, SubtitleList, ForcedList, checkerinfo = get_manifest( + self.args, NetflixID + ).LoadManifest() + + if self.args.check: + itemdata = [ + { + 'title': re.search(r'S\d+E\d+', TitleName)[0] + if self.netflixType == 'show' + else TitleName, + 'checkinfo': checkerinfo, + 'videolist': VideoList + } + ] + self.checkList.extend(itemdata) + return + + if not self.args.novideo: + self.logger.info(checkerinfo) + self.logger.info( + "VIDEO - Bitrate: {}kbps | Profile: {} | Size: {} | Fps: {} | Vmaf: {} | Drm: {} | Resolution: {}x{}".format( + str(dict(VideoList[-1])["Bitrate"]), + str(dict(VideoList[-1])["Profile"]), + str(dict(VideoList[-1])["Size"]), + str(dict(VideoList[-1])["FrameRate"]), + str(dict(VideoList[-1])["vmaf"]), + dict(VideoList[-1])["Drm"], + str(dict(VideoList[-1])["Width"]), + str(dict(VideoList[-1])["Height"]), + ) + ) + + if not self.args.noaudio: + self.logger.info("\n") + for Audio in AudioList: + self.logger.info( + "AUDIO - Bitrate: {}kbps | Profile: {} | Size: {} | Original: {} | Drm: {} | Channels: {}ch | Language: {}".format( + str(dict(Audio)["Bitrate"]), + str(dict(Audio)["Profile"]), + str(dict(Audio)["Size"]), + str(dict(Audio)["Original"]), + dict(Audio)["Drm"], + str(dict(Audio)["channels"]), + str(dict(Audio)["Language"]), + ) + ) + + if not self.args.nosubs: + self.logger.info("\n") + for Subtitle in SubtitleList + ForcedList: + self.logger.info( + "SUBTITLE - Profile: {} | Type: {} | isForced: {} | Language: {}".format( + str(dict(Subtitle)["Profile"]), + str(dict(Subtitle)["rawTrackType"]), + str(dict(Subtitle)["isForced"]), + str(dict(Subtitle)["Language"]), + ) + ) + + self.logger.info(f"\n{TitleName}\n") + + downloaddict = { + "NetflixID": NetflixID, + "TitleName": TitleName, + "FolderName": FolderName, + "video": VideoList[-1] if not VideoList == [] else VideoList, + "audio": AudioList, + "subtitle": SubtitleList, + "forced": ForcedList, + } + + self.logger.debug("downloaddict: {}".format(downloaddict)) + + if not self.args.prompt: + choice = "y" + else: + choice = input("\nDoes this look right? Answer yes to download. (y/n): ") + + if choice.lower() == "y" or choice.lower() == "yes": + self.downloadItem(downloaddict) + elif choice.lower() == "n" or choice.lower() == "no": + self.logger.info("Quitting...") + + return + + def main_netflix(self): + self.cookies, self.build = self.read_userdata() + self.nfID = None + if self.args.content: + self.nfID = self.get_nfid(self.args.content) + if not self.nfID: + self.logger.error( + "Cannot detect netflix id: {}".format(self.args.content) + ) + exit(-1) + elif self.args.search: + self.logger.info("\nSearching NetFlix For: {}".format(self.args.search)) + SearchItem = self.Search(str(self.args.search)) + if not SearchItem: + self.logger.error("Search Failed: {}".format(self.args.search)) + exit(-1) + + self.nfID = int(SearchItem) + else: + self.nfID = self.get_nfid( + input("Netflix viewable ID / watch URL: ").strip() + ) + + self.logger.info("Getting Metadata...") + data = self.shakti_api(str(self.nfID)) + self.logger.debug("Metadata: {}".format(data)) + + if data["video"]["type"] == "movie": + self.netflixType = "movie" + else: + if data["video"]["type"] == "show": + self.netflixType = "show" + else: + if data["video"]["type"] == "supplemental": + self.netflixType = "supplemental" + else: + self.logger.info(data["video"]["type"] + " is a unrecognized type!") + sys.exit(0) + + ###################################### + if self.args.output: + dl_location = self.args.output + if not os.path.exists(dl_location): + os.makedirs(dl_location) + else: + try: + temp_download = "{}/{}".format( + tool().paths()["DL_FOLDER"], "downloads/netflix" + ) + if not os.path.exists(temp_download): + os.makedirs(temp_download) + dl_location = temp_download + except Exception: + temp_download = "downloads/netflix" + if not os.path.exists(temp_download): + os.makedirs(temp_download) + dl_location = temp_download + + os.chdir(dl_location) + ###################################### + + self.items = [] + isAEpisode = False + + if self.netflixType == "movie" or self.netflixType == "supplemental": + mainTitle = "{} {}".format( + self.ripprocess.RemoveCharcters(data["video"]["title"]), + self.ripprocess.RemoveCharcters(str(data["video"]["year"])), + ) + else: + mainTitle = self.ripprocess.RemoveCharcters(data["video"]["title"]) + + try: + if ( + str(data["video"]["currentEpisode"]) == str(self.nfID) + and self.netflixType == "show" + ): + isAEpisode = True + except Exception: + pass + + if self.netflixType == "movie" or self.netflixType == "supplemental": + self.getItem( + self.nfID, + self.args.titlecustom[0] if self.args.titlecustom else mainTitle, + None, + ) + + elif self.netflixType == "show": + if isAEpisode: + self.logger.info("\nID or URL belongs to episode...") + for season in data["video"]["seasons"]: + for episode in season["episodes"]: + if int(episode["id"]) == int(self.nfID): + self.items.append( + { + "TitleName": "{} S{}E{} {}".format( + self.args.titlecustom[0] + if self.args.titlecustom + else mainTitle, + str(season["seq"]).zfill(2), + str(episode["seq"]).zfill(2), + self.ripprocess.RemoveCharcters( + episode["title"] + ), + ), + "FolderName": "{} S{}".format( + self.args.titlecustom[0] + if self.args.titlecustom + else mainTitle, + str(season["seq"]).zfill(2), + ), + "NetflixID": episode["episodeId"], + } + ) + else: + seasonMatchNumber = ( + str(self.args.season).lstrip("0") + if self.args.season + else str(input("ENTER Season Number: ").strip()).lstrip("0") + ) + + AllowedEpisodesNumbers = ( + self.EpisodesNumbersHandler.sortNumbers( + str(self.args.episodeStart).lstrip("0") + ) + if self.args.episodeStart + else self.EpisodesNumbersHandler.sortNumbers("~") + ) + + for season in data["video"]["seasons"]: + if int(season["seq"]) == int(seasonMatchNumber): + for episode in season["episodes"]: + if int(episode["seq"]) in AllowedEpisodesNumbers: + self.items.append( + { + "TitleName": "{} S{}E{} {}".format( + self.args.titlecustom[0] + if self.args.titlecustom + else mainTitle, + str(season["seq"]).zfill(2), + str(episode["seq"]).zfill(2), + self.ripprocess.RemoveCharcters( + episode["title"] + ), + ), + "FolderName": "{} S{}".format( + self.args.titlecustom[0] + if self.args.titlecustom + else mainTitle, + str(season["seq"]).zfill(2), + ), + "NetflixID": episode["episodeId"], + } + ) + + self.logger.info("\nTotal items will be downloaded: {}".format(len(self.items))) + for idx, epsiode in enumerate(self.items, start=1): + self.logger.info( + "downloading: {} of {}".format( + str(idx).zfill(2), str(len(self.items)).zfill(2) + ) + ) + self.getItem( + epsiode["NetflixID"], + self.ripprocess.RemoveCharcters(epsiode["TitleName"]), + epsiode["FolderName"], + ) + + if self.args.check: + self.logger.info('\nCheck Result') + for item in self.checkList: + if "MAIN is Better" in item['checkinfo']: + self.logger.info(item['title'] + ' : MAIN') + else: + L3 = str(dict(item['videolist'][-1])["L3"]) + self.logger.info(item['title'] + ' : HIGH ' + L3) \ No newline at end of file diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/__pycache__/__init__.cpython-36.pyc b/utils/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..f9542fd Binary files /dev/null and b/utils/__pycache__/__init__.cpython-36.pyc differ diff --git a/utils/__pycache__/__init__.cpython-39.pyc b/utils/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..a3323c7 Binary files /dev/null and b/utils/__pycache__/__init__.cpython-39.pyc differ diff --git a/utils/modules/kanji_to_romaji/__init__.py b/utils/modules/kanji_to_romaji/__init__.py new file mode 100644 index 0000000..43c8f6c --- /dev/null +++ b/utils/modules/kanji_to_romaji/__init__.py @@ -0,0 +1,5 @@ +from .kanji_to_romaji_module import convert_hiragana_to_katakana, translate_to_romaji, translate_soukon, \ + translate_long_vowel, translate_soukon_ch, kanji_to_romaji +__all__ = ["load_mappings_dict", "convert_hiragana_to_katakana", "convert_katakana_to_hiragana", + "translate_to_romaji", "translate_soukon", + "translate_long_vowel", "translate_soukon_ch", "kanji_to_romaji"] diff --git a/utils/modules/kanji_to_romaji/__pycache__/__init__.cpython-36.pyc b/utils/modules/kanji_to_romaji/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000..261c1b2 Binary files /dev/null and b/utils/modules/kanji_to_romaji/__pycache__/__init__.cpython-36.pyc differ diff --git a/utils/modules/kanji_to_romaji/__pycache__/__init__.cpython-37.pyc b/utils/modules/kanji_to_romaji/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..d342899 Binary files /dev/null and b/utils/modules/kanji_to_romaji/__pycache__/__init__.cpython-37.pyc differ diff --git a/utils/modules/kanji_to_romaji/__pycache__/desktop.ini b/utils/modules/kanji_to_romaji/__pycache__/desktop.ini new file mode 100644 index 0000000..8b35761 Binary files /dev/null and b/utils/modules/kanji_to_romaji/__pycache__/desktop.ini differ diff --git a/utils/modules/kanji_to_romaji/__pycache__/kanji_to_romaji_module.cpython-36.pyc b/utils/modules/kanji_to_romaji/__pycache__/kanji_to_romaji_module.cpython-36.pyc new file mode 100644 index 0000000..d852324 Binary files /dev/null and b/utils/modules/kanji_to_romaji/__pycache__/kanji_to_romaji_module.cpython-36.pyc differ diff --git a/utils/modules/kanji_to_romaji/__pycache__/kanji_to_romaji_module.cpython-37.pyc b/utils/modules/kanji_to_romaji/__pycache__/kanji_to_romaji_module.cpython-37.pyc new file mode 100644 index 0000000..b7b21f2 Binary files /dev/null and b/utils/modules/kanji_to_romaji/__pycache__/kanji_to_romaji_module.cpython-37.pyc differ diff --git a/utils/modules/kanji_to_romaji/desktop.ini b/utils/modules/kanji_to_romaji/desktop.ini new file mode 100644 index 0000000..8b35761 Binary files /dev/null and b/utils/modules/kanji_to_romaji/desktop.ini differ diff --git a/utils/modules/kanji_to_romaji/jp_mappings/conjugated_godan_kanji.json b/utils/modules/kanji_to_romaji/jp_mappings/conjugated_godan_kanji.json new file mode 100644 index 0000000..03c81df --- /dev/null +++ b/utils/modules/kanji_to_romaji/jp_mappings/conjugated_godan_kanji.json @@ -0,0 +1,174698 @@ +{ + "削り落とさ": { + "w_type": "godan verb stem", + "romaji": "kezuriotosa" + }, + "削り落とし": { + "w_type": "godan verb stem", + "romaji": "kezuriotoshi" + }, + "削り落とせ": { + "w_type": "conjugated godan verb", + "romaji": "kezuriotose" + }, + "削り落とそ": { + "w_type": "godan verb stem", + "romaji": "kezuriotoso" + }, + "削り落とした": { + "w_type": "conjugated godan verb", + "romaji": "kezuriotoshita" + }, + "削り落として": { + "w_type": "conjugated godan verb", + "romaji": "kezuriotoshite" + }, + "遣り過さ": { + "w_type": "godan verb stem", + "romaji": "yarisugosa" + }, + "遣り過し": { + "w_type": "godan verb stem", + "romaji": "yarisugoshi" + }, + "遣り過せ": { + "w_type": "conjugated godan verb", + "romaji": "yarisugose" + }, + "遣り過そ": { + "w_type": "godan verb stem", + "romaji": "yarisugoso" + }, + "遣り過した": { + "w_type": "conjugated godan verb", + "romaji": "yarisugoshita" + }, + "遣り過して": { + "w_type": "conjugated godan verb", + "romaji": "yarisugoshite" + }, + "転げ回ら": { + "w_type": "godan verb stem", + "romaji": "korogemawara" + }, + "転げ回り": { + "w_type": "godan verb stem", + "romaji": "korogemawari" + }, + "転げ回れ": { + "w_type": "conjugated godan verb", + "romaji": "korogemaware" + }, + "転げ回ろ": { + "w_type": "godan verb stem", + "romaji": "korogemawaro" + }, + "転げ回った": { + "w_type": "conjugated godan verb", + "romaji": "korogemawatta" + }, + "転げ回って": { + "w_type": "conjugated godan verb", + "romaji": "korogemawatte" + }, + "のけ反ら": { + "w_type": "godan verb stem", + "romaji": "nokezora" + }, + "のけ反り": { + "w_type": "godan verb stem", + "romaji": "nokezori" + }, + "のけ反れ": { + "w_type": "conjugated godan verb", + "romaji": "nokezore" + }, + "のけ反ろ": { + "w_type": "godan verb stem", + "romaji": "nokezoro" + }, + "のけ反った": { + "w_type": "conjugated godan verb", + "romaji": "nokezotta" + }, + "のけ反って": { + "w_type": "conjugated godan verb", + "romaji": "nokezotte" + }, + "踏みつぶさ": { + "w_type": "godan verb stem", + "romaji": "fumitsubusa" + }, + "踏みつぶし": { + "w_type": "godan verb stem", + "romaji": "fumitsubushi" + }, + "踏みつぶせ": { + "w_type": "conjugated godan verb", + "romaji": "fumitsubuse" + }, + "踏みつぶそ": { + "w_type": "godan verb stem", + "romaji": "fumitsubuso" + }, + "踏みつぶした": { + "w_type": "conjugated godan verb", + "romaji": "fumitsubushita" + }, + "踏みつぶして": { + "w_type": "conjugated godan verb", + "romaji": "fumitsubushite" + }, + "竦み上がら": { + "w_type": "godan verb stem", + "romaji": "sukumiagara" + }, + "竦み上がり": { + "w_type": "godan verb stem", + "romaji": "sukumiagari" + }, + "竦み上がれ": { + "w_type": "conjugated godan verb", + "romaji": "sukumiagare" + }, + "竦み上がろ": { + "w_type": "godan verb stem", + "romaji": "sukumiagaro" + }, + "竦み上がった": { + "w_type": "conjugated godan verb", + "romaji": "sukumiagatta" + }, + "竦み上がって": { + "w_type": "conjugated godan verb", + "romaji": "sukumiagatte" + }, + "生えかわら": { + "w_type": "godan verb stem", + "romaji": "haekawara" + }, + "生えかわり": { + "w_type": "godan verb stem", + "romaji": "haekawari" + }, + "生えかわれ": { + "w_type": "conjugated godan verb", + "romaji": "haekaware" + }, + "生えかわろ": { + "w_type": "godan verb stem", + "romaji": "haekawaro" + }, + "生えかわった": { + "w_type": "conjugated godan verb", + "romaji": "haekawatta" + }, + "生えかわって": { + "w_type": "conjugated godan verb", + "romaji": "haekawatte" + }, + "恃ま": { + "w_type": "godan verb stem", + "romaji": "tanoma" + }, + "恃み": { + "w_type": "godan verb stem", + "romaji": "tanomi" + }, + "恃め": { + "w_type": "conjugated godan verb", + "romaji": "tanome" + }, + "恃も": { + "w_type": "godan verb stem", + "romaji": "tanomo" + }, + "恃んだ": { + "w_type": "conjugated godan verb", + "romaji": "tanonda" + }, + "恃んで": { + "w_type": "conjugated godan verb", + "romaji": "tanonde" + }, + "刈取ら": { + "w_type": "godan verb stem", + "romaji": "karitora" + }, + "刈取り": { + "w_type": "godan verb stem", + "romaji": "karitori" + }, + "刈取れ": { + "w_type": "conjugated godan verb", + "romaji": "karitore" + }, + "刈取ろ": { + "w_type": "godan verb stem", + "romaji": "karitoro" + }, + "刈取った": { + "w_type": "conjugated godan verb", + "romaji": "karitotta" + }, + "刈取って": { + "w_type": "conjugated godan verb", + "romaji": "karitotte" + }, + "燈さ": { + "w_type": "godan verb stem", + "romaji": "tomosa" + }, + "燈し": { + "w_type": "godan verb stem", + "romaji": "tomoshi" + }, + "燈せ": { + "w_type": "conjugated godan verb", + "romaji": "tomose" + }, + "燈そ": { + "w_type": "godan verb stem", + "romaji": "tomoso" + }, + "燈した": { + "w_type": "conjugated godan verb", + "romaji": "tomoshita" + }, + "燈して": { + "w_type": "conjugated godan verb", + "romaji": "tomoshite" + }, + "待ちあぐま": { + "w_type": "godan verb stem", + "romaji": "machiaguma" + }, + "待ちあぐみ": { + "w_type": "godan verb stem", + "romaji": "machiagumi" + }, + "待ちあぐめ": { + "w_type": "conjugated godan verb", + "romaji": "machiagume" + }, + "待ちあぐも": { + "w_type": "godan verb stem", + "romaji": "machiagumo" + }, + "待ちあぐんだ": { + "w_type": "conjugated godan verb", + "romaji": "machiagunda" + }, + "待ちあぐんで": { + "w_type": "conjugated godan verb", + "romaji": "machiagunde" + }, + "現わさ": { + "w_type": "godan verb stem", + "romaji": "arawasa" + }, + "現わし": { + "w_type": "godan verb stem", + "romaji": "arawashi" + }, + "現わせ": { + "w_type": "conjugated godan verb", + "romaji": "arawase" + }, + "現わそ": { + "w_type": "godan verb stem", + "romaji": "arawaso" + }, + "現わした": { + "w_type": "conjugated godan verb", + "romaji": "arawashita" + }, + "現わして": { + "w_type": "conjugated godan verb", + "romaji": "arawashite" + }, + "降らさ": { + "w_type": "godan verb stem", + "romaji": "furasa" + }, + "降らし": { + "w_type": "godan verb stem", + "romaji": "furashi" + }, + "降らせ": { + "w_type": "conjugated godan verb", + "romaji": "furase" + }, + "降らそ": { + "w_type": "godan verb stem", + "romaji": "furaso" + }, + "降らした": { + "w_type": "conjugated godan verb", + "romaji": "furashita" + }, + "降らして": { + "w_type": "conjugated godan verb", + "romaji": "furashite" + }, + "屈ま": { + "w_type": "godan verb stem", + "romaji": "kagama" + }, + "屈み": { + "w_type": "godan verb stem", + "romaji": "kagami" + }, + "屈め": { + "w_type": "conjugated godan verb", + "romaji": "kagame" + }, + "屈も": { + "w_type": "godan verb stem", + "romaji": "kagamo" + }, + "屈んだ": { + "w_type": "conjugated godan verb", + "romaji": "kaganda" + }, + "屈んで": { + "w_type": "conjugated godan verb", + "romaji": "kagande" + }, + "強請ら": { + "w_type": "godan verb stem", + "romaji": "nedara" + }, + "強請り": { + "w_type": "godan verb stem", + "romaji": "nedari" + }, + "強請れ": { + "w_type": "conjugated godan verb", + "romaji": "nedare" + }, + "強請ろ": { + "w_type": "godan verb stem", + "romaji": "nedaro" + }, + "強請った": { + "w_type": "conjugated godan verb", + "romaji": "nedatta" + }, + "強請って": { + "w_type": "conjugated godan verb", + "romaji": "nedatte" + }, + "爪繰ら": { + "w_type": "godan verb stem", + "romaji": "tsumagura" + }, + "爪繰り": { + "w_type": "godan verb stem", + "romaji": "tsumaguri" + }, + "爪繰れ": { + "w_type": "conjugated godan verb", + "romaji": "tsumagure" + }, + "爪繰ろ": { + "w_type": "godan verb stem", + "romaji": "tsumaguro" + }, + "爪繰った": { + "w_type": "conjugated godan verb", + "romaji": "tsumagutta" + }, + "爪繰って": { + "w_type": "conjugated godan verb", + "romaji": "tsumagutte" + }, + "後じさら": { + "w_type": "godan verb stem", + "romaji": "atozusara" + }, + "後じさり": { + "w_type": "godan verb stem", + "romaji": "atozusari" + }, + "後じされ": { + "w_type": "conjugated godan verb", + "romaji": "atozusare" + }, + "後じさろ": { + "w_type": "godan verb stem", + "romaji": "atozusaro" + }, + "後じさった": { + "w_type": "conjugated godan verb", + "romaji": "atozusatta" + }, + "後じさって": { + "w_type": "conjugated godan verb", + "romaji": "atozusatte" + }, + "突き落とさ": { + "w_type": "godan verb stem", + "romaji": "tsukiotosa" + }, + "突き落とし": { + "w_type": "godan verb stem", + "romaji": "tsukiotoshi" + }, + "突き落とせ": { + "w_type": "conjugated godan verb", + "romaji": "tsukiotose" + }, + "突き落とそ": { + "w_type": "godan verb stem", + "romaji": "tsukiotoso" + }, + "突き落とした": { + "w_type": "conjugated godan verb", + "romaji": "tsukiotoshita" + }, + "突き落として": { + "w_type": "conjugated godan verb", + "romaji": "tsukiotoshite" + }, + "象ら": { + "w_type": "godan verb stem", + "romaji": "katadora" + }, + "象り": { + "w_type": "godan verb stem", + "romaji": "katadori" + }, + "象れ": { + "w_type": "conjugated godan verb", + "romaji": "katadore" + }, + "象ろ": { + "w_type": "godan verb stem", + "romaji": "katadoro" + }, + "象った": { + "w_type": "conjugated godan verb", + "romaji": "katadotta" + }, + "象って": { + "w_type": "conjugated godan verb", + "romaji": "katadotte" + }, + "貴ば": { + "w_type": "godan verb stem", + "romaji": "toutoba" + }, + "貴び": { + "w_type": "godan verb stem", + "romaji": "toutobi" + }, + "貴べ": { + "w_type": "conjugated godan verb", + "romaji": "toutobe" + }, + "貴ぼ": { + "w_type": "godan verb stem", + "romaji": "toutobo" + }, + "貴んだ": { + "w_type": "conjugated godan verb", + "romaji": "toutonda" + }, + "貴んで": { + "w_type": "conjugated godan verb", + "romaji": "toutonde" + }, + "解解さ": { + "w_type": "godan verb stem", + "romaji": "tokihogusa" + }, + "解解し": { + "w_type": "godan verb stem", + "romaji": "tokihogushi" + }, + "解解せ": { + "w_type": "conjugated godan verb", + "romaji": "tokihoguse" + }, + "解解そ": { + "w_type": "godan verb stem", + "romaji": "tokihoguso" + }, + "解解した": { + "w_type": "conjugated godan verb", + "romaji": "tokihogushita" + }, + "解解して": { + "w_type": "conjugated godan verb", + "romaji": "tokihogushite" + }, + "泣き頻ら": { + "w_type": "godan verb stem", + "romaji": "nakishikira" + }, + "泣き頻り": { + "w_type": "godan verb stem", + "romaji": "nakishikiri" + }, + "泣き頻れ": { + "w_type": "conjugated godan verb", + "romaji": "nakishikire" + }, + "泣き頻ろ": { + "w_type": "godan verb stem", + "romaji": "nakishikiro" + }, + "泣き頻った": { + "w_type": "conjugated godan verb", + "romaji": "nakishikitta" + }, + "泣き頻って": { + "w_type": "conjugated godan verb", + "romaji": "nakishikitte" + }, + "荒らさ": { + "w_type": "godan verb stem", + "romaji": "arasa" + }, + "荒らし": { + "w_type": "godan verb stem", + "romaji": "arashi" + }, + "荒らせ": { + "w_type": "conjugated godan verb", + "romaji": "arase" + }, + "荒らそ": { + "w_type": "godan verb stem", + "romaji": "araso" + }, + "荒らした": { + "w_type": "conjugated godan verb", + "romaji": "arashita" + }, + "荒らして": { + "w_type": "conjugated godan verb", + "romaji": "arashite" + }, + "使いこま": { + "w_type": "godan verb stem", + "romaji": "tsukaikoma" + }, + "使いこみ": { + "w_type": "godan verb stem", + "romaji": "tsukaikomi" + }, + "使いこめ": { + "w_type": "conjugated godan verb", + "romaji": "tsukaikome" + }, + "使いこも": { + "w_type": "godan verb stem", + "romaji": "tsukaikomo" + }, + "使いこんだ": { + "w_type": "conjugated godan verb", + "romaji": "tsukaikonda" + }, + "使いこんで": { + "w_type": "conjugated godan verb", + "romaji": "tsukaikonde" + }, + "与ら": { + "w_type": "godan verb stem", + "romaji": "azukara" + }, + "与り": { + "w_type": "godan verb stem", + "romaji": "azukari" + }, + "与れ": { + "w_type": "conjugated godan verb", + "romaji": "azukare" + }, + "与ろ": { + "w_type": "godan verb stem", + "romaji": "azukaro" + }, + "与った": { + "w_type": "conjugated godan verb", + "romaji": "azukatta" + }, + "与って": { + "w_type": "conjugated godan verb", + "romaji": "azukatte" + }, + "橈ま": { + "w_type": "godan verb stem", + "romaji": "tawama" + }, + "橈み": { + "w_type": "godan verb stem", + "romaji": "tawami" + }, + "橈め": { + "w_type": "conjugated godan verb", + "romaji": "tawame" + }, + "橈も": { + "w_type": "godan verb stem", + "romaji": "tawamo" + }, + "橈んだ": { + "w_type": "conjugated godan verb", + "romaji": "tawanda" + }, + "橈んで": { + "w_type": "conjugated godan verb", + "romaji": "tawande" + }, + "切り拓か": { + "w_type": "godan verb stem", + "romaji": "kirihiraka" + }, + "切り拓き": { + "w_type": "godan verb stem", + "romaji": "kirihiraki" + }, + "切り拓け": { + "w_type": "conjugated godan verb", + "romaji": "kirihirake" + }, + "切り拓こ": { + "w_type": "godan verb stem", + "romaji": "kirihirako" + }, + "切り拓いた": { + "w_type": "conjugated godan verb", + "romaji": "kirihiraita" + }, + "切り拓いて": { + "w_type": "conjugated godan verb", + "romaji": "kirihiraite" + }, + "放ったらかさ": { + "w_type": "godan verb stem", + "romaji": "hottarakasa" + }, + "放ったらかし": { + "w_type": "godan verb stem", + "romaji": "hottarakashi" + }, + "放ったらかせ": { + "w_type": "conjugated godan verb", + "romaji": "hottarakase" + }, + "放ったらかそ": { + "w_type": "godan verb stem", + "romaji": "hottarakaso" + }, + "放ったらかした": { + "w_type": "conjugated godan verb", + "romaji": "hottarakashita" + }, + "放ったらかして": { + "w_type": "conjugated godan verb", + "romaji": "hottarakashite" + }, + "仕舞い込ま": { + "w_type": "godan verb stem", + "romaji": "shimaikoma" + }, + "仕舞い込み": { + "w_type": "godan verb stem", + "romaji": "shimaikomi" + }, + "仕舞い込め": { + "w_type": "conjugated godan verb", + "romaji": "shimaikome" + }, + "仕舞い込も": { + "w_type": "godan verb stem", + "romaji": "shimaikomo" + }, + "仕舞い込んだ": { + "w_type": "conjugated godan verb", + "romaji": "shimaikonda" + }, + "仕舞い込んで": { + "w_type": "conjugated godan verb", + "romaji": "shimaikonde" + }, + "落ちゆか": { + "w_type": "godan verb stem", + "romaji": "ochiyuka" + }, + "落ちゆき": { + "w_type": "godan verb stem", + "romaji": "ochiyuki" + }, + "落ちゆけ": { + "w_type": "conjugated godan verb", + "romaji": "ochiyuke" + }, + "落ちゆこ": { + "w_type": "godan verb stem", + "romaji": "ochiyuko" + }, + "落ちゆいた": { + "w_type": "conjugated godan verb", + "romaji": "ochiyuita" + }, + "落ちゆいて": { + "w_type": "conjugated godan verb", + "romaji": "ochiyuite" + }, + "掻き込ま": { + "w_type": "godan verb stem", + "romaji": "kakikoma" + }, + "掻き込み": { + "w_type": "godan verb stem", + "romaji": "kakikomi" + }, + "掻き込め": { + "w_type": "conjugated godan verb", + "romaji": "kakikome" + }, + "掻き込も": { + "w_type": "godan verb stem", + "romaji": "kakikomo" + }, + "掻き込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kakikonda" + }, + "掻き込んで": { + "w_type": "conjugated godan verb", + "romaji": "kakikonde" + }, + "聴き取ら": { + "w_type": "godan verb stem", + "romaji": "kikitora" + }, + "聴き取り": { + "w_type": "godan verb stem", + "romaji": "kikitori" + }, + "聴き取れ": { + "w_type": "conjugated godan verb", + "romaji": "kikitore" + }, + "聴き取ろ": { + "w_type": "godan verb stem", + "romaji": "kikitoro" + }, + "聴き取った": { + "w_type": "conjugated godan verb", + "romaji": "kikitotta" + }, + "聴き取って": { + "w_type": "conjugated godan verb", + "romaji": "kikitotte" + }, + "擲り込ま": { + "w_type": "godan verb stem", + "romaji": "nagurikoma" + }, + "擲り込み": { + "w_type": "godan verb stem", + "romaji": "nagurikomi" + }, + "擲り込め": { + "w_type": "conjugated godan verb", + "romaji": "nagurikome" + }, + "擲り込も": { + "w_type": "godan verb stem", + "romaji": "nagurikomo" + }, + "擲り込んだ": { + "w_type": "conjugated godan verb", + "romaji": "nagurikonda" + }, + "擲り込んで": { + "w_type": "conjugated godan verb", + "romaji": "nagurikonde" + }, + "釣り上がら": { + "w_type": "godan verb stem", + "romaji": "tsuriagara" + }, + "釣り上がり": { + "w_type": "godan verb stem", + "romaji": "tsuriagari" + }, + "釣り上がれ": { + "w_type": "conjugated godan verb", + "romaji": "tsuriagare" + }, + "釣り上がろ": { + "w_type": "godan verb stem", + "romaji": "tsuriagaro" + }, + "釣り上がった": { + "w_type": "conjugated godan verb", + "romaji": "tsuriagatta" + }, + "釣り上がって": { + "w_type": "conjugated godan verb", + "romaji": "tsuriagatte" + }, + "浮かび上ら": { + "w_type": "godan verb stem", + "romaji": "ukabiagara" + }, + "浮かび上り": { + "w_type": "godan verb stem", + "romaji": "ukabiagari" + }, + "浮かび上れ": { + "w_type": "conjugated godan verb", + "romaji": "ukabiagare" + }, + "浮かび上ろ": { + "w_type": "godan verb stem", + "romaji": "ukabiagaro" + }, + "浮かび上った": { + "w_type": "conjugated godan verb", + "romaji": "ukabiagatta" + }, + "浮かび上って": { + "w_type": "conjugated godan verb", + "romaji": "ukabiagatte" + }, + "踏み迷わ": { + "w_type": "godan verb stem", + "romaji": "fumimayowa" + }, + "踏み迷い": { + "w_type": "godan verb stem", + "romaji": "fumimayoi" + }, + "踏み迷え": { + "w_type": "conjugated godan verb", + "romaji": "fumimayoe" + }, + "踏み迷お": { + "w_type": "godan verb stem", + "romaji": "fumimayoo" + }, + "踏み迷った": { + "w_type": "conjugated godan verb", + "romaji": "fumimayotta" + }, + "踏み迷って": { + "w_type": "conjugated godan verb", + "romaji": "fumimayotte" + }, + "突っ伏さ": { + "w_type": "godan verb stem", + "romaji": "tsuppusa" + }, + "突っ伏し": { + "w_type": "godan verb stem", + "romaji": "tsuppushi" + }, + "突っ伏せ": { + "w_type": "conjugated godan verb", + "romaji": "tsuppuse" + }, + "突っ伏そ": { + "w_type": "godan verb stem", + "romaji": "tsuppuso" + }, + "突っ伏した": { + "w_type": "conjugated godan verb", + "romaji": "tsuppushita" + }, + "突っ伏して": { + "w_type": "conjugated godan verb", + "romaji": "tsuppushite" + }, + "すまし込ま": { + "w_type": "godan verb stem", + "romaji": "sumashikoma" + }, + "すまし込み": { + "w_type": "godan verb stem", + "romaji": "sumashikomi" + }, + "すまし込め": { + "w_type": "conjugated godan verb", + "romaji": "sumashikome" + }, + "すまし込も": { + "w_type": "godan verb stem", + "romaji": "sumashikomo" + }, + "すまし込んだ": { + "w_type": "conjugated godan verb", + "romaji": "sumashikonda" + }, + "すまし込んで": { + "w_type": "conjugated godan verb", + "romaji": "sumashikonde" + }, + "切り合わ": { + "w_type": "godan verb stem", + "romaji": "kiriawa" + }, + "切り合い": { + "w_type": "godan verb stem", + "romaji": "kiriai" + }, + "切り合え": { + "w_type": "conjugated godan verb", + "romaji": "kiriae" + }, + "切り合お": { + "w_type": "godan verb stem", + "romaji": "kiriao" + }, + "切り合った": { + "w_type": "conjugated godan verb", + "romaji": "kiriatta" + }, + "切り合って": { + "w_type": "conjugated godan verb", + "romaji": "kiriatte" + }, + "夏めか": { + "w_type": "godan verb stem", + "romaji": "natsumeka" + }, + "夏めき": { + "w_type": "godan verb stem", + "romaji": "natsumeki" + }, + "夏めけ": { + "w_type": "conjugated godan verb", + "romaji": "natsumeke" + }, + "夏めこ": { + "w_type": "godan verb stem", + "romaji": "natsumeko" + }, + "夏めいた": { + "w_type": "conjugated godan verb", + "romaji": "natsumeita" + }, + "夏めいて": { + "w_type": "conjugated godan verb", + "romaji": "natsumeite" + }, + "踏みならさ": { + "w_type": "godan verb stem", + "romaji": "fuminarasa" + }, + "踏みならし": { + "w_type": "godan verb stem", + "romaji": "fuminarashi" + }, + "踏みならせ": { + "w_type": "conjugated godan verb", + "romaji": "fuminarase" + }, + "踏みならそ": { + "w_type": "godan verb stem", + "romaji": "fuminaraso" + }, + "踏みならした": { + "w_type": "conjugated godan verb", + "romaji": "fuminarashita" + }, + "踏みならして": { + "w_type": "conjugated godan verb", + "romaji": "fuminarashite" + }, + "蘇ら": { + "w_type": "godan verb stem", + "romaji": "yomigaera" + }, + "蘇り": { + "w_type": "godan verb stem", + "romaji": "yomigaeri" + }, + "蘇れ": { + "w_type": "conjugated godan verb", + "romaji": "yomigaere" + }, + "蘇ろ": { + "w_type": "godan verb stem", + "romaji": "yomigaero" + }, + "蘇った": { + "w_type": "conjugated godan verb", + "romaji": "yomigaetta" + }, + "蘇って": { + "w_type": "conjugated godan verb", + "romaji": "yomigaette" + }, + "買わ": { + "w_type": "godan verb stem", + "romaji": "kawa" + }, + "買い": { + "w_type": "godan verb stem", + "romaji": "kai" + }, + "買え": { + "w_type": "conjugated godan verb", + "romaji": "kae" + }, + "買お": { + "w_type": "godan verb stem", + "romaji": "kao" + }, + "買った": { + "w_type": "conjugated godan verb", + "romaji": "katta" + }, + "買って": { + "w_type": "conjugated godan verb", + "romaji": "katte" + }, + "誘い合わ": { + "w_type": "godan verb stem", + "romaji": "sasoiawa" + }, + "誘い合い": { + "w_type": "godan verb stem", + "romaji": "sasoiai" + }, + "誘い合え": { + "w_type": "conjugated godan verb", + "romaji": "sasoiae" + }, + "誘い合お": { + "w_type": "godan verb stem", + "romaji": "sasoiao" + }, + "誘い合った": { + "w_type": "conjugated godan verb", + "romaji": "sasoiatta" + }, + "誘い合って": { + "w_type": "conjugated godan verb", + "romaji": "sasoiatte" + }, + "見過ごさ": { + "w_type": "godan verb stem", + "romaji": "misugosa" + }, + "見過ごし": { + "w_type": "godan verb stem", + "romaji": "misugoshi" + }, + "見過ごせ": { + "w_type": "conjugated godan verb", + "romaji": "misugose" + }, + "見過ごそ": { + "w_type": "godan verb stem", + "romaji": "misugoso" + }, + "見過ごした": { + "w_type": "conjugated godan verb", + "romaji": "misugoshita" + }, + "見過ごして": { + "w_type": "conjugated godan verb", + "romaji": "misugoshite" + }, + "呼慣らわさ": { + "w_type": "godan verb stem", + "romaji": "yobinarawasa" + }, + "呼慣らわし": { + "w_type": "godan verb stem", + "romaji": "yobinarawashi" + }, + "呼慣らわせ": { + "w_type": "conjugated godan verb", + "romaji": "yobinarawase" + }, + "呼慣らわそ": { + "w_type": "godan verb stem", + "romaji": "yobinarawaso" + }, + "呼慣らわした": { + "w_type": "conjugated godan verb", + "romaji": "yobinarawashita" + }, + "呼慣らわして": { + "w_type": "conjugated godan verb", + "romaji": "yobinarawashite" + }, + "嵌め込ま": { + "w_type": "godan verb stem", + "romaji": "hamekoma" + }, + "嵌め込み": { + "w_type": "godan verb stem", + "romaji": "hamekomi" + }, + "嵌め込め": { + "w_type": "conjugated godan verb", + "romaji": "hamekome" + }, + "嵌め込も": { + "w_type": "godan verb stem", + "romaji": "hamekomo" + }, + "嵌め込んだ": { + "w_type": "conjugated godan verb", + "romaji": "hamekonda" + }, + "嵌め込んで": { + "w_type": "conjugated godan verb", + "romaji": "hamekonde" + }, + "ぶっ倒さ": { + "w_type": "godan verb stem", + "romaji": "buttaosa" + }, + "ぶっ倒し": { + "w_type": "godan verb stem", + "romaji": "buttaoshi" + }, + "ぶっ倒せ": { + "w_type": "conjugated godan verb", + "romaji": "buttaose" + }, + "ぶっ倒そ": { + "w_type": "godan verb stem", + "romaji": "buttaoso" + }, + "ぶっ倒した": { + "w_type": "conjugated godan verb", + "romaji": "buttaoshita" + }, + "ぶっ倒して": { + "w_type": "conjugated godan verb", + "romaji": "buttaoshite" + }, + "突きささ": { + "w_type": "godan verb stem", + "romaji": "tsukisasa" + }, + "突きさし": { + "w_type": "godan verb stem", + "romaji": "tsukisashi" + }, + "突きさせ": { + "w_type": "conjugated godan verb", + "romaji": "tsukisase" + }, + "突きさそ": { + "w_type": "godan verb stem", + "romaji": "tsukisaso" + }, + "突きさした": { + "w_type": "conjugated godan verb", + "romaji": "tsukisashita" + }, + "突きさして": { + "w_type": "conjugated godan verb", + "romaji": "tsukisashite" + }, + "抱えこま": { + "w_type": "godan verb stem", + "romaji": "kakaekoma" + }, + "抱えこみ": { + "w_type": "godan verb stem", + "romaji": "kakaekomi" + }, + "抱えこめ": { + "w_type": "conjugated godan verb", + "romaji": "kakaekome" + }, + "抱えこも": { + "w_type": "godan verb stem", + "romaji": "kakaekomo" + }, + "抱えこんだ": { + "w_type": "conjugated godan verb", + "romaji": "kakaekonda" + }, + "抱えこんで": { + "w_type": "conjugated godan verb", + "romaji": "kakaekonde" + }, + "落ち入ら": { + "w_type": "godan verb stem", + "romaji": "ochiira" + }, + "落ち入り": { + "w_type": "godan verb stem", + "romaji": "ochiiri" + }, + "落ち入れ": { + "w_type": "conjugated godan verb", + "romaji": "ochiire" + }, + "落ち入ろ": { + "w_type": "godan verb stem", + "romaji": "ochiiro" + }, + "落ち入った": { + "w_type": "conjugated godan verb", + "romaji": "ochiitta" + }, + "落ち入って": { + "w_type": "conjugated godan verb", + "romaji": "ochiitte" + }, + "剥ら": { + "w_type": "godan verb stem", + "romaji": "hezura" + }, + "剥り": { + "w_type": "godan verb stem", + "romaji": "hezuri" + }, + "剥れ": { + "w_type": "conjugated godan verb", + "romaji": "hezure" + }, + "剥ろ": { + "w_type": "godan verb stem", + "romaji": "hezuro" + }, + "剥った": { + "w_type": "conjugated godan verb", + "romaji": "hezutta" + }, + "剥って": { + "w_type": "conjugated godan verb", + "romaji": "hezutte" + }, + "気にかから": { + "w_type": "godan verb stem", + "romaji": "kinikakara" + }, + "気にかかり": { + "w_type": "godan verb stem", + "romaji": "kinikakari" + }, + "気にかかれ": { + "w_type": "conjugated godan verb", + "romaji": "kinikakare" + }, + "気にかかろ": { + "w_type": "godan verb stem", + "romaji": "kinikakaro" + }, + "気にかかった": { + "w_type": "conjugated godan verb", + "romaji": "kinikakatta" + }, + "気にかかって": { + "w_type": "conjugated godan verb", + "romaji": "kinikakatte" + }, + "乗りかから": { + "w_type": "godan verb stem", + "romaji": "norikakara" + }, + "乗りかかり": { + "w_type": "godan verb stem", + "romaji": "norikakari" + }, + "乗りかかれ": { + "w_type": "conjugated godan verb", + "romaji": "norikakare" + }, + "乗りかかろ": { + "w_type": "godan verb stem", + "romaji": "norikakaro" + }, + "乗りかかった": { + "w_type": "conjugated godan verb", + "romaji": "norikakatta" + }, + "乗りかかって": { + "w_type": "conjugated godan verb", + "romaji": "norikakatte" + }, + "押入ら": { + "w_type": "godan verb stem", + "romaji": "oshiira" + }, + "押入り": { + "w_type": "godan verb stem", + "romaji": "oshiiri" + }, + "押入れ": { + "w_type": "conjugated godan verb", + "romaji": "oshiire" + }, + "押入ろ": { + "w_type": "godan verb stem", + "romaji": "oshiiro" + }, + "押入った": { + "w_type": "conjugated godan verb", + "romaji": "oshiitta" + }, + "押入って": { + "w_type": "conjugated godan verb", + "romaji": "oshiitte" + }, + "戦が": { + "w_type": "godan verb stem", + "romaji": "soyoga" + }, + "戦ぎ": { + "w_type": "godan verb stem", + "romaji": "soyogi" + }, + "戦げ": { + "w_type": "conjugated godan verb", + "romaji": "soyoge" + }, + "戦ご": { + "w_type": "godan verb stem", + "romaji": "soyogo" + }, + "戦いだ": { + "w_type": "conjugated godan verb", + "romaji": "soyoida" + }, + "戦いで": { + "w_type": "conjugated godan verb", + "romaji": "soyoide" + }, + "喉鳴らさ": { + "w_type": "godan verb stem", + "romaji": "nodonarasa" + }, + "喉鳴らし": { + "w_type": "godan verb stem", + "romaji": "nodonarashi" + }, + "喉鳴らせ": { + "w_type": "conjugated godan verb", + "romaji": "nodonarase" + }, + "喉鳴らそ": { + "w_type": "godan verb stem", + "romaji": "nodonaraso" + }, + "喉鳴らした": { + "w_type": "conjugated godan verb", + "romaji": "nodonarashita" + }, + "喉鳴らして": { + "w_type": "conjugated godan verb", + "romaji": "nodonarashite" + }, + "物語ら": { + "w_type": "godan verb stem", + "romaji": "monogatara" + }, + "物語り": { + "w_type": "godan verb stem", + "romaji": "monogatari" + }, + "物語れ": { + "w_type": "conjugated godan verb", + "romaji": "monogatare" + }, + "物語ろ": { + "w_type": "godan verb stem", + "romaji": "monogataro" + }, + "物語った": { + "w_type": "conjugated godan verb", + "romaji": "monogatatta" + }, + "物語って": { + "w_type": "conjugated godan verb", + "romaji": "monogatatte" + }, + "捲れあがら": { + "w_type": "godan verb stem", + "romaji": "mekureagara" + }, + "捲れあがり": { + "w_type": "godan verb stem", + "romaji": "mekureagari" + }, + "捲れあがれ": { + "w_type": "conjugated godan verb", + "romaji": "mekureagare" + }, + "捲れあがろ": { + "w_type": "godan verb stem", + "romaji": "mekureagaro" + }, + "捲れあがった": { + "w_type": "conjugated godan verb", + "romaji": "mekureagatta" + }, + "捲れあがって": { + "w_type": "conjugated godan verb", + "romaji": "mekureagatte" + }, + "嵌めこま": { + "w_type": "godan verb stem", + "romaji": "hamekoma" + }, + "嵌めこみ": { + "w_type": "godan verb stem", + "romaji": "hamekomi" + }, + "嵌めこめ": { + "w_type": "conjugated godan verb", + "romaji": "hamekome" + }, + "嵌めこも": { + "w_type": "godan verb stem", + "romaji": "hamekomo" + }, + "嵌めこんだ": { + "w_type": "conjugated godan verb", + "romaji": "hamekonda" + }, + "嵌めこんで": { + "w_type": "conjugated godan verb", + "romaji": "hamekonde" + }, + "探ら": { + "w_type": "godan verb stem", + "romaji": "sagura" + }, + "探り": { + "w_type": "godan verb stem", + "romaji": "saguri" + }, + "探れ": { + "w_type": "conjugated godan verb", + "romaji": "sagure" + }, + "探ろ": { + "w_type": "godan verb stem", + "romaji": "saguro" + }, + "探った": { + "w_type": "conjugated godan verb", + "romaji": "sagutta" + }, + "探って": { + "w_type": "conjugated godan verb", + "romaji": "sagutte" + }, + "引下がら": { + "w_type": "godan verb stem", + "romaji": "hikisagara" + }, + "引下がり": { + "w_type": "godan verb stem", + "romaji": "hikisagari" + }, + "引下がれ": { + "w_type": "conjugated godan verb", + "romaji": "hikisagare" + }, + "引下がろ": { + "w_type": "godan verb stem", + "romaji": "hikisagaro" + }, + "引下がった": { + "w_type": "conjugated godan verb", + "romaji": "hikisagatta" + }, + "引下がって": { + "w_type": "conjugated godan verb", + "romaji": "hikisagatte" + }, + "畏まら": { + "w_type": "godan verb stem", + "romaji": "kashikomara" + }, + "畏まり": { + "w_type": "godan verb stem", + "romaji": "kashikomari" + }, + "畏まれ": { + "w_type": "conjugated godan verb", + "romaji": "kashikomare" + }, + "畏まろ": { + "w_type": "godan verb stem", + "romaji": "kashikomaro" + }, + "畏まった": { + "w_type": "conjugated godan verb", + "romaji": "kashikomatta" + }, + "畏まって": { + "w_type": "conjugated godan verb", + "romaji": "kashikomatte" + }, + "出向か": { + "w_type": "godan verb stem", + "romaji": "demuka" + }, + "出向き": { + "w_type": "godan verb stem", + "romaji": "demuki" + }, + "出向け": { + "w_type": "conjugated godan verb", + "romaji": "demuke" + }, + "出向こ": { + "w_type": "godan verb stem", + "romaji": "demuko" + }, + "出向いた": { + "w_type": "conjugated godan verb", + "romaji": "demuita" + }, + "出向いて": { + "w_type": "conjugated godan verb", + "romaji": "demuite" + }, + "恋い忍ば": { + "w_type": "godan verb stem", + "romaji": "koishinoba" + }, + "恋い忍び": { + "w_type": "godan verb stem", + "romaji": "koishinobi" + }, + "恋い忍べ": { + "w_type": "conjugated godan verb", + "romaji": "koishinobe" + }, + "恋い忍ぼ": { + "w_type": "godan verb stem", + "romaji": "koishinobo" + }, + "恋い忍んだ": { + "w_type": "conjugated godan verb", + "romaji": "koishinonda" + }, + "恋い忍んで": { + "w_type": "conjugated godan verb", + "romaji": "koishinonde" + }, + "相調わ": { + "w_type": "godan verb stem", + "romaji": "aitotonowa" + }, + "相調い": { + "w_type": "godan verb stem", + "romaji": "aitotonoi" + }, + "相調え": { + "w_type": "conjugated godan verb", + "romaji": "aitotonoe" + }, + "相調お": { + "w_type": "godan verb stem", + "romaji": "aitotonoo" + }, + "相調った": { + "w_type": "conjugated godan verb", + "romaji": "aitotonotta" + }, + "相調って": { + "w_type": "conjugated godan verb", + "romaji": "aitotonotte" + }, + "舞いあがら": { + "w_type": "godan verb stem", + "romaji": "maiagara" + }, + "舞いあがり": { + "w_type": "godan verb stem", + "romaji": "maiagari" + }, + "舞いあがれ": { + "w_type": "conjugated godan verb", + "romaji": "maiagare" + }, + "舞いあがろ": { + "w_type": "godan verb stem", + "romaji": "maiagaro" + }, + "舞いあがった": { + "w_type": "conjugated godan verb", + "romaji": "maiagatta" + }, + "舞いあがって": { + "w_type": "conjugated godan verb", + "romaji": "maiagatte" + }, + "葬ら": { + "w_type": "godan verb stem", + "romaji": "houmura" + }, + "葬り": { + "w_type": "godan verb stem", + "romaji": "houmuri" + }, + "葬れ": { + "w_type": "conjugated godan verb", + "romaji": "houmure" + }, + "葬ろ": { + "w_type": "godan verb stem", + "romaji": "houmuro" + }, + "葬った": { + "w_type": "conjugated godan verb", + "romaji": "houmutta" + }, + "葬って": { + "w_type": "conjugated godan verb", + "romaji": "houmutte" + }, + "流さ": { + "w_type": "godan verb stem", + "romaji": "nagasa" + }, + "流し": { + "w_type": "godan verb stem", + "romaji": "nagashi" + }, + "流せ": { + "w_type": "conjugated godan verb", + "romaji": "nagase" + }, + "流そ": { + "w_type": "godan verb stem", + "romaji": "nagaso" + }, + "流した": { + "w_type": "conjugated godan verb", + "romaji": "nagashita" + }, + "流して": { + "w_type": "conjugated godan verb", + "romaji": "nagashite" + }, + "許さ": { + "w_type": "godan verb stem", + "romaji": "yurusa" + }, + "許し": { + "w_type": "godan verb stem", + "romaji": "yurushi" + }, + "許せ": { + "w_type": "conjugated godan verb", + "romaji": "yuruse" + }, + "許そ": { + "w_type": "godan verb stem", + "romaji": "yuruso" + }, + "許した": { + "w_type": "conjugated godan verb", + "romaji": "yurushita" + }, + "許して": { + "w_type": "conjugated godan verb", + "romaji": "yurushite" + }, + "擲ら": { + "w_type": "godan verb stem", + "romaji": "nagura" + }, + "擲り": { + "w_type": "godan verb stem", + "romaji": "naguri" + }, + "擲れ": { + "w_type": "conjugated godan verb", + "romaji": "nagure" + }, + "擲ろ": { + "w_type": "godan verb stem", + "romaji": "naguro" + }, + "擲った": { + "w_type": "conjugated godan verb", + "romaji": "nagutta" + }, + "擲って": { + "w_type": "conjugated godan verb", + "romaji": "nagutte" + }, + "衝き動かさ": { + "w_type": "godan verb stem", + "romaji": "tsukiugokasa" + }, + "衝き動かし": { + "w_type": "godan verb stem", + "romaji": "tsukiugokashi" + }, + "衝き動かせ": { + "w_type": "conjugated godan verb", + "romaji": "tsukiugokase" + }, + "衝き動かそ": { + "w_type": "godan verb stem", + "romaji": "tsukiugokaso" + }, + "衝き動かした": { + "w_type": "conjugated godan verb", + "romaji": "tsukiugokashita" + }, + "衝き動かして": { + "w_type": "conjugated godan verb", + "romaji": "tsukiugokashite" + }, + "引っ張ら": { + "w_type": "godan verb stem", + "romaji": "hippara" + }, + "引っ張り": { + "w_type": "godan verb stem", + "romaji": "hippari" + }, + "引っ張れ": { + "w_type": "conjugated godan verb", + "romaji": "hippare" + }, + "引っ張ろ": { + "w_type": "godan verb stem", + "romaji": "hipparo" + }, + "引っ張った": { + "w_type": "conjugated godan verb", + "romaji": "hippatta" + }, + "引っ張って": { + "w_type": "conjugated godan verb", + "romaji": "hippatte" + }, + "撃ち合わ": { + "w_type": "godan verb stem", + "romaji": "uchiawa" + }, + "撃ち合い": { + "w_type": "godan verb stem", + "romaji": "uchiai" + }, + "撃ち合え": { + "w_type": "conjugated godan verb", + "romaji": "uchiae" + }, + "撃ち合お": { + "w_type": "godan verb stem", + "romaji": "uchiao" + }, + "撃ち合った": { + "w_type": "conjugated godan verb", + "romaji": "uchiatta" + }, + "撃ち合って": { + "w_type": "conjugated godan verb", + "romaji": "uchiatte" + }, + "読み過さ": { + "w_type": "godan verb stem", + "romaji": "yomisugosa" + }, + "読み過し": { + "w_type": "godan verb stem", + "romaji": "yomisugoshi" + }, + "読み過せ": { + "w_type": "conjugated godan verb", + "romaji": "yomisugose" + }, + "読み過そ": { + "w_type": "godan verb stem", + "romaji": "yomisugoso" + }, + "読み過した": { + "w_type": "conjugated godan verb", + "romaji": "yomisugoshita" + }, + "読み過して": { + "w_type": "conjugated godan verb", + "romaji": "yomisugoshite" + }, + "分かり合わ": { + "w_type": "godan verb stem", + "romaji": "wakariawa" + }, + "分かり合い": { + "w_type": "godan verb stem", + "romaji": "wakariai" + }, + "分かり合え": { + "w_type": "conjugated godan verb", + "romaji": "wakariae" + }, + "分かり合お": { + "w_type": "godan verb stem", + "romaji": "wakariao" + }, + "分かり合った": { + "w_type": "conjugated godan verb", + "romaji": "wakariatta" + }, + "分かり合って": { + "w_type": "conjugated godan verb", + "romaji": "wakariatte" + }, + "抜き去ら": { + "w_type": "godan verb stem", + "romaji": "nukisara" + }, + "抜き去り": { + "w_type": "godan verb stem", + "romaji": "nukisari" + }, + "抜き去れ": { + "w_type": "conjugated godan verb", + "romaji": "nukisare" + }, + "抜き去ろ": { + "w_type": "godan verb stem", + "romaji": "nukisaro" + }, + "抜き去った": { + "w_type": "conjugated godan verb", + "romaji": "nukisatta" + }, + "抜き去って": { + "w_type": "conjugated godan verb", + "romaji": "nukisatte" + }, + "貴ま": { + "w_type": "godan verb stem", + "romaji": "tattoma" + }, + "貴み": { + "w_type": "godan verb stem", + "romaji": "tattomi" + }, + "貴め": { + "w_type": "conjugated godan verb", + "romaji": "tattome" + }, + "貴も": { + "w_type": "godan verb stem", + "romaji": "tattomo" + }, + "いじくり回さ": { + "w_type": "godan verb stem", + "romaji": "ijikurimawasa" + }, + "いじくり回し": { + "w_type": "godan verb stem", + "romaji": "ijikurimawashi" + }, + "いじくり回せ": { + "w_type": "conjugated godan verb", + "romaji": "ijikurimawase" + }, + "いじくり回そ": { + "w_type": "godan verb stem", + "romaji": "ijikurimawaso" + }, + "いじくり回した": { + "w_type": "conjugated godan verb", + "romaji": "ijikurimawashita" + }, + "いじくり回して": { + "w_type": "conjugated godan verb", + "romaji": "ijikurimawashite" + }, + "食い違わ": { + "w_type": "godan verb stem", + "romaji": "kuichigawa" + }, + "食い違い": { + "w_type": "godan verb stem", + "romaji": "kuichigai" + }, + "食い違え": { + "w_type": "conjugated godan verb", + "romaji": "kuichigae" + }, + "食い違お": { + "w_type": "godan verb stem", + "romaji": "kuichigao" + }, + "食い違った": { + "w_type": "conjugated godan verb", + "romaji": "kuichigatta" + }, + "食い違って": { + "w_type": "conjugated godan verb", + "romaji": "kuichigatte" + }, + "出さ": { + "w_type": "godan verb stem", + "romaji": "dasa" + }, + "出し": { + "w_type": "godan verb stem", + "romaji": "dashi" + }, + "出せ": { + "w_type": "conjugated godan verb", + "romaji": "dase" + }, + "出そ": { + "w_type": "godan verb stem", + "romaji": "daso" + }, + "出した": { + "w_type": "conjugated godan verb", + "romaji": "dashita" + }, + "出して": { + "w_type": "conjugated godan verb", + "romaji": "dashite" + }, + "ブチ壊さ": { + "w_type": "godan verb stem", + "romaji": "buchikowasa" + }, + "ブチ壊し": { + "w_type": "godan verb stem", + "romaji": "buchikowashi" + }, + "ブチ壊せ": { + "w_type": "conjugated godan verb", + "romaji": "buchikowase" + }, + "ブチ壊そ": { + "w_type": "godan verb stem", + "romaji": "buchikowaso" + }, + "ブチ壊した": { + "w_type": "conjugated godan verb", + "romaji": "buchikowashita" + }, + "ブチ壊して": { + "w_type": "conjugated godan verb", + "romaji": "buchikowashite" + }, + "咲きそろわ": { + "w_type": "godan verb stem", + "romaji": "sakisorowa" + }, + "咲きそろい": { + "w_type": "godan verb stem", + "romaji": "sakisoroi" + }, + "咲きそろえ": { + "w_type": "conjugated godan verb", + "romaji": "sakisoroe" + }, + "咲きそろお": { + "w_type": "godan verb stem", + "romaji": "sakisoroo" + }, + "咲きそろった": { + "w_type": "conjugated godan verb", + "romaji": "sakisorotta" + }, + "咲きそろって": { + "w_type": "conjugated godan verb", + "romaji": "sakisorotte" + }, + "説及ば": { + "w_type": "godan verb stem", + "romaji": "tokioyoba" + }, + "説及び": { + "w_type": "godan verb stem", + "romaji": "tokioyobi" + }, + "説及べ": { + "w_type": "conjugated godan verb", + "romaji": "tokioyobe" + }, + "説及ぼ": { + "w_type": "godan verb stem", + "romaji": "tokioyobo" + }, + "説及んだ": { + "w_type": "conjugated godan verb", + "romaji": "tokioyonda" + }, + "説及んで": { + "w_type": "conjugated godan verb", + "romaji": "tokioyonde" + }, + "冴えわたら": { + "w_type": "godan verb stem", + "romaji": "saewatara" + }, + "冴えわたり": { + "w_type": "godan verb stem", + "romaji": "saewatari" + }, + "冴えわたれ": { + "w_type": "conjugated godan verb", + "romaji": "saewatare" + }, + "冴えわたろ": { + "w_type": "godan verb stem", + "romaji": "saewataro" + }, + "冴えわたった": { + "w_type": "conjugated godan verb", + "romaji": "saewatatta" + }, + "冴えわたって": { + "w_type": "conjugated godan verb", + "romaji": "saewatatte" + }, + "喚か": { + "w_type": "godan verb stem", + "romaji": "wameka" + }, + "喚き": { + "w_type": "godan verb stem", + "romaji": "wameki" + }, + "喚け": { + "w_type": "conjugated godan verb", + "romaji": "wameke" + }, + "喚こ": { + "w_type": "godan verb stem", + "romaji": "wameko" + }, + "喚いた": { + "w_type": "conjugated godan verb", + "romaji": "wameita" + }, + "喚いて": { + "w_type": "conjugated godan verb", + "romaji": "wameite" + }, + "誤ら": { + "w_type": "godan verb stem", + "romaji": "ayamara" + }, + "誤り": { + "w_type": "godan verb stem", + "romaji": "ayamari" + }, + "誤れ": { + "w_type": "conjugated godan verb", + "romaji": "ayamare" + }, + "誤ろ": { + "w_type": "godan verb stem", + "romaji": "ayamaro" + }, + "誤った": { + "w_type": "conjugated godan verb", + "romaji": "ayamatta" + }, + "誤って": { + "w_type": "conjugated godan verb", + "romaji": "ayamatte" + }, + "書き直さ": { + "w_type": "godan verb stem", + "romaji": "kakinaosa" + }, + "書き直し": { + "w_type": "godan verb stem", + "romaji": "kakinaoshi" + }, + "書き直せ": { + "w_type": "conjugated godan verb", + "romaji": "kakinaose" + }, + "書き直そ": { + "w_type": "godan verb stem", + "romaji": "kakinaoso" + }, + "書き直した": { + "w_type": "conjugated godan verb", + "romaji": "kakinaoshita" + }, + "書き直して": { + "w_type": "conjugated godan verb", + "romaji": "kakinaoshite" + }, + "切り下ろさ": { + "w_type": "godan verb stem", + "romaji": "kiriorosa" + }, + "切り下ろし": { + "w_type": "godan verb stem", + "romaji": "kirioroshi" + }, + "切り下ろせ": { + "w_type": "conjugated godan verb", + "romaji": "kiriorose" + }, + "切り下ろそ": { + "w_type": "godan verb stem", + "romaji": "kirioroso" + }, + "切り下ろした": { + "w_type": "conjugated godan verb", + "romaji": "kirioroshita" + }, + "切り下ろして": { + "w_type": "conjugated godan verb", + "romaji": "kirioroshite" + }, + "蹴とばさ": { + "w_type": "godan verb stem", + "romaji": "ketobasa" + }, + "蹴とばし": { + "w_type": "godan verb stem", + "romaji": "ketobashi" + }, + "蹴とばせ": { + "w_type": "conjugated godan verb", + "romaji": "ketobase" + }, + "蹴とばそ": { + "w_type": "godan verb stem", + "romaji": "ketobaso" + }, + "蹴とばした": { + "w_type": "conjugated godan verb", + "romaji": "ketobashita" + }, + "蹴とばして": { + "w_type": "conjugated godan verb", + "romaji": "ketobashite" + }, + "焼か": { + "w_type": "godan verb stem", + "romaji": "yaka" + }, + "焼き": { + "w_type": "godan verb stem", + "romaji": "yaki" + }, + "焼け": { + "w_type": "conjugated godan verb", + "romaji": "yake" + }, + "焼こ": { + "w_type": "godan verb stem", + "romaji": "yako" + }, + "焼いた": { + "w_type": "conjugated godan verb", + "romaji": "yaita" + }, + "焼いて": { + "w_type": "conjugated godan verb", + "romaji": "yaite" + }, + "打っ放さ": { + "w_type": "godan verb stem", + "romaji": "buppanasa" + }, + "打っ放し": { + "w_type": "godan verb stem", + "romaji": "buppanashi" + }, + "打っ放せ": { + "w_type": "conjugated godan verb", + "romaji": "buppanase" + }, + "打っ放そ": { + "w_type": "godan verb stem", + "romaji": "buppanaso" + }, + "打っ放した": { + "w_type": "conjugated godan verb", + "romaji": "buppanashita" + }, + "打っ放して": { + "w_type": "conjugated godan verb", + "romaji": "buppanashite" + }, + "御出でなさら": { + "w_type": "godan verb stem", + "romaji": "oidenasara" + }, + "御出でなさり": { + "w_type": "godan verb stem", + "romaji": "oidenasari" + }, + "御出でなされ": { + "w_type": "conjugated godan verb", + "romaji": "oidenasare" + }, + "御出でなさろ": { + "w_type": "godan verb stem", + "romaji": "oidenasaro" + }, + "御出でなさった": { + "w_type": "conjugated godan verb", + "romaji": "oidenasatta" + }, + "御出でなさって": { + "w_type": "conjugated godan verb", + "romaji": "oidenasatte" + }, + "締切ら": { + "w_type": "godan verb stem", + "romaji": "shimekira" + }, + "締切り": { + "w_type": "godan verb stem", + "romaji": "shimekiri" + }, + "締切れ": { + "w_type": "conjugated godan verb", + "romaji": "shimekire" + }, + "締切ろ": { + "w_type": "godan verb stem", + "romaji": "shimekiro" + }, + "締切った": { + "w_type": "conjugated godan verb", + "romaji": "shimekitta" + }, + "締切って": { + "w_type": "conjugated godan verb", + "romaji": "shimekitte" + }, + "追いこさ": { + "w_type": "godan verb stem", + "romaji": "oikosa" + }, + "追いこし": { + "w_type": "godan verb stem", + "romaji": "oikoshi" + }, + "追いこせ": { + "w_type": "conjugated godan verb", + "romaji": "oikose" + }, + "追いこそ": { + "w_type": "godan verb stem", + "romaji": "oikoso" + }, + "追いこした": { + "w_type": "conjugated godan verb", + "romaji": "oikoshita" + }, + "追いこして": { + "w_type": "conjugated godan verb", + "romaji": "oikoshite" + }, + "飛越さ": { + "w_type": "godan verb stem", + "romaji": "tobikosa" + }, + "飛越し": { + "w_type": "godan verb stem", + "romaji": "tobikoshi" + }, + "飛越せ": { + "w_type": "conjugated godan verb", + "romaji": "tobikose" + }, + "飛越そ": { + "w_type": "godan verb stem", + "romaji": "tobikoso" + }, + "飛越した": { + "w_type": "conjugated godan verb", + "romaji": "tobikoshita" + }, + "飛越して": { + "w_type": "conjugated godan verb", + "romaji": "tobikoshite" + }, + "絡み合わ": { + "w_type": "godan verb stem", + "romaji": "karamiawa" + }, + "絡み合い": { + "w_type": "godan verb stem", + "romaji": "karamiai" + }, + "絡み合え": { + "w_type": "conjugated godan verb", + "romaji": "karamiae" + }, + "絡み合お": { + "w_type": "godan verb stem", + "romaji": "karamiao" + }, + "絡み合った": { + "w_type": "conjugated godan verb", + "romaji": "karamiatta" + }, + "絡み合って": { + "w_type": "conjugated godan verb", + "romaji": "karamiatte" + }, + "機嫌を直さ": { + "w_type": "godan verb stem", + "romaji": "kigen wo naosa" + }, + "機嫌を直し": { + "w_type": "godan verb stem", + "romaji": "kigen wo naoshi" + }, + "機嫌を直せ": { + "w_type": "conjugated godan verb", + "romaji": "kigen wo naose" + }, + "機嫌を直そ": { + "w_type": "godan verb stem", + "romaji": "kigen wo naoso" + }, + "機嫌を直した": { + "w_type": "conjugated godan verb", + "romaji": "kigen wo naoshita" + }, + "機嫌を直して": { + "w_type": "conjugated godan verb", + "romaji": "kigen wo naoshite" + }, + "言い直さ": { + "w_type": "godan verb stem", + "romaji": "iinaosa" + }, + "言い直し": { + "w_type": "godan verb stem", + "romaji": "iinaoshi" + }, + "言い直せ": { + "w_type": "conjugated godan verb", + "romaji": "iinaose" + }, + "言い直そ": { + "w_type": "godan verb stem", + "romaji": "iinaoso" + }, + "言い直した": { + "w_type": "conjugated godan verb", + "romaji": "iinaoshita" + }, + "言い直して": { + "w_type": "conjugated godan verb", + "romaji": "iinaoshite" + }, + "俏さ": { + "w_type": "godan verb stem", + "romaji": "yatsusa" + }, + "俏し": { + "w_type": "godan verb stem", + "romaji": "yatsushi" + }, + "俏せ": { + "w_type": "conjugated godan verb", + "romaji": "yatsuse" + }, + "俏そ": { + "w_type": "godan verb stem", + "romaji": "yatsuso" + }, + "俏した": { + "w_type": "conjugated godan verb", + "romaji": "yatsushita" + }, + "俏して": { + "w_type": "conjugated godan verb", + "romaji": "yatsushite" + }, + "ふるい落とさ": { + "w_type": "godan verb stem", + "romaji": "furuiotosa" + }, + "ふるい落とし": { + "w_type": "godan verb stem", + "romaji": "furuiotoshi" + }, + "ふるい落とせ": { + "w_type": "conjugated godan verb", + "romaji": "furuiotose" + }, + "ふるい落とそ": { + "w_type": "godan verb stem", + "romaji": "furuiotoso" + }, + "ふるい落とした": { + "w_type": "conjugated godan verb", + "romaji": "furuiotoshita" + }, + "ふるい落として": { + "w_type": "conjugated godan verb", + "romaji": "furuiotoshite" + }, + "啀み合わ": { + "w_type": "godan verb stem", + "romaji": "igamiawa" + }, + "啀み合い": { + "w_type": "godan verb stem", + "romaji": "igamiai" + }, + "啀み合え": { + "w_type": "conjugated godan verb", + "romaji": "igamiae" + }, + "啀み合お": { + "w_type": "godan verb stem", + "romaji": "igamiao" + }, + "啀み合った": { + "w_type": "conjugated godan verb", + "romaji": "igamiatta" + }, + "啀み合って": { + "w_type": "conjugated godan verb", + "romaji": "igamiatte" + }, + "梃摺ら": { + "w_type": "godan verb stem", + "romaji": "tekozura" + }, + "梃摺り": { + "w_type": "godan verb stem", + "romaji": "tekozuri" + }, + "梃摺れ": { + "w_type": "conjugated godan verb", + "romaji": "tekozure" + }, + "梃摺ろ": { + "w_type": "godan verb stem", + "romaji": "tekozuro" + }, + "梃摺った": { + "w_type": "conjugated godan verb", + "romaji": "tekozutta" + }, + "梃摺って": { + "w_type": "conjugated godan verb", + "romaji": "tekozutte" + }, + "成り上ら": { + "w_type": "godan verb stem", + "romaji": "nariagara" + }, + "成り上り": { + "w_type": "godan verb stem", + "romaji": "nariagari" + }, + "成り上れ": { + "w_type": "conjugated godan verb", + "romaji": "nariagare" + }, + "成り上ろ": { + "w_type": "godan verb stem", + "romaji": "nariagaro" + }, + "成り上った": { + "w_type": "conjugated godan verb", + "romaji": "nariagatta" + }, + "成り上って": { + "w_type": "conjugated godan verb", + "romaji": "nariagatte" + }, + "こき落とさ": { + "w_type": "godan verb stem", + "romaji": "kokiotosa" + }, + "こき落とし": { + "w_type": "godan verb stem", + "romaji": "kokiotoshi" + }, + "こき落とせ": { + "w_type": "conjugated godan verb", + "romaji": "kokiotose" + }, + "こき落とそ": { + "w_type": "godan verb stem", + "romaji": "kokiotoso" + }, + "こき落とした": { + "w_type": "conjugated godan verb", + "romaji": "kokiotoshita" + }, + "こき落として": { + "w_type": "conjugated godan verb", + "romaji": "kokiotoshite" + }, + "往か": { + "w_type": "godan verb stem", + "romaji": "ika" + }, + "往き": { + "w_type": "godan verb stem", + "romaji": "iki" + }, + "往け": { + "w_type": "conjugated godan verb", + "romaji": "ike" + }, + "往こ": { + "w_type": "godan verb stem", + "romaji": "iko" + }, + "往いた": { + "w_type": "conjugated godan verb", + "romaji": "iita" + }, + "往いて": { + "w_type": "conjugated godan verb", + "romaji": "iite" + }, + "食っ付か": { + "w_type": "godan verb stem", + "romaji": "kuttsuka" + }, + "食っ付き": { + "w_type": "godan verb stem", + "romaji": "kuttsuki" + }, + "食っ付け": { + "w_type": "conjugated godan verb", + "romaji": "kuttsuke" + }, + "食っ付こ": { + "w_type": "godan verb stem", + "romaji": "kuttsuko" + }, + "食っ付いた": { + "w_type": "conjugated godan verb", + "romaji": "kuttsuita" + }, + "食っ付いて": { + "w_type": "conjugated godan verb", + "romaji": "kuttsuite" + }, + "避わさ": { + "w_type": "godan verb stem", + "romaji": "kawasa" + }, + "避わし": { + "w_type": "godan verb stem", + "romaji": "kawashi" + }, + "避わせ": { + "w_type": "conjugated godan verb", + "romaji": "kawase" + }, + "避わそ": { + "w_type": "godan verb stem", + "romaji": "kawaso" + }, + "避わした": { + "w_type": "conjugated godan verb", + "romaji": "kawashita" + }, + "避わして": { + "w_type": "conjugated godan verb", + "romaji": "kawashite" + }, + "請出さ": { + "w_type": "godan verb stem", + "romaji": "ukedasa" + }, + "請出し": { + "w_type": "godan verb stem", + "romaji": "ukedashi" + }, + "請出せ": { + "w_type": "conjugated godan verb", + "romaji": "ukedase" + }, + "請出そ": { + "w_type": "godan verb stem", + "romaji": "ukedaso" + }, + "請出した": { + "w_type": "conjugated godan verb", + "romaji": "ukedashita" + }, + "請出して": { + "w_type": "conjugated godan verb", + "romaji": "ukedashite" + }, + "綴じ込ま": { + "w_type": "godan verb stem", + "romaji": "tojikoma" + }, + "綴じ込み": { + "w_type": "godan verb stem", + "romaji": "tojikomi" + }, + "綴じ込め": { + "w_type": "conjugated godan verb", + "romaji": "tojikome" + }, + "綴じ込も": { + "w_type": "godan verb stem", + "romaji": "tojikomo" + }, + "綴じ込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tojikonda" + }, + "綴じ込んで": { + "w_type": "conjugated godan verb", + "romaji": "tojikonde" + }, + "誉めちぎら": { + "w_type": "godan verb stem", + "romaji": "homechigira" + }, + "誉めちぎり": { + "w_type": "godan verb stem", + "romaji": "homechigiri" + }, + "誉めちぎれ": { + "w_type": "conjugated godan verb", + "romaji": "homechigire" + }, + "誉めちぎろ": { + "w_type": "godan verb stem", + "romaji": "homechigiro" + }, + "誉めちぎった": { + "w_type": "conjugated godan verb", + "romaji": "homechigitta" + }, + "誉めちぎって": { + "w_type": "conjugated godan verb", + "romaji": "homechigitte" + }, + "寄り合わ": { + "w_type": "godan verb stem", + "romaji": "yoriawa" + }, + "寄り合い": { + "w_type": "godan verb stem", + "romaji": "yoriai" + }, + "寄り合え": { + "w_type": "conjugated godan verb", + "romaji": "yoriae" + }, + "寄り合お": { + "w_type": "godan verb stem", + "romaji": "yoriao" + }, + "寄り合った": { + "w_type": "conjugated godan verb", + "romaji": "yoriatta" + }, + "寄り合って": { + "w_type": "conjugated godan verb", + "romaji": "yoriatte" + }, + "仕出来さ": { + "w_type": "godan verb stem", + "romaji": "shidekasa" + }, + "仕出来し": { + "w_type": "godan verb stem", + "romaji": "shidekashi" + }, + "仕出来せ": { + "w_type": "conjugated godan verb", + "romaji": "shidekase" + }, + "仕出来そ": { + "w_type": "godan verb stem", + "romaji": "shidekaso" + }, + "仕出来した": { + "w_type": "conjugated godan verb", + "romaji": "shidekashita" + }, + "仕出来して": { + "w_type": "conjugated godan verb", + "romaji": "shidekashite" + }, + "移りゆか": { + "w_type": "godan verb stem", + "romaji": "utsuriyuka" + }, + "移りゆき": { + "w_type": "godan verb stem", + "romaji": "utsuriyuki" + }, + "移りゆけ": { + "w_type": "conjugated godan verb", + "romaji": "utsuriyuke" + }, + "移りゆこ": { + "w_type": "godan verb stem", + "romaji": "utsuriyuko" + }, + "移りゆいた": { + "w_type": "conjugated godan verb", + "romaji": "utsuriyuita" + }, + "移りゆいて": { + "w_type": "conjugated godan verb", + "romaji": "utsuriyuite" + }, + "轢か": { + "w_type": "godan verb stem", + "romaji": "hika" + }, + "轢き": { + "w_type": "godan verb stem", + "romaji": "hiki" + }, + "轢け": { + "w_type": "conjugated godan verb", + "romaji": "hike" + }, + "轢こ": { + "w_type": "godan verb stem", + "romaji": "hiko" + }, + "轢いた": { + "w_type": "conjugated godan verb", + "romaji": "hiita" + }, + "轢いて": { + "w_type": "conjugated godan verb", + "romaji": "hiite" + }, + "鳴きしきら": { + "w_type": "godan verb stem", + "romaji": "nakishikira" + }, + "鳴きしきり": { + "w_type": "godan verb stem", + "romaji": "nakishikiri" + }, + "鳴きしきれ": { + "w_type": "conjugated godan verb", + "romaji": "nakishikire" + }, + "鳴きしきろ": { + "w_type": "godan verb stem", + "romaji": "nakishikiro" + }, + "鳴きしきった": { + "w_type": "conjugated godan verb", + "romaji": "nakishikitta" + }, + "鳴きしきって": { + "w_type": "conjugated godan verb", + "romaji": "nakishikitte" + }, + "迫り出さ": { + "w_type": "godan verb stem", + "romaji": "seridasa" + }, + "迫り出し": { + "w_type": "godan verb stem", + "romaji": "seridashi" + }, + "迫り出せ": { + "w_type": "conjugated godan verb", + "romaji": "seridase" + }, + "迫り出そ": { + "w_type": "godan verb stem", + "romaji": "seridaso" + }, + "迫り出した": { + "w_type": "conjugated godan verb", + "romaji": "seridashita" + }, + "迫り出して": { + "w_type": "conjugated godan verb", + "romaji": "seridashite" + }, + "言い送ら": { + "w_type": "godan verb stem", + "romaji": "iiokura" + }, + "言い送り": { + "w_type": "godan verb stem", + "romaji": "iiokuri" + }, + "言い送れ": { + "w_type": "conjugated godan verb", + "romaji": "iiokure" + }, + "言い送ろ": { + "w_type": "godan verb stem", + "romaji": "iiokuro" + }, + "言い送った": { + "w_type": "conjugated godan verb", + "romaji": "iiokutta" + }, + "言い送って": { + "w_type": "conjugated godan verb", + "romaji": "iiokutte" + }, + "撮ら": { + "w_type": "godan verb stem", + "romaji": "tora" + }, + "撮り": { + "w_type": "godan verb stem", + "romaji": "tori" + }, + "撮れ": { + "w_type": "conjugated godan verb", + "romaji": "tore" + }, + "撮ろ": { + "w_type": "godan verb stem", + "romaji": "toro" + }, + "撮った": { + "w_type": "conjugated godan verb", + "romaji": "totta" + }, + "撮って": { + "w_type": "conjugated godan verb", + "romaji": "totte" + }, + "抱え込ま": { + "w_type": "godan verb stem", + "romaji": "kakaekoma" + }, + "抱え込み": { + "w_type": "godan verb stem", + "romaji": "kakaekomi" + }, + "抱え込め": { + "w_type": "conjugated godan verb", + "romaji": "kakaekome" + }, + "抱え込も": { + "w_type": "godan verb stem", + "romaji": "kakaekomo" + }, + "抱え込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kakaekonda" + }, + "抱え込んで": { + "w_type": "conjugated godan verb", + "romaji": "kakaekonde" + }, + "流し出さ": { + "w_type": "godan verb stem", + "romaji": "nagashidasa" + }, + "流し出し": { + "w_type": "godan verb stem", + "romaji": "nagashidashi" + }, + "流し出せ": { + "w_type": "conjugated godan verb", + "romaji": "nagashidase" + }, + "流し出そ": { + "w_type": "godan verb stem", + "romaji": "nagashidaso" + }, + "流し出した": { + "w_type": "conjugated godan verb", + "romaji": "nagashidashita" + }, + "流し出して": { + "w_type": "conjugated godan verb", + "romaji": "nagashidashite" + }, + "言い止さ": { + "w_type": "godan verb stem", + "romaji": "iisasa" + }, + "言い止し": { + "w_type": "godan verb stem", + "romaji": "iisashi" + }, + "言い止せ": { + "w_type": "conjugated godan verb", + "romaji": "iisase" + }, + "言い止そ": { + "w_type": "godan verb stem", + "romaji": "iisaso" + }, + "言い止した": { + "w_type": "conjugated godan verb", + "romaji": "iisashita" + }, + "言い止して": { + "w_type": "conjugated godan verb", + "romaji": "iisashite" + }, + "切り組ま": { + "w_type": "godan verb stem", + "romaji": "kirikuma" + }, + "切り組み": { + "w_type": "godan verb stem", + "romaji": "kirikumi" + }, + "切り組め": { + "w_type": "conjugated godan verb", + "romaji": "kirikume" + }, + "切り組も": { + "w_type": "godan verb stem", + "romaji": "kirikumo" + }, + "切り組んだ": { + "w_type": "conjugated godan verb", + "romaji": "kirikunda" + }, + "切り組んで": { + "w_type": "conjugated godan verb", + "romaji": "kirikunde" + }, + "微笑ま": { + "w_type": "godan verb stem", + "romaji": "hohoema" + }, + "微笑み": { + "w_type": "godan verb stem", + "romaji": "hohoemi" + }, + "微笑め": { + "w_type": "conjugated godan verb", + "romaji": "hohoeme" + }, + "微笑も": { + "w_type": "godan verb stem", + "romaji": "hohoemo" + }, + "微笑んだ": { + "w_type": "conjugated godan verb", + "romaji": "hohoenda" + }, + "微笑んで": { + "w_type": "conjugated godan verb", + "romaji": "hohoende" + }, + "噴か": { + "w_type": "godan verb stem", + "romaji": "fuka" + }, + "噴き": { + "w_type": "godan verb stem", + "romaji": "fuki" + }, + "噴け": { + "w_type": "conjugated godan verb", + "romaji": "fuke" + }, + "噴こ": { + "w_type": "godan verb stem", + "romaji": "fuko" + }, + "噴いた": { + "w_type": "conjugated godan verb", + "romaji": "fuita" + }, + "噴いて": { + "w_type": "conjugated godan verb", + "romaji": "fuite" + }, + "追いまわさ": { + "w_type": "godan verb stem", + "romaji": "oimawasa" + }, + "追いまわし": { + "w_type": "godan verb stem", + "romaji": "oimawashi" + }, + "追いまわせ": { + "w_type": "conjugated godan verb", + "romaji": "oimawase" + }, + "追いまわそ": { + "w_type": "godan verb stem", + "romaji": "oimawaso" + }, + "追いまわした": { + "w_type": "conjugated godan verb", + "romaji": "oimawashita" + }, + "追いまわして": { + "w_type": "conjugated godan verb", + "romaji": "oimawashite" + }, + "咲き残ら": { + "w_type": "godan verb stem", + "romaji": "sakinokora" + }, + "咲き残り": { + "w_type": "godan verb stem", + "romaji": "sakinokori" + }, + "咲き残れ": { + "w_type": "conjugated godan verb", + "romaji": "sakinokore" + }, + "咲き残ろ": { + "w_type": "godan verb stem", + "romaji": "sakinokoro" + }, + "咲き残った": { + "w_type": "conjugated godan verb", + "romaji": "sakinokotta" + }, + "咲き残って": { + "w_type": "conjugated godan verb", + "romaji": "sakinokotte" + }, + "引っ掴ま": { + "w_type": "godan verb stem", + "romaji": "hittsukama" + }, + "引っ掴み": { + "w_type": "godan verb stem", + "romaji": "hittsukami" + }, + "引っ掴め": { + "w_type": "conjugated godan verb", + "romaji": "hittsukame" + }, + "引っ掴も": { + "w_type": "godan verb stem", + "romaji": "hittsukamo" + }, + "引っ掴んだ": { + "w_type": "conjugated godan verb", + "romaji": "hittsukanda" + }, + "引っ掴んで": { + "w_type": "conjugated godan verb", + "romaji": "hittsukande" + }, + "押し開か": { + "w_type": "godan verb stem", + "romaji": "oshihiraka" + }, + "押し開き": { + "w_type": "godan verb stem", + "romaji": "oshihiraki" + }, + "押し開け": { + "w_type": "conjugated godan verb", + "romaji": "oshihirake" + }, + "押し開こ": { + "w_type": "godan verb stem", + "romaji": "oshihirako" + }, + "押し開いた": { + "w_type": "conjugated godan verb", + "romaji": "oshihiraita" + }, + "押し開いて": { + "w_type": "conjugated godan verb", + "romaji": "oshihiraite" + }, + "駆け巡ら": { + "w_type": "godan verb stem", + "romaji": "kakemegura" + }, + "駆け巡り": { + "w_type": "godan verb stem", + "romaji": "kakemeguri" + }, + "駆け巡れ": { + "w_type": "conjugated godan verb", + "romaji": "kakemegure" + }, + "駆け巡ろ": { + "w_type": "godan verb stem", + "romaji": "kakemeguro" + }, + "駆け巡った": { + "w_type": "conjugated godan verb", + "romaji": "kakemegutta" + }, + "駆け巡って": { + "w_type": "conjugated godan verb", + "romaji": "kakemegutte" + }, + "見出さ": { + "w_type": "godan verb stem", + "romaji": "miidasa" + }, + "見出し": { + "w_type": "godan verb stem", + "romaji": "miidashi" + }, + "見出せ": { + "w_type": "conjugated godan verb", + "romaji": "miidase" + }, + "見出そ": { + "w_type": "godan verb stem", + "romaji": "miidaso" + }, + "見出した": { + "w_type": "conjugated godan verb", + "romaji": "miidashita" + }, + "見出して": { + "w_type": "conjugated godan verb", + "romaji": "miidashite" + }, + "押隠さ": { + "w_type": "godan verb stem", + "romaji": "oshikakusa" + }, + "押隠し": { + "w_type": "godan verb stem", + "romaji": "oshikakushi" + }, + "押隠せ": { + "w_type": "conjugated godan verb", + "romaji": "oshikakuse" + }, + "押隠そ": { + "w_type": "godan verb stem", + "romaji": "oshikakuso" + }, + "押隠した": { + "w_type": "conjugated godan verb", + "romaji": "oshikakushita" + }, + "押隠して": { + "w_type": "conjugated godan verb", + "romaji": "oshikakushite" + }, + "活かさ": { + "w_type": "godan verb stem", + "romaji": "ikasa" + }, + "活かし": { + "w_type": "godan verb stem", + "romaji": "ikashi" + }, + "活かせ": { + "w_type": "conjugated godan verb", + "romaji": "ikase" + }, + "活かそ": { + "w_type": "godan verb stem", + "romaji": "ikaso" + }, + "活かした": { + "w_type": "conjugated godan verb", + "romaji": "ikashita" + }, + "活かして": { + "w_type": "conjugated godan verb", + "romaji": "ikashite" + }, + "差しださ": { + "w_type": "godan verb stem", + "romaji": "sashidasa" + }, + "差しだし": { + "w_type": "godan verb stem", + "romaji": "sashidashi" + }, + "差しだせ": { + "w_type": "conjugated godan verb", + "romaji": "sashidase" + }, + "差しだそ": { + "w_type": "godan verb stem", + "romaji": "sashidaso" + }, + "差しだした": { + "w_type": "conjugated godan verb", + "romaji": "sashidashita" + }, + "差しだして": { + "w_type": "conjugated godan verb", + "romaji": "sashidashite" + }, + "伸び広がら": { + "w_type": "godan verb stem", + "romaji": "nobihirogara" + }, + "伸び広がり": { + "w_type": "godan verb stem", + "romaji": "nobihirogari" + }, + "伸び広がれ": { + "w_type": "conjugated godan verb", + "romaji": "nobihirogare" + }, + "伸び広がろ": { + "w_type": "godan verb stem", + "romaji": "nobihirogaro" + }, + "伸び広がった": { + "w_type": "conjugated godan verb", + "romaji": "nobihirogatta" + }, + "伸び広がって": { + "w_type": "conjugated godan verb", + "romaji": "nobihirogatte" + }, + "見失わ": { + "w_type": "godan verb stem", + "romaji": "miushinawa" + }, + "見失い": { + "w_type": "godan verb stem", + "romaji": "miushinai" + }, + "見失え": { + "w_type": "conjugated godan verb", + "romaji": "miushinae" + }, + "見失お": { + "w_type": "godan verb stem", + "romaji": "miushinao" + }, + "見失った": { + "w_type": "conjugated godan verb", + "romaji": "miushinatta" + }, + "見失って": { + "w_type": "conjugated godan verb", + "romaji": "miushinatte" + }, + "差し戻さ": { + "w_type": "godan verb stem", + "romaji": "sashimodosa" + }, + "差し戻し": { + "w_type": "godan verb stem", + "romaji": "sashimodoshi" + }, + "差し戻せ": { + "w_type": "conjugated godan verb", + "romaji": "sashimodose" + }, + "差し戻そ": { + "w_type": "godan verb stem", + "romaji": "sashimodoso" + }, + "差し戻した": { + "w_type": "conjugated godan verb", + "romaji": "sashimodoshita" + }, + "差し戻して": { + "w_type": "conjugated godan verb", + "romaji": "sashimodoshite" + }, + "嵩張ら": { + "w_type": "godan verb stem", + "romaji": "kasabara" + }, + "嵩張り": { + "w_type": "godan verb stem", + "romaji": "kasabari" + }, + "嵩張れ": { + "w_type": "conjugated godan verb", + "romaji": "kasabare" + }, + "嵩張ろ": { + "w_type": "godan verb stem", + "romaji": "kasabaro" + }, + "嵩張った": { + "w_type": "conjugated godan verb", + "romaji": "kasabatta" + }, + "嵩張って": { + "w_type": "conjugated godan verb", + "romaji": "kasabatte" + }, + "繋が": { + "w_type": "godan verb stem", + "romaji": "tsunaga" + }, + "繋ぎ": { + "w_type": "godan verb stem", + "romaji": "tsunagi" + }, + "繋げ": { + "w_type": "conjugated godan verb", + "romaji": "tsunage" + }, + "繋ご": { + "w_type": "godan verb stem", + "romaji": "tsunago" + }, + "繋いだ": { + "w_type": "conjugated godan verb", + "romaji": "tsunaida" + }, + "繋いで": { + "w_type": "conjugated godan verb", + "romaji": "tsunaide" + }, + "知り尽くさ": { + "w_type": "godan verb stem", + "romaji": "shiritsukusa" + }, + "知り尽くし": { + "w_type": "godan verb stem", + "romaji": "shiritsukushi" + }, + "知り尽くせ": { + "w_type": "conjugated godan verb", + "romaji": "shiritsukuse" + }, + "知り尽くそ": { + "w_type": "godan verb stem", + "romaji": "shiritsukuso" + }, + "知り尽くした": { + "w_type": "conjugated godan verb", + "romaji": "shiritsukushita" + }, + "知り尽くして": { + "w_type": "conjugated godan verb", + "romaji": "shiritsukushite" + }, + "浮き足立た": { + "w_type": "godan verb stem", + "romaji": "ukiashidata" + }, + "浮き足立ち": { + "w_type": "godan verb stem", + "romaji": "ukiashidachi" + }, + "浮き足立て": { + "w_type": "conjugated godan verb", + "romaji": "ukiashidate" + }, + "浮き足立と": { + "w_type": "godan verb stem", + "romaji": "ukiashidato" + }, + "浮き足立った": { + "w_type": "conjugated godan verb", + "romaji": "ukiashidatta" + }, + "浮き足立って": { + "w_type": "conjugated godan verb", + "romaji": "ukiashidatte" + }, + "息吹か": { + "w_type": "godan verb stem", + "romaji": "ibuka" + }, + "息吹き": { + "w_type": "godan verb stem", + "romaji": "ibuki" + }, + "息吹け": { + "w_type": "conjugated godan verb", + "romaji": "ibuke" + }, + "息吹こ": { + "w_type": "godan verb stem", + "romaji": "ibuko" + }, + "息吹いた": { + "w_type": "conjugated godan verb", + "romaji": "ibuita" + }, + "息吹いて": { + "w_type": "conjugated godan verb", + "romaji": "ibuite" + }, + "吹飛ば": { + "w_type": "godan verb stem", + "romaji": "fukitoba" + }, + "吹飛び": { + "w_type": "godan verb stem", + "romaji": "fukitobi" + }, + "吹飛べ": { + "w_type": "conjugated godan verb", + "romaji": "fukitobe" + }, + "吹飛ぼ": { + "w_type": "godan verb stem", + "romaji": "fukitobo" + }, + "吹飛んだ": { + "w_type": "conjugated godan verb", + "romaji": "fukitonda" + }, + "吹飛んで": { + "w_type": "conjugated godan verb", + "romaji": "fukitonde" + }, + "食み出さ": { + "w_type": "godan verb stem", + "romaji": "hamidasa" + }, + "食み出し": { + "w_type": "godan verb stem", + "romaji": "hamidashi" + }, + "食み出せ": { + "w_type": "conjugated godan verb", + "romaji": "hamidase" + }, + "食み出そ": { + "w_type": "godan verb stem", + "romaji": "hamidaso" + }, + "食み出した": { + "w_type": "conjugated godan verb", + "romaji": "hamidashita" + }, + "食み出して": { + "w_type": "conjugated godan verb", + "romaji": "hamidashite" + }, + "燃え付か": { + "w_type": "godan verb stem", + "romaji": "moetsuka" + }, + "燃え付き": { + "w_type": "godan verb stem", + "romaji": "moetsuki" + }, + "燃え付け": { + "w_type": "conjugated godan verb", + "romaji": "moetsuke" + }, + "燃え付こ": { + "w_type": "godan verb stem", + "romaji": "moetsuko" + }, + "燃え付いた": { + "w_type": "conjugated godan verb", + "romaji": "moetsuita" + }, + "燃え付いて": { + "w_type": "conjugated godan verb", + "romaji": "moetsuite" + }, + "訊か": { + "w_type": "godan verb stem", + "romaji": "kika" + }, + "訊き": { + "w_type": "godan verb stem", + "romaji": "kiki" + }, + "訊け": { + "w_type": "conjugated godan verb", + "romaji": "kike" + }, + "訊こ": { + "w_type": "godan verb stem", + "romaji": "kiko" + }, + "訊いた": { + "w_type": "conjugated godan verb", + "romaji": "kiita" + }, + "訊いて": { + "w_type": "conjugated godan verb", + "romaji": "kiite" + }, + "叩き込ま": { + "w_type": "godan verb stem", + "romaji": "tatakikoma" + }, + "叩き込み": { + "w_type": "godan verb stem", + "romaji": "tatakikomi" + }, + "叩き込め": { + "w_type": "conjugated godan verb", + "romaji": "tatakikome" + }, + "叩き込も": { + "w_type": "godan verb stem", + "romaji": "tatakikomo" + }, + "叩き込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tatakikonda" + }, + "叩き込んで": { + "w_type": "conjugated godan verb", + "romaji": "tatakikonde" + }, + "張付か": { + "w_type": "godan verb stem", + "romaji": "haritsuka" + }, + "張付き": { + "w_type": "godan verb stem", + "romaji": "haritsuki" + }, + "張付け": { + "w_type": "conjugated godan verb", + "romaji": "haritsuke" + }, + "張付こ": { + "w_type": "godan verb stem", + "romaji": "haritsuko" + }, + "張付いた": { + "w_type": "conjugated godan verb", + "romaji": "haritsuita" + }, + "張付いて": { + "w_type": "conjugated godan verb", + "romaji": "haritsuite" + }, + "賺さ": { + "w_type": "godan verb stem", + "romaji": "sukasa" + }, + "賺し": { + "w_type": "godan verb stem", + "romaji": "sukashi" + }, + "賺せ": { + "w_type": "conjugated godan verb", + "romaji": "sukase" + }, + "賺そ": { + "w_type": "godan verb stem", + "romaji": "sukaso" + }, + "賺した": { + "w_type": "conjugated godan verb", + "romaji": "sukashita" + }, + "賺して": { + "w_type": "conjugated godan verb", + "romaji": "sukashite" + }, + "打っ遣らかさ": { + "w_type": "godan verb stem", + "romaji": "utcharakasa" + }, + "打っ遣らかし": { + "w_type": "godan verb stem", + "romaji": "utcharakashi" + }, + "打っ遣らかせ": { + "w_type": "conjugated godan verb", + "romaji": "utcharakase" + }, + "打っ遣らかそ": { + "w_type": "godan verb stem", + "romaji": "utcharakaso" + }, + "打っ遣らかした": { + "w_type": "conjugated godan verb", + "romaji": "utcharakashita" + }, + "打っ遣らかして": { + "w_type": "conjugated godan verb", + "romaji": "utcharakashite" + }, + "縊ら": { + "w_type": "godan verb stem", + "romaji": "kubira" + }, + "縊り": { + "w_type": "godan verb stem", + "romaji": "kubiri" + }, + "縊れ": { + "w_type": "conjugated godan verb", + "romaji": "kubire" + }, + "縊ろ": { + "w_type": "godan verb stem", + "romaji": "kubiro" + }, + "縊った": { + "w_type": "conjugated godan verb", + "romaji": "kubitta" + }, + "縊って": { + "w_type": "conjugated godan verb", + "romaji": "kubitte" + }, + "鎖さ": { + "w_type": "godan verb stem", + "romaji": "tozasa" + }, + "鎖し": { + "w_type": "godan verb stem", + "romaji": "tozashi" + }, + "鎖せ": { + "w_type": "conjugated godan verb", + "romaji": "tozase" + }, + "鎖そ": { + "w_type": "godan verb stem", + "romaji": "tozaso" + }, + "鎖した": { + "w_type": "conjugated godan verb", + "romaji": "tozashita" + }, + "鎖して": { + "w_type": "conjugated godan verb", + "romaji": "tozashite" + }, + "召し上がら": { + "w_type": "godan verb stem", + "romaji": "meshiagara" + }, + "召し上がり": { + "w_type": "godan verb stem", + "romaji": "meshiagari" + }, + "召し上がれ": { + "w_type": "conjugated godan verb", + "romaji": "meshiagare" + }, + "召し上がろ": { + "w_type": "godan verb stem", + "romaji": "meshiagaro" + }, + "召し上がった": { + "w_type": "conjugated godan verb", + "romaji": "meshiagatta" + }, + "召し上がって": { + "w_type": "conjugated godan verb", + "romaji": "meshiagatte" + }, + "冷かさ": { + "w_type": "godan verb stem", + "romaji": "hiyakasa" + }, + "冷かし": { + "w_type": "godan verb stem", + "romaji": "hiyakashi" + }, + "冷かせ": { + "w_type": "conjugated godan verb", + "romaji": "hiyakase" + }, + "冷かそ": { + "w_type": "godan verb stem", + "romaji": "hiyakaso" + }, + "冷かした": { + "w_type": "conjugated godan verb", + "romaji": "hiyakashita" + }, + "冷かして": { + "w_type": "conjugated godan verb", + "romaji": "hiyakashite" + }, + "振飛ばさ": { + "w_type": "godan verb stem", + "romaji": "furitobasa" + }, + "振飛ばし": { + "w_type": "godan verb stem", + "romaji": "furitobashi" + }, + "振飛ばせ": { + "w_type": "conjugated godan verb", + "romaji": "furitobase" + }, + "振飛ばそ": { + "w_type": "godan verb stem", + "romaji": "furitobaso" + }, + "振飛ばした": { + "w_type": "conjugated godan verb", + "romaji": "furitobashita" + }, + "振飛ばして": { + "w_type": "conjugated godan verb", + "romaji": "furitobashite" + }, + "すっ飛ば": { + "w_type": "godan verb stem", + "romaji": "suttoba" + }, + "すっ飛び": { + "w_type": "godan verb stem", + "romaji": "suttobi" + }, + "すっ飛べ": { + "w_type": "conjugated godan verb", + "romaji": "suttobe" + }, + "すっ飛ぼ": { + "w_type": "godan verb stem", + "romaji": "suttobo" + }, + "すっ飛んだ": { + "w_type": "conjugated godan verb", + "romaji": "suttonda" + }, + "すっ飛んで": { + "w_type": "conjugated godan verb", + "romaji": "suttonde" + }, + "蹴り込ま": { + "w_type": "godan verb stem", + "romaji": "kerikoma" + }, + "蹴り込み": { + "w_type": "godan verb stem", + "romaji": "kerikomi" + }, + "蹴り込め": { + "w_type": "conjugated godan verb", + "romaji": "kerikome" + }, + "蹴り込も": { + "w_type": "godan verb stem", + "romaji": "kerikomo" + }, + "蹴り込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kerikonda" + }, + "蹴り込んで": { + "w_type": "conjugated godan verb", + "romaji": "kerikonde" + }, + "使い回さ": { + "w_type": "godan verb stem", + "romaji": "tsukaimawasa" + }, + "使い回し": { + "w_type": "godan verb stem", + "romaji": "tsukaimawashi" + }, + "使い回せ": { + "w_type": "conjugated godan verb", + "romaji": "tsukaimawase" + }, + "使い回そ": { + "w_type": "godan verb stem", + "romaji": "tsukaimawaso" + }, + "使い回した": { + "w_type": "conjugated godan verb", + "romaji": "tsukaimawashita" + }, + "使い回して": { + "w_type": "conjugated godan verb", + "romaji": "tsukaimawashite" + }, + "言渋ら": { + "w_type": "godan verb stem", + "romaji": "iishibura" + }, + "言渋り": { + "w_type": "godan verb stem", + "romaji": "iishiburi" + }, + "言渋れ": { + "w_type": "conjugated godan verb", + "romaji": "iishibure" + }, + "言渋ろ": { + "w_type": "godan verb stem", + "romaji": "iishiburo" + }, + "言渋った": { + "w_type": "conjugated godan verb", + "romaji": "iishibutta" + }, + "言渋って": { + "w_type": "conjugated godan verb", + "romaji": "iishibutte" + }, + "登り切ら": { + "w_type": "godan verb stem", + "romaji": "noborikira" + }, + "登り切り": { + "w_type": "godan verb stem", + "romaji": "noborikiri" + }, + "登り切れ": { + "w_type": "conjugated godan verb", + "romaji": "noborikire" + }, + "登り切ろ": { + "w_type": "godan verb stem", + "romaji": "noborikiro" + }, + "登り切った": { + "w_type": "conjugated godan verb", + "romaji": "noborikitta" + }, + "登り切って": { + "w_type": "conjugated godan verb", + "romaji": "noborikitte" + }, + "洗い去ら": { + "w_type": "godan verb stem", + "romaji": "araisara" + }, + "洗い去り": { + "w_type": "godan verb stem", + "romaji": "araisari" + }, + "洗い去れ": { + "w_type": "conjugated godan verb", + "romaji": "araisare" + }, + "洗い去ろ": { + "w_type": "godan verb stem", + "romaji": "araisaro" + }, + "洗い去った": { + "w_type": "conjugated godan verb", + "romaji": "araisatta" + }, + "洗い去って": { + "w_type": "conjugated godan verb", + "romaji": "araisatte" + }, + "下さ": { + "w_type": "godan verb stem", + "romaji": "kudasa" + }, + "下し": { + "w_type": "godan verb stem", + "romaji": "kudashi" + }, + "下せ": { + "w_type": "conjugated godan verb", + "romaji": "kudase" + }, + "下そ": { + "w_type": "godan verb stem", + "romaji": "kudaso" + }, + "下した": { + "w_type": "conjugated godan verb", + "romaji": "kudashita" + }, + "下して": { + "w_type": "conjugated godan verb", + "romaji": "kudashite" + }, + "噛ま": { + "w_type": "godan verb stem", + "romaji": "kama" + }, + "噛み": { + "w_type": "godan verb stem", + "romaji": "kami" + }, + "噛め": { + "w_type": "conjugated godan verb", + "romaji": "kame" + }, + "噛も": { + "w_type": "godan verb stem", + "romaji": "kamo" + }, + "噛んだ": { + "w_type": "conjugated godan verb", + "romaji": "kanda" + }, + "噛んで": { + "w_type": "conjugated godan verb", + "romaji": "kande" + }, + "深まら": { + "w_type": "godan verb stem", + "romaji": "fukamara" + }, + "深まり": { + "w_type": "godan verb stem", + "romaji": "fukamari" + }, + "深まれ": { + "w_type": "conjugated godan verb", + "romaji": "fukamare" + }, + "深まろ": { + "w_type": "godan verb stem", + "romaji": "fukamaro" + }, + "深まった": { + "w_type": "conjugated godan verb", + "romaji": "fukamatta" + }, + "深まって": { + "w_type": "conjugated godan verb", + "romaji": "fukamatte" + }, + "選び取ら": { + "w_type": "godan verb stem", + "romaji": "erabitora" + }, + "選び取り": { + "w_type": "godan verb stem", + "romaji": "erabitori" + }, + "選び取れ": { + "w_type": "conjugated godan verb", + "romaji": "erabitore" + }, + "選び取ろ": { + "w_type": "godan verb stem", + "romaji": "erabitoro" + }, + "選び取った": { + "w_type": "conjugated godan verb", + "romaji": "erabitotta" + }, + "選び取って": { + "w_type": "conjugated godan verb", + "romaji": "erabitotte" + }, + "沁み込ま": { + "w_type": "godan verb stem", + "romaji": "shimikoma" + }, + "沁み込み": { + "w_type": "godan verb stem", + "romaji": "shimikomi" + }, + "沁み込め": { + "w_type": "conjugated godan verb", + "romaji": "shimikome" + }, + "沁み込も": { + "w_type": "godan verb stem", + "romaji": "shimikomo" + }, + "沁み込んだ": { + "w_type": "conjugated godan verb", + "romaji": "shimikonda" + }, + "沁み込んで": { + "w_type": "conjugated godan verb", + "romaji": "shimikonde" + }, + "脹らま": { + "w_type": "godan verb stem", + "romaji": "fukurama" + }, + "脹らみ": { + "w_type": "godan verb stem", + "romaji": "fukurami" + }, + "脹らめ": { + "w_type": "conjugated godan verb", + "romaji": "fukurame" + }, + "脹らも": { + "w_type": "godan verb stem", + "romaji": "fukuramo" + }, + "脹らんだ": { + "w_type": "conjugated godan verb", + "romaji": "fukuranda" + }, + "脹らんで": { + "w_type": "conjugated godan verb", + "romaji": "fukurande" + }, + "刻み込ま": { + "w_type": "godan verb stem", + "romaji": "kizamikoma" + }, + "刻み込み": { + "w_type": "godan verb stem", + "romaji": "kizamikomi" + }, + "刻み込め": { + "w_type": "conjugated godan verb", + "romaji": "kizamikome" + }, + "刻み込も": { + "w_type": "godan verb stem", + "romaji": "kizamikomo" + }, + "刻み込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kizamikonda" + }, + "刻み込んで": { + "w_type": "conjugated godan verb", + "romaji": "kizamikonde" + }, + "言いこなさ": { + "w_type": "godan verb stem", + "romaji": "iikonasa" + }, + "言いこなし": { + "w_type": "godan verb stem", + "romaji": "iikonashi" + }, + "言いこなせ": { + "w_type": "conjugated godan verb", + "romaji": "iikonase" + }, + "言いこなそ": { + "w_type": "godan verb stem", + "romaji": "iikonaso" + }, + "言いこなした": { + "w_type": "conjugated godan verb", + "romaji": "iikonashita" + }, + "言いこなして": { + "w_type": "conjugated godan verb", + "romaji": "iikonashite" + }, + "かき出さ": { + "w_type": "godan verb stem", + "romaji": "kakidasa" + }, + "かき出し": { + "w_type": "godan verb stem", + "romaji": "kakidashi" + }, + "かき出せ": { + "w_type": "conjugated godan verb", + "romaji": "kakidase" + }, + "かき出そ": { + "w_type": "godan verb stem", + "romaji": "kakidaso" + }, + "かき出した": { + "w_type": "conjugated godan verb", + "romaji": "kakidashita" + }, + "かき出して": { + "w_type": "conjugated godan verb", + "romaji": "kakidashite" + }, + "書き尽さ": { + "w_type": "godan verb stem", + "romaji": "kakitsukusa" + }, + "書き尽し": { + "w_type": "godan verb stem", + "romaji": "kakitsukushi" + }, + "書き尽せ": { + "w_type": "conjugated godan verb", + "romaji": "kakitsukuse" + }, + "書き尽そ": { + "w_type": "godan verb stem", + "romaji": "kakitsukuso" + }, + "書き尽した": { + "w_type": "conjugated godan verb", + "romaji": "kakitsukushita" + }, + "書き尽して": { + "w_type": "conjugated godan verb", + "romaji": "kakitsukushite" + }, + "見放さ": { + "w_type": "godan verb stem", + "romaji": "mihanasa" + }, + "見放し": { + "w_type": "godan verb stem", + "romaji": "mihanashi" + }, + "見放せ": { + "w_type": "conjugated godan verb", + "romaji": "mihanase" + }, + "見放そ": { + "w_type": "godan verb stem", + "romaji": "mihanaso" + }, + "見放した": { + "w_type": "conjugated godan verb", + "romaji": "mihanashita" + }, + "見放して": { + "w_type": "conjugated godan verb", + "romaji": "mihanashite" + }, + "充た": { + "w_type": "godan verb stem", + "romaji": "mita" + }, + "充ち": { + "w_type": "godan verb stem", + "romaji": "michi" + }, + "充て": { + "w_type": "conjugated godan verb", + "romaji": "mite" + }, + "充と": { + "w_type": "godan verb stem", + "romaji": "mito" + }, + "充った": { + "w_type": "conjugated godan verb", + "romaji": "mitta" + }, + "充って": { + "w_type": "conjugated godan verb", + "romaji": "mitte" + }, + "涌き出さ": { + "w_type": "godan verb stem", + "romaji": "wakidasa" + }, + "涌き出し": { + "w_type": "godan verb stem", + "romaji": "wakidashi" + }, + "涌き出せ": { + "w_type": "conjugated godan verb", + "romaji": "wakidase" + }, + "涌き出そ": { + "w_type": "godan verb stem", + "romaji": "wakidaso" + }, + "涌き出した": { + "w_type": "conjugated godan verb", + "romaji": "wakidashita" + }, + "涌き出して": { + "w_type": "conjugated godan verb", + "romaji": "wakidashite" + }, + "たらし込ま": { + "w_type": "godan verb stem", + "romaji": "tarashikoma" + }, + "たらし込み": { + "w_type": "godan verb stem", + "romaji": "tarashikomi" + }, + "たらし込め": { + "w_type": "conjugated godan verb", + "romaji": "tarashikome" + }, + "たらし込も": { + "w_type": "godan verb stem", + "romaji": "tarashikomo" + }, + "たらし込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tarashikonda" + }, + "たらし込んで": { + "w_type": "conjugated godan verb", + "romaji": "tarashikonde" + }, + "打ちまもら": { + "w_type": "godan verb stem", + "romaji": "uchimamora" + }, + "打ちまもり": { + "w_type": "godan verb stem", + "romaji": "uchimamori" + }, + "打ちまもれ": { + "w_type": "conjugated godan verb", + "romaji": "uchimamore" + }, + "打ちまもろ": { + "w_type": "godan verb stem", + "romaji": "uchimamoro" + }, + "打ちまもった": { + "w_type": "conjugated godan verb", + "romaji": "uchimamotta" + }, + "打ちまもって": { + "w_type": "conjugated godan verb", + "romaji": "uchimamotte" + }, + "鋤き起こさ": { + "w_type": "godan verb stem", + "romaji": "sukiokosa" + }, + "鋤き起こし": { + "w_type": "godan verb stem", + "romaji": "sukiokoshi" + }, + "鋤き起こせ": { + "w_type": "conjugated godan verb", + "romaji": "sukiokose" + }, + "鋤き起こそ": { + "w_type": "godan verb stem", + "romaji": "sukiokoso" + }, + "鋤き起こした": { + "w_type": "conjugated godan verb", + "romaji": "sukiokoshita" + }, + "鋤き起こして": { + "w_type": "conjugated godan verb", + "romaji": "sukiokoshite" + }, + "嘆か": { + "w_type": "godan verb stem", + "romaji": "nageka" + }, + "嘆き": { + "w_type": "godan verb stem", + "romaji": "nageki" + }, + "嘆け": { + "w_type": "conjugated godan verb", + "romaji": "nageke" + }, + "嘆こ": { + "w_type": "godan verb stem", + "romaji": "nageko" + }, + "嘆いた": { + "w_type": "conjugated godan verb", + "romaji": "nageita" + }, + "嘆いて": { + "w_type": "conjugated godan verb", + "romaji": "nageite" + }, + "突刺さら": { + "w_type": "godan verb stem", + "romaji": "tsukisasara" + }, + "突刺さり": { + "w_type": "godan verb stem", + "romaji": "tsukisasari" + }, + "突刺され": { + "w_type": "conjugated godan verb", + "romaji": "tsukisasare" + }, + "突刺さろ": { + "w_type": "godan verb stem", + "romaji": "tsukisasaro" + }, + "突刺さった": { + "w_type": "conjugated godan verb", + "romaji": "tsukisasatta" + }, + "突刺さって": { + "w_type": "conjugated godan verb", + "romaji": "tsukisasatte" + }, + "撥ね飛ばさ": { + "w_type": "godan verb stem", + "romaji": "hanetobasa" + }, + "撥ね飛ばし": { + "w_type": "godan verb stem", + "romaji": "hanetobashi" + }, + "撥ね飛ばせ": { + "w_type": "conjugated godan verb", + "romaji": "hanetobase" + }, + "撥ね飛ばそ": { + "w_type": "godan verb stem", + "romaji": "hanetobaso" + }, + "撥ね飛ばした": { + "w_type": "conjugated godan verb", + "romaji": "hanetobashita" + }, + "撥ね飛ばして": { + "w_type": "conjugated godan verb", + "romaji": "hanetobashite" + }, + "識ら": { + "w_type": "godan verb stem", + "romaji": "shira" + }, + "識り": { + "w_type": "godan verb stem", + "romaji": "shiri" + }, + "識れ": { + "w_type": "conjugated godan verb", + "romaji": "shire" + }, + "識ろ": { + "w_type": "godan verb stem", + "romaji": "shiro" + }, + "識った": { + "w_type": "conjugated godan verb", + "romaji": "shitta" + }, + "識って": { + "w_type": "conjugated godan verb", + "romaji": "shitte" + }, + "つき合わ": { + "w_type": "godan verb stem", + "romaji": "tsukiawa" + }, + "つき合い": { + "w_type": "godan verb stem", + "romaji": "tsukiai" + }, + "つき合え": { + "w_type": "conjugated godan verb", + "romaji": "tsukiae" + }, + "つき合お": { + "w_type": "godan verb stem", + "romaji": "tsukiao" + }, + "つき合った": { + "w_type": "conjugated godan verb", + "romaji": "tsukiatta" + }, + "つき合って": { + "w_type": "conjugated godan verb", + "romaji": "tsukiatte" + }, + "含ま": { + "w_type": "godan verb stem", + "romaji": "fukuma" + }, + "含み": { + "w_type": "godan verb stem", + "romaji": "fukumi" + }, + "含め": { + "w_type": "conjugated godan verb", + "romaji": "fukume" + }, + "含も": { + "w_type": "godan verb stem", + "romaji": "fukumo" + }, + "含んだ": { + "w_type": "conjugated godan verb", + "romaji": "fukunda" + }, + "含んで": { + "w_type": "conjugated godan verb", + "romaji": "fukunde" + }, + "眠り込ま": { + "w_type": "godan verb stem", + "romaji": "nemurikoma" + }, + "眠り込み": { + "w_type": "godan verb stem", + "romaji": "nemurikomi" + }, + "眠り込め": { + "w_type": "conjugated godan verb", + "romaji": "nemurikome" + }, + "眠り込も": { + "w_type": "godan verb stem", + "romaji": "nemurikomo" + }, + "眠り込んだ": { + "w_type": "conjugated godan verb", + "romaji": "nemurikonda" + }, + "眠り込んで": { + "w_type": "conjugated godan verb", + "romaji": "nemurikonde" + }, + "直走ら": { + "w_type": "godan verb stem", + "romaji": "hitahashira" + }, + "直走り": { + "w_type": "godan verb stem", + "romaji": "hitahashiri" + }, + "直走れ": { + "w_type": "conjugated godan verb", + "romaji": "hitahashire" + }, + "直走ろ": { + "w_type": "godan verb stem", + "romaji": "hitahashiro" + }, + "直走った": { + "w_type": "conjugated godan verb", + "romaji": "hitahashitta" + }, + "直走って": { + "w_type": "conjugated godan verb", + "romaji": "hitahashitte" + }, + "火が点か": { + "w_type": "godan verb stem", + "romaji": "higatsuka" + }, + "火が点き": { + "w_type": "godan verb stem", + "romaji": "higatsuki" + }, + "火が点け": { + "w_type": "conjugated godan verb", + "romaji": "higatsuke" + }, + "火が点こ": { + "w_type": "godan verb stem", + "romaji": "higatsuko" + }, + "火が点いた": { + "w_type": "conjugated godan verb", + "romaji": "higatsuita" + }, + "火が点いて": { + "w_type": "conjugated godan verb", + "romaji": "higatsuite" + }, + "飲み止さ": { + "w_type": "godan verb stem", + "romaji": "nomisasa" + }, + "飲み止し": { + "w_type": "godan verb stem", + "romaji": "nomisashi" + }, + "飲み止せ": { + "w_type": "conjugated godan verb", + "romaji": "nomisase" + }, + "飲み止そ": { + "w_type": "godan verb stem", + "romaji": "nomisaso" + }, + "飲み止した": { + "w_type": "conjugated godan verb", + "romaji": "nomisashita" + }, + "飲み止して": { + "w_type": "conjugated godan verb", + "romaji": "nomisashite" + }, + "誑し込ま": { + "w_type": "godan verb stem", + "romaji": "tarashikoma" + }, + "誑し込み": { + "w_type": "godan verb stem", + "romaji": "tarashikomi" + }, + "誑し込め": { + "w_type": "conjugated godan verb", + "romaji": "tarashikome" + }, + "誑し込も": { + "w_type": "godan verb stem", + "romaji": "tarashikomo" + }, + "誑し込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tarashikonda" + }, + "誑し込んで": { + "w_type": "conjugated godan verb", + "romaji": "tarashikonde" + }, + "善がら": { + "w_type": "godan verb stem", + "romaji": "yogara" + }, + "善がり": { + "w_type": "godan verb stem", + "romaji": "yogari" + }, + "善がれ": { + "w_type": "conjugated godan verb", + "romaji": "yogare" + }, + "善がろ": { + "w_type": "godan verb stem", + "romaji": "yogaro" + }, + "善がった": { + "w_type": "conjugated godan verb", + "romaji": "yogatta" + }, + "善がって": { + "w_type": "conjugated godan verb", + "romaji": "yogatte" + }, + "拐かさ": { + "w_type": "godan verb stem", + "romaji": "kadowakasa" + }, + "拐かし": { + "w_type": "godan verb stem", + "romaji": "kadowakashi" + }, + "拐かせ": { + "w_type": "conjugated godan verb", + "romaji": "kadowakase" + }, + "拐かそ": { + "w_type": "godan verb stem", + "romaji": "kadowakaso" + }, + "拐かした": { + "w_type": "conjugated godan verb", + "romaji": "kadowakashita" + }, + "拐かして": { + "w_type": "conjugated godan verb", + "romaji": "kadowakashite" + }, + "焼け残ら": { + "w_type": "godan verb stem", + "romaji": "yakenokora" + }, + "焼け残り": { + "w_type": "godan verb stem", + "romaji": "yakenokori" + }, + "焼け残れ": { + "w_type": "conjugated godan verb", + "romaji": "yakenokore" + }, + "焼け残ろ": { + "w_type": "godan verb stem", + "romaji": "yakenokoro" + }, + "焼け残った": { + "w_type": "conjugated godan verb", + "romaji": "yakenokotta" + }, + "焼け残って": { + "w_type": "conjugated godan verb", + "romaji": "yakenokotte" + }, + "騒が": { + "w_type": "godan verb stem", + "romaji": "sawaga" + }, + "騒ぎ": { + "w_type": "godan verb stem", + "romaji": "sawagi" + }, + "騒げ": { + "w_type": "conjugated godan verb", + "romaji": "sawage" + }, + "騒ご": { + "w_type": "godan verb stem", + "romaji": "sawago" + }, + "騒いだ": { + "w_type": "conjugated godan verb", + "romaji": "sawaida" + }, + "騒いで": { + "w_type": "conjugated godan verb", + "romaji": "sawaide" + }, + "喚ば": { + "w_type": "godan verb stem", + "romaji": "yoba" + }, + "喚び": { + "w_type": "godan verb stem", + "romaji": "yobi" + }, + "喚べ": { + "w_type": "conjugated godan verb", + "romaji": "yobe" + }, + "喚ぼ": { + "w_type": "godan verb stem", + "romaji": "yobo" + }, + "喚んだ": { + "w_type": "conjugated godan verb", + "romaji": "yonda" + }, + "喚んで": { + "w_type": "conjugated godan verb", + "romaji": "yonde" + }, + "匂わ": { + "w_type": "godan verb stem", + "romaji": "niowa" + }, + "匂い": { + "w_type": "godan verb stem", + "romaji": "nioi" + }, + "匂え": { + "w_type": "conjugated godan verb", + "romaji": "nioe" + }, + "匂お": { + "w_type": "godan verb stem", + "romaji": "nioo" + }, + "匂った": { + "w_type": "conjugated godan verb", + "romaji": "niotta" + }, + "匂って": { + "w_type": "conjugated godan verb", + "romaji": "niotte" + }, + "嵌まら": { + "w_type": "godan verb stem", + "romaji": "hamara" + }, + "嵌まり": { + "w_type": "godan verb stem", + "romaji": "hamari" + }, + "嵌まれ": { + "w_type": "conjugated godan verb", + "romaji": "hamare" + }, + "嵌まろ": { + "w_type": "godan verb stem", + "romaji": "hamaro" + }, + "嵌まった": { + "w_type": "conjugated godan verb", + "romaji": "hamatta" + }, + "嵌まって": { + "w_type": "conjugated godan verb", + "romaji": "hamatte" + }, + "焙り出さ": { + "w_type": "godan verb stem", + "romaji": "aburidasa" + }, + "焙り出し": { + "w_type": "godan verb stem", + "romaji": "aburidashi" + }, + "焙り出せ": { + "w_type": "conjugated godan verb", + "romaji": "aburidase" + }, + "焙り出そ": { + "w_type": "godan verb stem", + "romaji": "aburidaso" + }, + "焙り出した": { + "w_type": "conjugated godan verb", + "romaji": "aburidashita" + }, + "焙り出して": { + "w_type": "conjugated godan verb", + "romaji": "aburidashite" + }, + "しくしく泣か": { + "w_type": "godan verb stem", + "romaji": "shikushikunaka" + }, + "しくしく泣き": { + "w_type": "godan verb stem", + "romaji": "shikushikunaki" + }, + "しくしく泣け": { + "w_type": "conjugated godan verb", + "romaji": "shikushikunake" + }, + "しくしく泣こ": { + "w_type": "godan verb stem", + "romaji": "shikushikunako" + }, + "しくしく泣いた": { + "w_type": "conjugated godan verb", + "romaji": "shikushikunaita" + }, + "しくしく泣いて": { + "w_type": "conjugated godan verb", + "romaji": "shikushikunaite" + }, + "雇わ": { + "w_type": "godan verb stem", + "romaji": "yatowa" + }, + "雇い": { + "w_type": "godan verb stem", + "romaji": "yatoi" + }, + "雇え": { + "w_type": "conjugated godan verb", + "romaji": "yatoe" + }, + "雇お": { + "w_type": "godan verb stem", + "romaji": "yatoo" + }, + "雇った": { + "w_type": "conjugated godan verb", + "romaji": "yatotta" + }, + "雇って": { + "w_type": "conjugated godan verb", + "romaji": "yatotte" + }, + "怒鳴り出さ": { + "w_type": "godan verb stem", + "romaji": "donaridasa" + }, + "怒鳴り出し": { + "w_type": "godan verb stem", + "romaji": "donaridashi" + }, + "怒鳴り出せ": { + "w_type": "conjugated godan verb", + "romaji": "donaridase" + }, + "怒鳴り出そ": { + "w_type": "godan verb stem", + "romaji": "donaridaso" + }, + "怒鳴り出した": { + "w_type": "conjugated godan verb", + "romaji": "donaridashita" + }, + "怒鳴り出して": { + "w_type": "conjugated godan verb", + "romaji": "donaridashite" + }, + "転ばさ": { + "w_type": "godan verb stem", + "romaji": "korobasa" + }, + "転ばし": { + "w_type": "godan verb stem", + "romaji": "korobashi" + }, + "転ばせ": { + "w_type": "conjugated godan verb", + "romaji": "korobase" + }, + "転ばそ": { + "w_type": "godan verb stem", + "romaji": "korobaso" + }, + "転ばした": { + "w_type": "conjugated godan verb", + "romaji": "korobashita" + }, + "転ばして": { + "w_type": "conjugated godan verb", + "romaji": "korobashite" + }, + "吹き流さ": { + "w_type": "godan verb stem", + "romaji": "fukinagasa" + }, + "吹き流し": { + "w_type": "godan verb stem", + "romaji": "fukinagashi" + }, + "吹き流せ": { + "w_type": "conjugated godan verb", + "romaji": "fukinagase" + }, + "吹き流そ": { + "w_type": "godan verb stem", + "romaji": "fukinagaso" + }, + "吹き流した": { + "w_type": "conjugated godan verb", + "romaji": "fukinagashita" + }, + "吹き流して": { + "w_type": "conjugated godan verb", + "romaji": "fukinagashite" + }, + "猛り立た": { + "w_type": "godan verb stem", + "romaji": "takeritata" + }, + "猛り立ち": { + "w_type": "godan verb stem", + "romaji": "takeritachi" + }, + "猛り立て": { + "w_type": "conjugated godan verb", + "romaji": "takeritate" + }, + "猛り立と": { + "w_type": "godan verb stem", + "romaji": "takeritato" + }, + "猛り立った": { + "w_type": "conjugated godan verb", + "romaji": "takeritatta" + }, + "猛り立って": { + "w_type": "conjugated godan verb", + "romaji": "takeritatte" + }, + "下ら": { + "w_type": "godan verb stem", + "romaji": "kudara" + }, + "下り": { + "w_type": "godan verb stem", + "romaji": "kudari" + }, + "下れ": { + "w_type": "conjugated godan verb", + "romaji": "kudare" + }, + "下ろ": { + "w_type": "godan verb stem", + "romaji": "kudaro" + }, + "下った": { + "w_type": "conjugated godan verb", + "romaji": "kudatta" + }, + "下って": { + "w_type": "conjugated godan verb", + "romaji": "kudatte" + }, + "弾け飛ば": { + "w_type": "godan verb stem", + "romaji": "hajiketoba" + }, + "弾け飛び": { + "w_type": "godan verb stem", + "romaji": "hajiketobi" + }, + "弾け飛べ": { + "w_type": "conjugated godan verb", + "romaji": "hajiketobe" + }, + "弾け飛ぼ": { + "w_type": "godan verb stem", + "romaji": "hajiketobo" + }, + "弾け飛んだ": { + "w_type": "conjugated godan verb", + "romaji": "hajiketonda" + }, + "弾け飛んで": { + "w_type": "conjugated godan verb", + "romaji": "hajiketonde" + }, + "歳とら": { + "w_type": "godan verb stem", + "romaji": "toshitora" + }, + "歳とり": { + "w_type": "godan verb stem", + "romaji": "toshitori" + }, + "歳とれ": { + "w_type": "conjugated godan verb", + "romaji": "toshitore" + }, + "歳とろ": { + "w_type": "godan verb stem", + "romaji": "toshitoro" + }, + "歳とった": { + "w_type": "conjugated godan verb", + "romaji": "toshitotta" + }, + "歳とって": { + "w_type": "conjugated godan verb", + "romaji": "toshitotte" + }, + "漏れ出さ": { + "w_type": "godan verb stem", + "romaji": "moredasa" + }, + "漏れ出し": { + "w_type": "godan verb stem", + "romaji": "moredashi" + }, + "漏れ出せ": { + "w_type": "conjugated godan verb", + "romaji": "moredase" + }, + "漏れ出そ": { + "w_type": "godan verb stem", + "romaji": "moredaso" + }, + "漏れ出した": { + "w_type": "conjugated godan verb", + "romaji": "moredashita" + }, + "漏れ出して": { + "w_type": "conjugated godan verb", + "romaji": "moredashite" + }, + "迷わ": { + "w_type": "godan verb stem", + "romaji": "mayowa" + }, + "迷い": { + "w_type": "godan verb stem", + "romaji": "mayoi" + }, + "迷え": { + "w_type": "conjugated godan verb", + "romaji": "mayoe" + }, + "迷お": { + "w_type": "godan verb stem", + "romaji": "mayoo" + }, + "迷った": { + "w_type": "conjugated godan verb", + "romaji": "mayotta" + }, + "迷って": { + "w_type": "conjugated godan verb", + "romaji": "mayotte" + }, + "恐れ入ら": { + "w_type": "godan verb stem", + "romaji": "osoreira" + }, + "恐れ入り": { + "w_type": "godan verb stem", + "romaji": "osoreiri" + }, + "恐れ入れ": { + "w_type": "conjugated godan verb", + "romaji": "osoreire" + }, + "恐れ入ろ": { + "w_type": "godan verb stem", + "romaji": "osoreiro" + }, + "恐れ入った": { + "w_type": "conjugated godan verb", + "romaji": "osoreitta" + }, + "恐れ入って": { + "w_type": "conjugated godan verb", + "romaji": "osoreitte" + }, + "切り立た": { + "w_type": "godan verb stem", + "romaji": "kiritata" + }, + "切り立ち": { + "w_type": "godan verb stem", + "romaji": "kiritachi" + }, + "切り立て": { + "w_type": "conjugated godan verb", + "romaji": "kiritate" + }, + "切り立と": { + "w_type": "godan verb stem", + "romaji": "kiritato" + }, + "切り立った": { + "w_type": "conjugated godan verb", + "romaji": "kiritatta" + }, + "切り立って": { + "w_type": "conjugated godan verb", + "romaji": "kiritatte" + }, + "言誤ら": { + "w_type": "godan verb stem", + "romaji": "iiayamara" + }, + "言誤り": { + "w_type": "godan verb stem", + "romaji": "iiayamari" + }, + "言誤れ": { + "w_type": "conjugated godan verb", + "romaji": "iiayamare" + }, + "言誤ろ": { + "w_type": "godan verb stem", + "romaji": "iiayamaro" + }, + "言誤った": { + "w_type": "conjugated godan verb", + "romaji": "iiayamatta" + }, + "言誤って": { + "w_type": "conjugated godan verb", + "romaji": "iiayamatte" + }, + "忍込ま": { + "w_type": "godan verb stem", + "romaji": "shinobikoma" + }, + "忍込み": { + "w_type": "godan verb stem", + "romaji": "shinobikomi" + }, + "忍込め": { + "w_type": "conjugated godan verb", + "romaji": "shinobikome" + }, + "忍込も": { + "w_type": "godan verb stem", + "romaji": "shinobikomo" + }, + "忍込んだ": { + "w_type": "conjugated godan verb", + "romaji": "shinobikonda" + }, + "忍込んで": { + "w_type": "conjugated godan verb", + "romaji": "shinobikonde" + }, + "形造ら": { + "w_type": "godan verb stem", + "romaji": "katachizukura" + }, + "形造り": { + "w_type": "godan verb stem", + "romaji": "katachizukuri" + }, + "形造れ": { + "w_type": "conjugated godan verb", + "romaji": "katachizukure" + }, + "形造ろ": { + "w_type": "godan verb stem", + "romaji": "katachizukuro" + }, + "形造った": { + "w_type": "conjugated godan verb", + "romaji": "katachizukutta" + }, + "形造って": { + "w_type": "conjugated godan verb", + "romaji": "katachizukutte" + }, + "出で立た": { + "w_type": "godan verb stem", + "romaji": "idetata" + }, + "出で立ち": { + "w_type": "godan verb stem", + "romaji": "idetachi" + }, + "出で立て": { + "w_type": "conjugated godan verb", + "romaji": "idetate" + }, + "出で立と": { + "w_type": "godan verb stem", + "romaji": "idetato" + }, + "出で立った": { + "w_type": "conjugated godan verb", + "romaji": "idetatta" + }, + "出で立って": { + "w_type": "conjugated godan verb", + "romaji": "idetatte" + }, + "見つめ合わ": { + "w_type": "godan verb stem", + "romaji": "mitsumeawa" + }, + "見つめ合い": { + "w_type": "godan verb stem", + "romaji": "mitsumeai" + }, + "見つめ合え": { + "w_type": "conjugated godan verb", + "romaji": "mitsumeae" + }, + "見つめ合お": { + "w_type": "godan verb stem", + "romaji": "mitsumeao" + }, + "見つめ合った": { + "w_type": "conjugated godan verb", + "romaji": "mitsumeatta" + }, + "見つめ合って": { + "w_type": "conjugated godan verb", + "romaji": "mitsumeatte" + }, + "誇ら": { + "w_type": "godan verb stem", + "romaji": "hokora" + }, + "誇り": { + "w_type": "godan verb stem", + "romaji": "hokori" + }, + "誇れ": { + "w_type": "conjugated godan verb", + "romaji": "hokore" + }, + "誇ろ": { + "w_type": "godan verb stem", + "romaji": "hokoro" + }, + "誇った": { + "w_type": "conjugated godan verb", + "romaji": "hokotta" + }, + "誇って": { + "w_type": "conjugated godan verb", + "romaji": "hokotte" + }, + "吹っ切ら": { + "w_type": "godan verb stem", + "romaji": "fukkira" + }, + "吹っ切り": { + "w_type": "godan verb stem", + "romaji": "fukkiri" + }, + "吹っ切れ": { + "w_type": "conjugated godan verb", + "romaji": "fukkire" + }, + "吹っ切ろ": { + "w_type": "godan verb stem", + "romaji": "fukkiro" + }, + "吹っ切った": { + "w_type": "conjugated godan verb", + "romaji": "fukkitta" + }, + "吹っ切って": { + "w_type": "conjugated godan verb", + "romaji": "fukkitte" + }, + "聴き込ま": { + "w_type": "godan verb stem", + "romaji": "kikikoma" + }, + "聴き込み": { + "w_type": "godan verb stem", + "romaji": "kikikomi" + }, + "聴き込め": { + "w_type": "conjugated godan verb", + "romaji": "kikikome" + }, + "聴き込も": { + "w_type": "godan verb stem", + "romaji": "kikikomo" + }, + "聴き込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kikikonda" + }, + "聴き込んで": { + "w_type": "conjugated godan verb", + "romaji": "kikikonde" + }, + "打ち抜か": { + "w_type": "godan verb stem", + "romaji": "uchinuka" + }, + "打ち抜き": { + "w_type": "godan verb stem", + "romaji": "uchinuki" + }, + "打ち抜け": { + "w_type": "conjugated godan verb", + "romaji": "uchinuke" + }, + "打ち抜こ": { + "w_type": "godan verb stem", + "romaji": "uchinuko" + }, + "打ち抜いた": { + "w_type": "conjugated godan verb", + "romaji": "uchinuita" + }, + "打ち抜いて": { + "w_type": "conjugated godan verb", + "romaji": "uchinuite" + }, + "助け守ら": { + "w_type": "godan verb stem", + "romaji": "tasukemamora" + }, + "助け守り": { + "w_type": "godan verb stem", + "romaji": "tasukemamori" + }, + "助け守れ": { + "w_type": "conjugated godan verb", + "romaji": "tasukemamore" + }, + "助け守ろ": { + "w_type": "godan verb stem", + "romaji": "tasukemamoro" + }, + "助け守った": { + "w_type": "conjugated godan verb", + "romaji": "tasukemamotta" + }, + "助け守って": { + "w_type": "conjugated godan verb", + "romaji": "tasukemamotte" + }, + "仰ら": { + "w_type": "godan verb stem", + "romaji": "osshara" + }, + "仰り": { + "w_type": "godan verb stem", + "romaji": "osshari" + }, + "仰れ": { + "w_type": "conjugated godan verb", + "romaji": "osshare" + }, + "仰ろ": { + "w_type": "godan verb stem", + "romaji": "ossharo" + }, + "仰った": { + "w_type": "conjugated godan verb", + "romaji": "osshatta" + }, + "仰って": { + "w_type": "conjugated godan verb", + "romaji": "osshatte" + }, + "倦ま": { + "w_type": "godan verb stem", + "romaji": "aguma" + }, + "倦み": { + "w_type": "godan verb stem", + "romaji": "agumi" + }, + "倦め": { + "w_type": "conjugated godan verb", + "romaji": "agume" + }, + "倦も": { + "w_type": "godan verb stem", + "romaji": "agumo" + }, + "倦んだ": { + "w_type": "conjugated godan verb", + "romaji": "agunda" + }, + "倦んで": { + "w_type": "conjugated godan verb", + "romaji": "agunde" + }, + "揉みしだか": { + "w_type": "godan verb stem", + "romaji": "momishidaka" + }, + "揉みしだき": { + "w_type": "godan verb stem", + "romaji": "momishidaki" + }, + "揉みしだけ": { + "w_type": "conjugated godan verb", + "romaji": "momishidake" + }, + "揉みしだこ": { + "w_type": "godan verb stem", + "romaji": "momishidako" + }, + "揉みしだいた": { + "w_type": "conjugated godan verb", + "romaji": "momishidaita" + }, + "揉みしだいて": { + "w_type": "conjugated godan verb", + "romaji": "momishidaite" + }, + "闘わさ": { + "w_type": "godan verb stem", + "romaji": "tatakawasa" + }, + "闘わし": { + "w_type": "godan verb stem", + "romaji": "tatakawashi" + }, + "闘わせ": { + "w_type": "conjugated godan verb", + "romaji": "tatakawase" + }, + "闘わそ": { + "w_type": "godan verb stem", + "romaji": "tatakawaso" + }, + "闘わした": { + "w_type": "conjugated godan verb", + "romaji": "tatakawashita" + }, + "闘わして": { + "w_type": "conjugated godan verb", + "romaji": "tatakawashite" + }, + "押し黙ら": { + "w_type": "godan verb stem", + "romaji": "oshidamara" + }, + "押し黙り": { + "w_type": "godan verb stem", + "romaji": "oshidamari" + }, + "押し黙れ": { + "w_type": "conjugated godan verb", + "romaji": "oshidamare" + }, + "押し黙ろ": { + "w_type": "godan verb stem", + "romaji": "oshidamaro" + }, + "押し黙った": { + "w_type": "conjugated godan verb", + "romaji": "oshidamatta" + }, + "押し黙って": { + "w_type": "conjugated godan verb", + "romaji": "oshidamatte" + }, + "借金で苦しま": { + "w_type": "godan verb stem", + "romaji": "shakkindekurushima" + }, + "借金で苦しみ": { + "w_type": "godan verb stem", + "romaji": "shakkindekurushimi" + }, + "借金で苦しめ": { + "w_type": "conjugated godan verb", + "romaji": "shakkindekurushime" + }, + "借金で苦しも": { + "w_type": "godan verb stem", + "romaji": "shakkindekurushimo" + }, + "借金で苦しんだ": { + "w_type": "conjugated godan verb", + "romaji": "shakkindekurushinda" + }, + "借金で苦しんで": { + "w_type": "conjugated godan verb", + "romaji": "shakkindekurushinde" + }, + "気遣わ": { + "w_type": "godan verb stem", + "romaji": "kizukawa" + }, + "気遣い": { + "w_type": "godan verb stem", + "romaji": "kizukai" + }, + "気遣え": { + "w_type": "conjugated godan verb", + "romaji": "kizukae" + }, + "気遣お": { + "w_type": "godan verb stem", + "romaji": "kizukao" + }, + "気遣った": { + "w_type": "conjugated godan verb", + "romaji": "kizukatta" + }, + "気遣って": { + "w_type": "conjugated godan verb", + "romaji": "kizukatte" + }, + "斎か": { + "w_type": "godan verb stem", + "romaji": "itsuka" + }, + "斎き": { + "w_type": "godan verb stem", + "romaji": "itsuki" + }, + "斎け": { + "w_type": "conjugated godan verb", + "romaji": "itsuke" + }, + "斎こ": { + "w_type": "godan verb stem", + "romaji": "itsuko" + }, + "斎いた": { + "w_type": "conjugated godan verb", + "romaji": "itsuita" + }, + "斎いて": { + "w_type": "conjugated godan verb", + "romaji": "itsuite" + }, + "立退か": { + "w_type": "godan verb stem", + "romaji": "tachinoka" + }, + "立退き": { + "w_type": "godan verb stem", + "romaji": "tachinoki" + }, + "立退け": { + "w_type": "conjugated godan verb", + "romaji": "tachinoke" + }, + "立退こ": { + "w_type": "godan verb stem", + "romaji": "tachinoko" + }, + "立退いた": { + "w_type": "conjugated godan verb", + "romaji": "tachinoita" + }, + "立退いて": { + "w_type": "conjugated godan verb", + "romaji": "tachinoite" + }, + "煮えくりかえら": { + "w_type": "godan verb stem", + "romaji": "niekurikaera" + }, + "煮えくりかえり": { + "w_type": "godan verb stem", + "romaji": "niekurikaeri" + }, + "煮えくりかえれ": { + "w_type": "conjugated godan verb", + "romaji": "niekurikaere" + }, + "煮えくりかえろ": { + "w_type": "godan verb stem", + "romaji": "niekurikaero" + }, + "煮えくりかえった": { + "w_type": "conjugated godan verb", + "romaji": "niekurikaetta" + }, + "煮えくりかえって": { + "w_type": "conjugated godan verb", + "romaji": "niekurikaette" + }, + "噛み付か": { + "w_type": "godan verb stem", + "romaji": "kamitsuka" + }, + "噛み付き": { + "w_type": "godan verb stem", + "romaji": "kamitsuki" + }, + "噛み付け": { + "w_type": "conjugated godan verb", + "romaji": "kamitsuke" + }, + "噛み付こ": { + "w_type": "godan verb stem", + "romaji": "kamitsuko" + }, + "噛み付いた": { + "w_type": "conjugated godan verb", + "romaji": "kamitsuita" + }, + "噛み付いて": { + "w_type": "conjugated godan verb", + "romaji": "kamitsuite" + }, + "立ち並ば": { + "w_type": "godan verb stem", + "romaji": "tachinaraba" + }, + "立ち並び": { + "w_type": "godan verb stem", + "romaji": "tachinarabi" + }, + "立ち並べ": { + "w_type": "conjugated godan verb", + "romaji": "tachinarabe" + }, + "立ち並ぼ": { + "w_type": "godan verb stem", + "romaji": "tachinarabo" + }, + "立ち並んだ": { + "w_type": "conjugated godan verb", + "romaji": "tachinaranda" + }, + "立ち並んで": { + "w_type": "conjugated godan verb", + "romaji": "tachinarande" + }, + "劣ら": { + "w_type": "godan verb stem", + "romaji": "otora" + }, + "劣り": { + "w_type": "godan verb stem", + "romaji": "otori" + }, + "劣れ": { + "w_type": "conjugated godan verb", + "romaji": "otore" + }, + "劣ろ": { + "w_type": "godan verb stem", + "romaji": "otoro" + }, + "劣った": { + "w_type": "conjugated godan verb", + "romaji": "ototta" + }, + "劣って": { + "w_type": "conjugated godan verb", + "romaji": "ototte" + }, + "遣りなおさ": { + "w_type": "godan verb stem", + "romaji": "yarinaosa" + }, + "遣りなおし": { + "w_type": "godan verb stem", + "romaji": "yarinaoshi" + }, + "遣りなおせ": { + "w_type": "conjugated godan verb", + "romaji": "yarinaose" + }, + "遣りなおそ": { + "w_type": "godan verb stem", + "romaji": "yarinaoso" + }, + "遣りなおした": { + "w_type": "conjugated godan verb", + "romaji": "yarinaoshita" + }, + "遣りなおして": { + "w_type": "conjugated godan verb", + "romaji": "yarinaoshite" + }, + "商わ": { + "w_type": "godan verb stem", + "romaji": "akinawa" + }, + "商い": { + "w_type": "godan verb stem", + "romaji": "akinai" + }, + "商え": { + "w_type": "conjugated godan verb", + "romaji": "akinae" + }, + "商お": { + "w_type": "godan verb stem", + "romaji": "akinao" + }, + "商った": { + "w_type": "conjugated godan verb", + "romaji": "akinatta" + }, + "商って": { + "w_type": "conjugated godan verb", + "romaji": "akinatte" + }, + "忍ば": { + "w_type": "godan verb stem", + "romaji": "shinoba" + }, + "忍び": { + "w_type": "godan verb stem", + "romaji": "shinobi" + }, + "忍べ": { + "w_type": "conjugated godan verb", + "romaji": "shinobe" + }, + "忍ぼ": { + "w_type": "godan verb stem", + "romaji": "shinobo" + }, + "忍んだ": { + "w_type": "conjugated godan verb", + "romaji": "shinonda" + }, + "忍んで": { + "w_type": "conjugated godan verb", + "romaji": "shinonde" + }, + "伺い知ら": { + "w_type": "godan verb stem", + "romaji": "ukagaishira" + }, + "伺い知り": { + "w_type": "godan verb stem", + "romaji": "ukagaishiri" + }, + "伺い知れ": { + "w_type": "conjugated godan verb", + "romaji": "ukagaishire" + }, + "伺い知ろ": { + "w_type": "godan verb stem", + "romaji": "ukagaishiro" + }, + "伺い知った": { + "w_type": "conjugated godan verb", + "romaji": "ukagaishitta" + }, + "伺い知って": { + "w_type": "conjugated godan verb", + "romaji": "ukagaishitte" + }, + "乗りこま": { + "w_type": "godan verb stem", + "romaji": "norikoma" + }, + "乗りこみ": { + "w_type": "godan verb stem", + "romaji": "norikomi" + }, + "乗りこめ": { + "w_type": "conjugated godan verb", + "romaji": "norikome" + }, + "乗りこも": { + "w_type": "godan verb stem", + "romaji": "norikomo" + }, + "乗りこんだ": { + "w_type": "conjugated godan verb", + "romaji": "norikonda" + }, + "乗りこんで": { + "w_type": "conjugated godan verb", + "romaji": "norikonde" + }, + "図ら": { + "w_type": "godan verb stem", + "romaji": "hakara" + }, + "図り": { + "w_type": "godan verb stem", + "romaji": "hakari" + }, + "図れ": { + "w_type": "conjugated godan verb", + "romaji": "hakare" + }, + "図ろ": { + "w_type": "godan verb stem", + "romaji": "hakaro" + }, + "図った": { + "w_type": "conjugated godan verb", + "romaji": "hakatta" + }, + "図って": { + "w_type": "conjugated godan verb", + "romaji": "hakatte" + }, + "作り出さ": { + "w_type": "godan verb stem", + "romaji": "tsukuridasa" + }, + "作り出し": { + "w_type": "godan verb stem", + "romaji": "tsukuridashi" + }, + "作り出せ": { + "w_type": "conjugated godan verb", + "romaji": "tsukuridase" + }, + "作り出そ": { + "w_type": "godan verb stem", + "romaji": "tsukuridaso" + }, + "作り出した": { + "w_type": "conjugated godan verb", + "romaji": "tsukuridashita" + }, + "作り出して": { + "w_type": "conjugated godan verb", + "romaji": "tsukuridashite" + }, + "着なおさ": { + "w_type": "godan verb stem", + "romaji": "kinaosa" + }, + "着なおし": { + "w_type": "godan verb stem", + "romaji": "kinaoshi" + }, + "着なおせ": { + "w_type": "conjugated godan verb", + "romaji": "kinaose" + }, + "着なおそ": { + "w_type": "godan verb stem", + "romaji": "kinaoso" + }, + "着なおした": { + "w_type": "conjugated godan verb", + "romaji": "kinaoshita" + }, + "着なおして": { + "w_type": "conjugated godan verb", + "romaji": "kinaoshite" + }, + "打ち延ばさ": { + "w_type": "godan verb stem", + "romaji": "uchinobasa" + }, + "打ち延ばし": { + "w_type": "godan verb stem", + "romaji": "uchinobashi" + }, + "打ち延ばせ": { + "w_type": "conjugated godan verb", + "romaji": "uchinobase" + }, + "打ち延ばそ": { + "w_type": "godan verb stem", + "romaji": "uchinobaso" + }, + "打ち延ばした": { + "w_type": "conjugated godan verb", + "romaji": "uchinobashita" + }, + "打ち延ばして": { + "w_type": "conjugated godan verb", + "romaji": "uchinobashite" + }, + "形づくら": { + "w_type": "godan verb stem", + "romaji": "katachizukura" + }, + "形づくり": { + "w_type": "godan verb stem", + "romaji": "katachizukuri" + }, + "形づくれ": { + "w_type": "conjugated godan verb", + "romaji": "katachizukure" + }, + "形づくろ": { + "w_type": "godan verb stem", + "romaji": "katachizukuro" + }, + "形づくった": { + "w_type": "conjugated godan verb", + "romaji": "katachizukutta" + }, + "形づくって": { + "w_type": "conjugated godan verb", + "romaji": "katachizukutte" + }, + "節榑立た": { + "w_type": "godan verb stem", + "romaji": "fushikuredata" + }, + "節榑立ち": { + "w_type": "godan verb stem", + "romaji": "fushikuredachi" + }, + "節榑立て": { + "w_type": "conjugated godan verb", + "romaji": "fushikuredate" + }, + "節榑立と": { + "w_type": "godan verb stem", + "romaji": "fushikuredato" + }, + "節榑立った": { + "w_type": "conjugated godan verb", + "romaji": "fushikuredatta" + }, + "節榑立って": { + "w_type": "conjugated godan verb", + "romaji": "fushikuredatte" + }, + "引き取ら": { + "w_type": "godan verb stem", + "romaji": "hikitora" + }, + "引き取り": { + "w_type": "godan verb stem", + "romaji": "hikitori" + }, + "引き取れ": { + "w_type": "conjugated godan verb", + "romaji": "hikitore" + }, + "引き取ろ": { + "w_type": "godan verb stem", + "romaji": "hikitoro" + }, + "引き取った": { + "w_type": "conjugated godan verb", + "romaji": "hikitotta" + }, + "引き取って": { + "w_type": "conjugated godan verb", + "romaji": "hikitotte" + }, + "飽足ら": { + "w_type": "godan verb stem", + "romaji": "akitara" + }, + "飽足り": { + "w_type": "godan verb stem", + "romaji": "akitari" + }, + "飽足れ": { + "w_type": "conjugated godan verb", + "romaji": "akitare" + }, + "飽足ろ": { + "w_type": "godan verb stem", + "romaji": "akitaro" + }, + "飽足った": { + "w_type": "conjugated godan verb", + "romaji": "akitatta" + }, + "飽足って": { + "w_type": "conjugated godan verb", + "romaji": "akitatte" + }, + "打克た": { + "w_type": "godan verb stem", + "romaji": "uchikata" + }, + "打克ち": { + "w_type": "godan verb stem", + "romaji": "uchikachi" + }, + "打克て": { + "w_type": "conjugated godan verb", + "romaji": "uchikate" + }, + "打克と": { + "w_type": "godan verb stem", + "romaji": "uchikato" + }, + "打克った": { + "w_type": "conjugated godan verb", + "romaji": "uchikatta" + }, + "打克って": { + "w_type": "conjugated godan verb", + "romaji": "uchikatte" + }, + "踏み均さ": { + "w_type": "godan verb stem", + "romaji": "fuminarasa" + }, + "踏み均し": { + "w_type": "godan verb stem", + "romaji": "fuminarashi" + }, + "踏み均せ": { + "w_type": "conjugated godan verb", + "romaji": "fuminarase" + }, + "踏み均そ": { + "w_type": "godan verb stem", + "romaji": "fuminaraso" + }, + "踏み均した": { + "w_type": "conjugated godan verb", + "romaji": "fuminarashita" + }, + "踏み均して": { + "w_type": "conjugated godan verb", + "romaji": "fuminarashite" + }, + "主立た": { + "w_type": "godan verb stem", + "romaji": "omodata" + }, + "主立ち": { + "w_type": "godan verb stem", + "romaji": "omodachi" + }, + "主立て": { + "w_type": "conjugated godan verb", + "romaji": "omodate" + }, + "主立と": { + "w_type": "godan verb stem", + "romaji": "omodato" + }, + "主立った": { + "w_type": "conjugated godan verb", + "romaji": "omodatta" + }, + "主立って": { + "w_type": "conjugated godan verb", + "romaji": "omodatte" + }, + "わかち合わ": { + "w_type": "godan verb stem", + "romaji": "wakachiawa" + }, + "わかち合い": { + "w_type": "godan verb stem", + "romaji": "wakachiai" + }, + "わかち合え": { + "w_type": "conjugated godan verb", + "romaji": "wakachiae" + }, + "わかち合お": { + "w_type": "godan verb stem", + "romaji": "wakachiao" + }, + "わかち合った": { + "w_type": "conjugated godan verb", + "romaji": "wakachiatta" + }, + "わかち合って": { + "w_type": "conjugated godan verb", + "romaji": "wakachiatte" + }, + "変ら": { + "w_type": "godan verb stem", + "romaji": "kawara" + }, + "変り": { + "w_type": "godan verb stem", + "romaji": "kawari" + }, + "変れ": { + "w_type": "conjugated godan verb", + "romaji": "kaware" + }, + "変ろ": { + "w_type": "godan verb stem", + "romaji": "kawaro" + }, + "変った": { + "w_type": "conjugated godan verb", + "romaji": "kawatta" + }, + "変って": { + "w_type": "conjugated godan verb", + "romaji": "kawatte" + }, + "数えなおさ": { + "w_type": "godan verb stem", + "romaji": "kazoenaosa" + }, + "数えなおし": { + "w_type": "godan verb stem", + "romaji": "kazoenaoshi" + }, + "数えなおせ": { + "w_type": "conjugated godan verb", + "romaji": "kazoenaose" + }, + "数えなおそ": { + "w_type": "godan verb stem", + "romaji": "kazoenaoso" + }, + "数えなおした": { + "w_type": "conjugated godan verb", + "romaji": "kazoenaoshita" + }, + "数えなおして": { + "w_type": "conjugated godan verb", + "romaji": "kazoenaoshite" + }, + "はじき出さ": { + "w_type": "godan verb stem", + "romaji": "hajikidasa" + }, + "はじき出し": { + "w_type": "godan verb stem", + "romaji": "hajikidashi" + }, + "はじき出せ": { + "w_type": "conjugated godan verb", + "romaji": "hajikidase" + }, + "はじき出そ": { + "w_type": "godan verb stem", + "romaji": "hajikidaso" + }, + "はじき出した": { + "w_type": "conjugated godan verb", + "romaji": "hajikidashita" + }, + "はじき出して": { + "w_type": "conjugated godan verb", + "romaji": "hajikidashite" + }, + "銜え込ま": { + "w_type": "godan verb stem", + "romaji": "kuwaekoma" + }, + "銜え込み": { + "w_type": "godan verb stem", + "romaji": "kuwaekomi" + }, + "銜え込め": { + "w_type": "conjugated godan verb", + "romaji": "kuwaekome" + }, + "銜え込も": { + "w_type": "godan verb stem", + "romaji": "kuwaekomo" + }, + "銜え込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kuwaekonda" + }, + "銜え込んで": { + "w_type": "conjugated godan verb", + "romaji": "kuwaekonde" + }, + "伸び悩ま": { + "w_type": "godan verb stem", + "romaji": "nobinayama" + }, + "伸び悩み": { + "w_type": "godan verb stem", + "romaji": "nobinayami" + }, + "伸び悩め": { + "w_type": "conjugated godan verb", + "romaji": "nobinayame" + }, + "伸び悩も": { + "w_type": "godan verb stem", + "romaji": "nobinayamo" + }, + "伸び悩んだ": { + "w_type": "conjugated godan verb", + "romaji": "nobinayanda" + }, + "伸び悩んで": { + "w_type": "conjugated godan verb", + "romaji": "nobinayande" + }, + "寛が": { + "w_type": "godan verb stem", + "romaji": "kutsuroga" + }, + "寛ぎ": { + "w_type": "godan verb stem", + "romaji": "kutsurogi" + }, + "寛げ": { + "w_type": "conjugated godan verb", + "romaji": "kutsuroge" + }, + "寛ご": { + "w_type": "godan verb stem", + "romaji": "kutsurogo" + }, + "寛いだ": { + "w_type": "conjugated godan verb", + "romaji": "kutsuroida" + }, + "寛いで": { + "w_type": "conjugated godan verb", + "romaji": "kutsuroide" + }, + "沸き立た": { + "w_type": "godan verb stem", + "romaji": "wakitata" + }, + "沸き立ち": { + "w_type": "godan verb stem", + "romaji": "wakitachi" + }, + "沸き立て": { + "w_type": "conjugated godan verb", + "romaji": "wakitate" + }, + "沸き立と": { + "w_type": "godan verb stem", + "romaji": "wakitato" + }, + "沸き立った": { + "w_type": "conjugated godan verb", + "romaji": "wakitatta" + }, + "沸き立って": { + "w_type": "conjugated godan verb", + "romaji": "wakitatte" + }, + "食いしばら": { + "w_type": "godan verb stem", + "romaji": "kuishibara" + }, + "食いしばり": { + "w_type": "godan verb stem", + "romaji": "kuishibari" + }, + "食いしばれ": { + "w_type": "conjugated godan verb", + "romaji": "kuishibare" + }, + "食いしばろ": { + "w_type": "godan verb stem", + "romaji": "kuishibaro" + }, + "食いしばった": { + "w_type": "conjugated godan verb", + "romaji": "kuishibatta" + }, + "食いしばって": { + "w_type": "conjugated godan verb", + "romaji": "kuishibatte" + }, + "速まら": { + "w_type": "godan verb stem", + "romaji": "hayamara" + }, + "速まり": { + "w_type": "godan verb stem", + "romaji": "hayamari" + }, + "速まれ": { + "w_type": "conjugated godan verb", + "romaji": "hayamare" + }, + "速まろ": { + "w_type": "godan verb stem", + "romaji": "hayamaro" + }, + "速まった": { + "w_type": "conjugated godan verb", + "romaji": "hayamatta" + }, + "速まって": { + "w_type": "conjugated godan verb", + "romaji": "hayamatte" + }, + "弛まら": { + "w_type": "godan verb stem", + "romaji": "yurumara" + }, + "弛まり": { + "w_type": "godan verb stem", + "romaji": "yurumari" + }, + "弛まれ": { + "w_type": "conjugated godan verb", + "romaji": "yurumare" + }, + "弛まろ": { + "w_type": "godan verb stem", + "romaji": "yurumaro" + }, + "弛まった": { + "w_type": "conjugated godan verb", + "romaji": "yurumatta" + }, + "弛まって": { + "w_type": "conjugated godan verb", + "romaji": "yurumatte" + }, + "求むら": { + "w_type": "godan verb stem", + "romaji": "motomura" + }, + "求むり": { + "w_type": "godan verb stem", + "romaji": "motomuri" + }, + "求むれ": { + "w_type": "conjugated godan verb", + "romaji": "motomure" + }, + "求むろ": { + "w_type": "godan verb stem", + "romaji": "motomuro" + }, + "求むった": { + "w_type": "conjugated godan verb", + "romaji": "motomutta" + }, + "求むって": { + "w_type": "conjugated godan verb", + "romaji": "motomutte" + }, + "科さ": { + "w_type": "godan verb stem", + "romaji": "kasa" + }, + "科し": { + "w_type": "godan verb stem", + "romaji": "kashi" + }, + "科せ": { + "w_type": "conjugated godan verb", + "romaji": "kase" + }, + "科そ": { + "w_type": "godan verb stem", + "romaji": "kaso" + }, + "科した": { + "w_type": "conjugated godan verb", + "romaji": "kashita" + }, + "科して": { + "w_type": "conjugated godan verb", + "romaji": "kashite" + }, + "下回ら": { + "w_type": "godan verb stem", + "romaji": "shitamawara" + }, + "下回り": { + "w_type": "godan verb stem", + "romaji": "shitamawari" + }, + "下回れ": { + "w_type": "conjugated godan verb", + "romaji": "shitamaware" + }, + "下回ろ": { + "w_type": "godan verb stem", + "romaji": "shitamawaro" + }, + "下回った": { + "w_type": "conjugated godan verb", + "romaji": "shitamawatta" + }, + "下回って": { + "w_type": "conjugated godan verb", + "romaji": "shitamawatte" + }, + "駆けめぐら": { + "w_type": "godan verb stem", + "romaji": "kakemegura" + }, + "駆けめぐり": { + "w_type": "godan verb stem", + "romaji": "kakemeguri" + }, + "駆けめぐれ": { + "w_type": "conjugated godan verb", + "romaji": "kakemegure" + }, + "駆けめぐろ": { + "w_type": "godan verb stem", + "romaji": "kakemeguro" + }, + "駆けめぐった": { + "w_type": "conjugated godan verb", + "romaji": "kakemegutta" + }, + "駆けめぐって": { + "w_type": "conjugated godan verb", + "romaji": "kakemegutte" + }, + "着か": { + "w_type": "godan verb stem", + "romaji": "tsuka" + }, + "着き": { + "w_type": "godan verb stem", + "romaji": "tsuki" + }, + "着け": { + "w_type": "conjugated godan verb", + "romaji": "tsuke" + }, + "着こ": { + "w_type": "godan verb stem", + "romaji": "tsuko" + }, + "着いた": { + "w_type": "conjugated godan verb", + "romaji": "tsuita" + }, + "着いて": { + "w_type": "conjugated godan verb", + "romaji": "tsuite" + }, + "教え込ま": { + "w_type": "godan verb stem", + "romaji": "oshiekoma" + }, + "教え込み": { + "w_type": "godan verb stem", + "romaji": "oshiekomi" + }, + "教え込め": { + "w_type": "conjugated godan verb", + "romaji": "oshiekome" + }, + "教え込も": { + "w_type": "godan verb stem", + "romaji": "oshiekomo" + }, + "教え込んだ": { + "w_type": "conjugated godan verb", + "romaji": "oshiekonda" + }, + "教え込んで": { + "w_type": "conjugated godan verb", + "romaji": "oshiekonde" + }, + "関わり合わ": { + "w_type": "godan verb stem", + "romaji": "kakawariawa" + }, + "関わり合い": { + "w_type": "godan verb stem", + "romaji": "kakawariai" + }, + "関わり合え": { + "w_type": "conjugated godan verb", + "romaji": "kakawariae" + }, + "関わり合お": { + "w_type": "godan verb stem", + "romaji": "kakawariao" + }, + "関わり合った": { + "w_type": "conjugated godan verb", + "romaji": "kakawariatta" + }, + "関わり合って": { + "w_type": "conjugated godan verb", + "romaji": "kakawariatte" + }, + "折り畳ま": { + "w_type": "godan verb stem", + "romaji": "oritatama" + }, + "折り畳み": { + "w_type": "godan verb stem", + "romaji": "oritatami" + }, + "折り畳め": { + "w_type": "conjugated godan verb", + "romaji": "oritatame" + }, + "折り畳も": { + "w_type": "godan verb stem", + "romaji": "oritatamo" + }, + "折り畳んだ": { + "w_type": "conjugated godan verb", + "romaji": "oritatanda" + }, + "折り畳んで": { + "w_type": "conjugated godan verb", + "romaji": "oritatande" + }, + "取計らわ": { + "w_type": "godan verb stem", + "romaji": "torihakarawa" + }, + "取計らい": { + "w_type": "godan verb stem", + "romaji": "torihakarai" + }, + "取計らえ": { + "w_type": "conjugated godan verb", + "romaji": "torihakarae" + }, + "取計らお": { + "w_type": "godan verb stem", + "romaji": "torihakarao" + }, + "取計らった": { + "w_type": "conjugated godan verb", + "romaji": "torihakaratta" + }, + "取計らって": { + "w_type": "conjugated godan verb", + "romaji": "torihakaratte" + }, + "滲み込ま": { + "w_type": "godan verb stem", + "romaji": "shimikoma" + }, + "滲み込み": { + "w_type": "godan verb stem", + "romaji": "shimikomi" + }, + "滲み込め": { + "w_type": "conjugated godan verb", + "romaji": "shimikome" + }, + "滲み込も": { + "w_type": "godan verb stem", + "romaji": "shimikomo" + }, + "滲み込んだ": { + "w_type": "conjugated godan verb", + "romaji": "shimikonda" + }, + "滲み込んで": { + "w_type": "conjugated godan verb", + "romaji": "shimikonde" + }, + "読み誤まら": { + "w_type": "godan verb stem", + "romaji": "yomiayamara" + }, + "読み誤まり": { + "w_type": "godan verb stem", + "romaji": "yomiayamari" + }, + "読み誤まれ": { + "w_type": "conjugated godan verb", + "romaji": "yomiayamare" + }, + "読み誤まろ": { + "w_type": "godan verb stem", + "romaji": "yomiayamaro" + }, + "読み誤まった": { + "w_type": "conjugated godan verb", + "romaji": "yomiayamatta" + }, + "読み誤まって": { + "w_type": "conjugated godan verb", + "romaji": "yomiayamatte" + }, + "解か": { + "w_type": "godan verb stem", + "romaji": "toka" + }, + "解き": { + "w_type": "godan verb stem", + "romaji": "toki" + }, + "解け": { + "w_type": "conjugated godan verb", + "romaji": "toke" + }, + "解こ": { + "w_type": "godan verb stem", + "romaji": "toko" + }, + "解いた": { + "w_type": "conjugated godan verb", + "romaji": "toita" + }, + "解いて": { + "w_type": "conjugated godan verb", + "romaji": "toite" + }, + "吸いつか": { + "w_type": "godan verb stem", + "romaji": "suitsuka" + }, + "吸いつき": { + "w_type": "godan verb stem", + "romaji": "suitsuki" + }, + "吸いつけ": { + "w_type": "conjugated godan verb", + "romaji": "suitsuke" + }, + "吸いつこ": { + "w_type": "godan verb stem", + "romaji": "suitsuko" + }, + "吸いついた": { + "w_type": "conjugated godan verb", + "romaji": "suitsuita" + }, + "吸いついて": { + "w_type": "conjugated godan verb", + "romaji": "suitsuite" + }, + "解さ": { + "w_type": "godan verb stem", + "romaji": "hogusa" + }, + "解し": { + "w_type": "godan verb stem", + "romaji": "hogushi" + }, + "解せ": { + "w_type": "conjugated godan verb", + "romaji": "hoguse" + }, + "解そ": { + "w_type": "godan verb stem", + "romaji": "hoguso" + }, + "解した": { + "w_type": "conjugated godan verb", + "romaji": "hogushita" + }, + "解して": { + "w_type": "conjugated godan verb", + "romaji": "hogushite" + }, + "申し込ま": { + "w_type": "godan verb stem", + "romaji": "moushikoma" + }, + "申し込み": { + "w_type": "godan verb stem", + "romaji": "moushikomi" + }, + "申し込め": { + "w_type": "conjugated godan verb", + "romaji": "moushikome" + }, + "申し込も": { + "w_type": "godan verb stem", + "romaji": "moushikomo" + }, + "申し込んだ": { + "w_type": "conjugated godan verb", + "romaji": "moushikonda" + }, + "申し込んで": { + "w_type": "conjugated godan verb", + "romaji": "moushikonde" + }, + "たたき壊さ": { + "w_type": "godan verb stem", + "romaji": "tatakikowasa" + }, + "たたき壊し": { + "w_type": "godan verb stem", + "romaji": "tatakikowashi" + }, + "たたき壊せ": { + "w_type": "conjugated godan verb", + "romaji": "tatakikowase" + }, + "たたき壊そ": { + "w_type": "godan verb stem", + "romaji": "tatakikowaso" + }, + "たたき壊した": { + "w_type": "conjugated godan verb", + "romaji": "tatakikowashita" + }, + "たたき壊して": { + "w_type": "conjugated godan verb", + "romaji": "tatakikowashite" + }, + "事足ら": { + "w_type": "godan verb stem", + "romaji": "kototara" + }, + "事足り": { + "w_type": "godan verb stem", + "romaji": "kototari" + }, + "事足れ": { + "w_type": "conjugated godan verb", + "romaji": "kototare" + }, + "事足ろ": { + "w_type": "godan verb stem", + "romaji": "kototaro" + }, + "事足った": { + "w_type": "conjugated godan verb", + "romaji": "kototatta" + }, + "事足って": { + "w_type": "conjugated godan verb", + "romaji": "kototatte" + }, + "臥せら": { + "w_type": "godan verb stem", + "romaji": "fusera" + }, + "臥せり": { + "w_type": "godan verb stem", + "romaji": "fuseri" + }, + "臥せれ": { + "w_type": "conjugated godan verb", + "romaji": "fusere" + }, + "臥せろ": { + "w_type": "godan verb stem", + "romaji": "fusero" + }, + "臥せった": { + "w_type": "conjugated godan verb", + "romaji": "fusetta" + }, + "臥せって": { + "w_type": "conjugated godan verb", + "romaji": "fusette" + }, + "聴か": { + "w_type": "godan verb stem", + "romaji": "kika" + }, + "聴き": { + "w_type": "godan verb stem", + "romaji": "kiki" + }, + "聴け": { + "w_type": "conjugated godan verb", + "romaji": "kike" + }, + "聴こ": { + "w_type": "godan verb stem", + "romaji": "kiko" + }, + "聴いた": { + "w_type": "conjugated godan verb", + "romaji": "kiita" + }, + "聴いて": { + "w_type": "conjugated godan verb", + "romaji": "kiite" + }, + "堪忍ば": { + "w_type": "godan verb stem", + "romaji": "taeshinoba" + }, + "堪忍び": { + "w_type": "godan verb stem", + "romaji": "taeshinobi" + }, + "堪忍べ": { + "w_type": "conjugated godan verb", + "romaji": "taeshinobe" + }, + "堪忍ぼ": { + "w_type": "godan verb stem", + "romaji": "taeshinobo" + }, + "堪忍んだ": { + "w_type": "conjugated godan verb", + "romaji": "taeshinonda" + }, + "堪忍んで": { + "w_type": "conjugated godan verb", + "romaji": "taeshinonde" + }, + "引かさ": { + "w_type": "godan verb stem", + "romaji": "hikasa" + }, + "引かし": { + "w_type": "godan verb stem", + "romaji": "hikashi" + }, + "引かせ": { + "w_type": "conjugated godan verb", + "romaji": "hikase" + }, + "引かそ": { + "w_type": "godan verb stem", + "romaji": "hikaso" + }, + "引かした": { + "w_type": "conjugated godan verb", + "romaji": "hikashita" + }, + "引かして": { + "w_type": "conjugated godan verb", + "romaji": "hikashite" + }, + "あふれ出さ": { + "w_type": "godan verb stem", + "romaji": "afuredasa" + }, + "あふれ出し": { + "w_type": "godan verb stem", + "romaji": "afuredashi" + }, + "あふれ出せ": { + "w_type": "conjugated godan verb", + "romaji": "afuredase" + }, + "あふれ出そ": { + "w_type": "godan verb stem", + "romaji": "afuredaso" + }, + "あふれ出した": { + "w_type": "conjugated godan verb", + "romaji": "afuredashita" + }, + "あふれ出して": { + "w_type": "conjugated godan verb", + "romaji": "afuredashite" + }, + "陰で動か": { + "w_type": "godan verb stem", + "romaji": "kagedeugoka" + }, + "陰で動き": { + "w_type": "godan verb stem", + "romaji": "kagedeugoki" + }, + "陰で動け": { + "w_type": "conjugated godan verb", + "romaji": "kagedeugoke" + }, + "陰で動こ": { + "w_type": "godan verb stem", + "romaji": "kagedeugoko" + }, + "陰で動いた": { + "w_type": "conjugated godan verb", + "romaji": "kagedeugoita" + }, + "陰で動いて": { + "w_type": "conjugated godan verb", + "romaji": "kagedeugoite" + }, + "射た": { + "w_type": "godan verb stem", + "romaji": "uta" + }, + "射ち": { + "w_type": "godan verb stem", + "romaji": "uchi" + }, + "射て": { + "w_type": "conjugated godan verb", + "romaji": "ute" + }, + "射と": { + "w_type": "godan verb stem", + "romaji": "uto" + }, + "射った": { + "w_type": "conjugated godan verb", + "romaji": "utta" + }, + "射って": { + "w_type": "conjugated godan verb", + "romaji": "utte" + }, + "引き締ら": { + "w_type": "godan verb stem", + "romaji": "hikishimara" + }, + "引き締り": { + "w_type": "godan verb stem", + "romaji": "hikishimari" + }, + "引き締れ": { + "w_type": "conjugated godan verb", + "romaji": "hikishimare" + }, + "引き締ろ": { + "w_type": "godan verb stem", + "romaji": "hikishimaro" + }, + "引き締った": { + "w_type": "conjugated godan verb", + "romaji": "hikishimatta" + }, + "引き締って": { + "w_type": "conjugated godan verb", + "romaji": "hikishimatte" + }, + "損なわ": { + "w_type": "godan verb stem", + "romaji": "sokonawa" + }, + "損ない": { + "w_type": "godan verb stem", + "romaji": "sokonai" + }, + "損なえ": { + "w_type": "conjugated godan verb", + "romaji": "sokonae" + }, + "損なお": { + "w_type": "godan verb stem", + "romaji": "sokonao" + }, + "損なった": { + "w_type": "conjugated godan verb", + "romaji": "sokonatta" + }, + "損なって": { + "w_type": "conjugated godan verb", + "romaji": "sokonatte" + }, + "焼き殺さ": { + "w_type": "godan verb stem", + "romaji": "yakikorosa" + }, + "焼き殺し": { + "w_type": "godan verb stem", + "romaji": "yakikoroshi" + }, + "焼き殺せ": { + "w_type": "conjugated godan verb", + "romaji": "yakikorose" + }, + "焼き殺そ": { + "w_type": "godan verb stem", + "romaji": "yakikoroso" + }, + "焼き殺した": { + "w_type": "conjugated godan verb", + "romaji": "yakikoroshita" + }, + "焼き殺して": { + "w_type": "conjugated godan verb", + "romaji": "yakikoroshite" + }, + "引っ被ら": { + "w_type": "godan verb stem", + "romaji": "hikkabura" + }, + "引っ被り": { + "w_type": "godan verb stem", + "romaji": "hikkaburi" + }, + "引っ被れ": { + "w_type": "conjugated godan verb", + "romaji": "hikkabure" + }, + "引っ被ろ": { + "w_type": "godan verb stem", + "romaji": "hikkaburo" + }, + "引っ被った": { + "w_type": "conjugated godan verb", + "romaji": "hikkabutta" + }, + "引っ被って": { + "w_type": "conjugated godan verb", + "romaji": "hikkabutte" + }, + "浮び上がら": { + "w_type": "godan verb stem", + "romaji": "ukabiagara" + }, + "浮び上がり": { + "w_type": "godan verb stem", + "romaji": "ukabiagari" + }, + "浮び上がれ": { + "w_type": "conjugated godan verb", + "romaji": "ukabiagare" + }, + "浮び上がろ": { + "w_type": "godan verb stem", + "romaji": "ukabiagaro" + }, + "浮び上がった": { + "w_type": "conjugated godan verb", + "romaji": "ukabiagatta" + }, + "浮び上がって": { + "w_type": "conjugated godan verb", + "romaji": "ukabiagatte" + }, + "絡め取ら": { + "w_type": "godan verb stem", + "romaji": "karametora" + }, + "絡め取り": { + "w_type": "godan verb stem", + "romaji": "karametori" + }, + "絡め取れ": { + "w_type": "conjugated godan verb", + "romaji": "karametore" + }, + "絡め取ろ": { + "w_type": "godan verb stem", + "romaji": "karametoro" + }, + "絡め取った": { + "w_type": "conjugated godan verb", + "romaji": "karametotta" + }, + "絡め取って": { + "w_type": "conjugated godan verb", + "romaji": "karametotte" + }, + "温もら": { + "w_type": "godan verb stem", + "romaji": "nukumora" + }, + "温もり": { + "w_type": "godan verb stem", + "romaji": "nukumori" + }, + "温もれ": { + "w_type": "conjugated godan verb", + "romaji": "nukumore" + }, + "温もろ": { + "w_type": "godan verb stem", + "romaji": "nukumoro" + }, + "温もった": { + "w_type": "conjugated godan verb", + "romaji": "nukumotta" + }, + "温もって": { + "w_type": "conjugated godan verb", + "romaji": "nukumotte" + }, + "甲走ら": { + "w_type": "godan verb stem", + "romaji": "kanbashira" + }, + "甲走り": { + "w_type": "godan verb stem", + "romaji": "kanbashiri" + }, + "甲走れ": { + "w_type": "conjugated godan verb", + "romaji": "kanbashire" + }, + "甲走ろ": { + "w_type": "godan verb stem", + "romaji": "kanbashiro" + }, + "甲走った": { + "w_type": "conjugated godan verb", + "romaji": "kanbashitta" + }, + "甲走って": { + "w_type": "conjugated godan verb", + "romaji": "kanbashitte" + }, + "増やさ": { + "w_type": "godan verb stem", + "romaji": "fuyasa" + }, + "増やし": { + "w_type": "godan verb stem", + "romaji": "fuyashi" + }, + "増やせ": { + "w_type": "conjugated godan verb", + "romaji": "fuyase" + }, + "増やそ": { + "w_type": "godan verb stem", + "romaji": "fuyaso" + }, + "増やした": { + "w_type": "conjugated godan verb", + "romaji": "fuyashita" + }, + "増やして": { + "w_type": "conjugated godan verb", + "romaji": "fuyashite" + }, + "強まら": { + "w_type": "godan verb stem", + "romaji": "tsuyomara" + }, + "強まり": { + "w_type": "godan verb stem", + "romaji": "tsuyomari" + }, + "強まれ": { + "w_type": "conjugated godan verb", + "romaji": "tsuyomare" + }, + "強まろ": { + "w_type": "godan verb stem", + "romaji": "tsuyomaro" + }, + "強まった": { + "w_type": "conjugated godan verb", + "romaji": "tsuyomatta" + }, + "強まって": { + "w_type": "conjugated godan verb", + "romaji": "tsuyomatte" + }, + "活気付か": { + "w_type": "godan verb stem", + "romaji": "kakkizuka" + }, + "活気付き": { + "w_type": "godan verb stem", + "romaji": "kakkizuki" + }, + "活気付け": { + "w_type": "conjugated godan verb", + "romaji": "kakkizuke" + }, + "活気付こ": { + "w_type": "godan verb stem", + "romaji": "kakkizuko" + }, + "活気付いた": { + "w_type": "conjugated godan verb", + "romaji": "kakkizuita" + }, + "活気付いて": { + "w_type": "conjugated godan verb", + "romaji": "kakkizuite" + }, + "働き出さ": { + "w_type": "godan verb stem", + "romaji": "hatarakidasa" + }, + "働き出し": { + "w_type": "godan verb stem", + "romaji": "hatarakidashi" + }, + "働き出せ": { + "w_type": "conjugated godan verb", + "romaji": "hatarakidase" + }, + "働き出そ": { + "w_type": "godan verb stem", + "romaji": "hatarakidaso" + }, + "働き出した": { + "w_type": "conjugated godan verb", + "romaji": "hatarakidashita" + }, + "働き出して": { + "w_type": "conjugated godan verb", + "romaji": "hatarakidashite" + }, + "武者振り付か": { + "w_type": "godan verb stem", + "romaji": "mushaburitsuka" + }, + "武者振り付き": { + "w_type": "godan verb stem", + "romaji": "mushaburitsuki" + }, + "武者振り付け": { + "w_type": "conjugated godan verb", + "romaji": "mushaburitsuke" + }, + "武者振り付こ": { + "w_type": "godan verb stem", + "romaji": "mushaburitsuko" + }, + "武者振り付いた": { + "w_type": "conjugated godan verb", + "romaji": "mushaburitsuita" + }, + "武者振り付いて": { + "w_type": "conjugated godan verb", + "romaji": "mushaburitsuite" + }, + "ぶち抜か": { + "w_type": "godan verb stem", + "romaji": "uchinuka" + }, + "ぶち抜き": { + "w_type": "godan verb stem", + "romaji": "uchinuki" + }, + "ぶち抜け": { + "w_type": "conjugated godan verb", + "romaji": "uchinuke" + }, + "ぶち抜こ": { + "w_type": "godan verb stem", + "romaji": "uchinuko" + }, + "ぶち抜いた": { + "w_type": "conjugated godan verb", + "romaji": "uchinuita" + }, + "ぶち抜いて": { + "w_type": "conjugated godan verb", + "romaji": "uchinuite" + }, + "繰合わさ": { + "w_type": "godan verb stem", + "romaji": "kuriawasa" + }, + "繰合わし": { + "w_type": "godan verb stem", + "romaji": "kuriawashi" + }, + "繰合わせ": { + "w_type": "conjugated godan verb", + "romaji": "kuriawase" + }, + "繰合わそ": { + "w_type": "godan verb stem", + "romaji": "kuriawaso" + }, + "繰合わした": { + "w_type": "conjugated godan verb", + "romaji": "kuriawashita" + }, + "繰合わして": { + "w_type": "conjugated godan verb", + "romaji": "kuriawashite" + }, + "呪い殺さ": { + "w_type": "godan verb stem", + "romaji": "noroikorosa" + }, + "呪い殺し": { + "w_type": "godan verb stem", + "romaji": "noroikoroshi" + }, + "呪い殺せ": { + "w_type": "conjugated godan verb", + "romaji": "noroikorose" + }, + "呪い殺そ": { + "w_type": "godan verb stem", + "romaji": "noroikoroso" + }, + "呪い殺した": { + "w_type": "conjugated godan verb", + "romaji": "noroikoroshita" + }, + "呪い殺して": { + "w_type": "conjugated godan verb", + "romaji": "noroikoroshite" + }, + "持直さ": { + "w_type": "godan verb stem", + "romaji": "mochinaosa" + }, + "持直し": { + "w_type": "godan verb stem", + "romaji": "mochinaoshi" + }, + "持直せ": { + "w_type": "conjugated godan verb", + "romaji": "mochinaose" + }, + "持直そ": { + "w_type": "godan verb stem", + "romaji": "mochinaoso" + }, + "持直した": { + "w_type": "conjugated godan verb", + "romaji": "mochinaoshita" + }, + "持直して": { + "w_type": "conjugated godan verb", + "romaji": "mochinaoshite" + }, + "濟ま": { + "w_type": "godan verb stem", + "romaji": "suma" + }, + "濟み": { + "w_type": "godan verb stem", + "romaji": "sumi" + }, + "濟め": { + "w_type": "conjugated godan verb", + "romaji": "sume" + }, + "濟も": { + "w_type": "godan verb stem", + "romaji": "sumo" + }, + "濟んだ": { + "w_type": "conjugated godan verb", + "romaji": "sunda" + }, + "濟んで": { + "w_type": "conjugated godan verb", + "romaji": "sunde" + }, + "引っかから": { + "w_type": "godan verb stem", + "romaji": "hikkakara" + }, + "引っかかり": { + "w_type": "godan verb stem", + "romaji": "hikkakari" + }, + "引っかかれ": { + "w_type": "conjugated godan verb", + "romaji": "hikkakare" + }, + "引っかかろ": { + "w_type": "godan verb stem", + "romaji": "hikkakaro" + }, + "引っかかった": { + "w_type": "conjugated godan verb", + "romaji": "hikkakatta" + }, + "引っかかって": { + "w_type": "conjugated godan verb", + "romaji": "hikkakatte" + }, + "行悩ま": { + "w_type": "godan verb stem", + "romaji": "yukinayama" + }, + "行悩み": { + "w_type": "godan verb stem", + "romaji": "yukinayami" + }, + "行悩め": { + "w_type": "conjugated godan verb", + "romaji": "yukinayame" + }, + "行悩も": { + "w_type": "godan verb stem", + "romaji": "yukinayamo" + }, + "行悩んだ": { + "w_type": "conjugated godan verb", + "romaji": "yukinayanda" + }, + "行悩んで": { + "w_type": "conjugated godan verb", + "romaji": "yukinayande" + }, + "楯つか": { + "w_type": "godan verb stem", + "romaji": "tatetsuka" + }, + "楯つき": { + "w_type": "godan verb stem", + "romaji": "tatetsuki" + }, + "楯つけ": { + "w_type": "conjugated godan verb", + "romaji": "tatetsuke" + }, + "楯つこ": { + "w_type": "godan verb stem", + "romaji": "tatetsuko" + }, + "楯ついた": { + "w_type": "conjugated godan verb", + "romaji": "tatetsuita" + }, + "楯ついて": { + "w_type": "conjugated godan verb", + "romaji": "tatetsuite" + }, + "罹ら": { + "w_type": "godan verb stem", + "romaji": "kakara" + }, + "罹り": { + "w_type": "godan verb stem", + "romaji": "kakari" + }, + "罹れ": { + "w_type": "conjugated godan verb", + "romaji": "kakare" + }, + "罹ろ": { + "w_type": "godan verb stem", + "romaji": "kakaro" + }, + "罹った": { + "w_type": "conjugated godan verb", + "romaji": "kakatta" + }, + "罹って": { + "w_type": "conjugated godan verb", + "romaji": "kakatte" + }, + "取扱わ": { + "w_type": "godan verb stem", + "romaji": "toriatsukawa" + }, + "取扱い": { + "w_type": "godan verb stem", + "romaji": "toriatsukai" + }, + "取扱え": { + "w_type": "conjugated godan verb", + "romaji": "toriatsukae" + }, + "取扱お": { + "w_type": "godan verb stem", + "romaji": "toriatsukao" + }, + "取扱った": { + "w_type": "conjugated godan verb", + "romaji": "toriatsukatta" + }, + "取扱って": { + "w_type": "conjugated godan verb", + "romaji": "toriatsukatte" + }, + "留ら": { + "w_type": "godan verb stem", + "romaji": "tomara" + }, + "留り": { + "w_type": "godan verb stem", + "romaji": "tomari" + }, + "留れ": { + "w_type": "conjugated godan verb", + "romaji": "tomare" + }, + "留ろ": { + "w_type": "godan verb stem", + "romaji": "tomaro" + }, + "留った": { + "w_type": "conjugated godan verb", + "romaji": "tomatta" + }, + "留って": { + "w_type": "conjugated godan verb", + "romaji": "tomatte" + }, + "降り立た": { + "w_type": "godan verb stem", + "romaji": "oritata" + }, + "降り立ち": { + "w_type": "godan verb stem", + "romaji": "oritachi" + }, + "降り立て": { + "w_type": "conjugated godan verb", + "romaji": "oritate" + }, + "降り立と": { + "w_type": "godan verb stem", + "romaji": "oritato" + }, + "降り立った": { + "w_type": "conjugated godan verb", + "romaji": "oritatta" + }, + "降り立って": { + "w_type": "conjugated godan verb", + "romaji": "oritatte" + }, + "吊るさ": { + "w_type": "godan verb stem", + "romaji": "tsurusa" + }, + "吊るし": { + "w_type": "godan verb stem", + "romaji": "tsurushi" + }, + "吊るせ": { + "w_type": "conjugated godan verb", + "romaji": "tsuruse" + }, + "吊るそ": { + "w_type": "godan verb stem", + "romaji": "tsuruso" + }, + "吊るした": { + "w_type": "conjugated godan verb", + "romaji": "tsurushita" + }, + "吊るして": { + "w_type": "conjugated godan verb", + "romaji": "tsurushite" + }, + "差し挾ま": { + "w_type": "godan verb stem", + "romaji": "sashihasama" + }, + "差し挾み": { + "w_type": "godan verb stem", + "romaji": "sashihasami" + }, + "差し挾め": { + "w_type": "conjugated godan verb", + "romaji": "sashihasame" + }, + "差し挾も": { + "w_type": "godan verb stem", + "romaji": "sashihasamo" + }, + "差し挾んだ": { + "w_type": "conjugated godan verb", + "romaji": "sashihasanda" + }, + "差し挾んで": { + "w_type": "conjugated godan verb", + "romaji": "sashihasande" + }, + "引きぬか": { + "w_type": "godan verb stem", + "romaji": "hikinuka" + }, + "引きぬき": { + "w_type": "godan verb stem", + "romaji": "hikinuki" + }, + "引きぬけ": { + "w_type": "conjugated godan verb", + "romaji": "hikinuke" + }, + "引きぬこ": { + "w_type": "godan verb stem", + "romaji": "hikinuko" + }, + "引きぬいた": { + "w_type": "conjugated godan verb", + "romaji": "hikinuita" + }, + "引きぬいて": { + "w_type": "conjugated godan verb", + "romaji": "hikinuite" + }, + "喪わ": { + "w_type": "godan verb stem", + "romaji": "ushinawa" + }, + "喪い": { + "w_type": "godan verb stem", + "romaji": "ushinai" + }, + "喪え": { + "w_type": "conjugated godan verb", + "romaji": "ushinae" + }, + "喪お": { + "w_type": "godan verb stem", + "romaji": "ushinao" + }, + "喪った": { + "w_type": "conjugated godan verb", + "romaji": "ushinatta" + }, + "喪って": { + "w_type": "conjugated godan verb", + "romaji": "ushinatte" + }, + "やり出さ": { + "w_type": "godan verb stem", + "romaji": "yaridasa" + }, + "やり出し": { + "w_type": "godan verb stem", + "romaji": "yaridashi" + }, + "やり出せ": { + "w_type": "conjugated godan verb", + "romaji": "yaridase" + }, + "やり出そ": { + "w_type": "godan verb stem", + "romaji": "yaridaso" + }, + "やり出した": { + "w_type": "conjugated godan verb", + "romaji": "yaridashita" + }, + "やり出して": { + "w_type": "conjugated godan verb", + "romaji": "yaridashite" + }, + "採ら": { + "w_type": "godan verb stem", + "romaji": "tora" + }, + "採り": { + "w_type": "godan verb stem", + "romaji": "tori" + }, + "採れ": { + "w_type": "conjugated godan verb", + "romaji": "tore" + }, + "採ろ": { + "w_type": "godan verb stem", + "romaji": "toro" + }, + "採った": { + "w_type": "conjugated godan verb", + "romaji": "totta" + }, + "採って": { + "w_type": "conjugated godan verb", + "romaji": "totte" + }, + "出そろわ": { + "w_type": "godan verb stem", + "romaji": "desorowa" + }, + "出そろい": { + "w_type": "godan verb stem", + "romaji": "desoroi" + }, + "出そろえ": { + "w_type": "conjugated godan verb", + "romaji": "desoroe" + }, + "出そろお": { + "w_type": "godan verb stem", + "romaji": "desoroo" + }, + "出そろった": { + "w_type": "conjugated godan verb", + "romaji": "desorotta" + }, + "出そろって": { + "w_type": "conjugated godan verb", + "romaji": "desorotte" + }, + "食入ら": { + "w_type": "godan verb stem", + "romaji": "kuiira" + }, + "食入り": { + "w_type": "godan verb stem", + "romaji": "kuiiri" + }, + "食入れ": { + "w_type": "conjugated godan verb", + "romaji": "kuiire" + }, + "食入ろ": { + "w_type": "godan verb stem", + "romaji": "kuiiro" + }, + "食入った": { + "w_type": "conjugated godan verb", + "romaji": "kuiitta" + }, + "食入って": { + "w_type": "conjugated godan verb", + "romaji": "kuiitte" + }, + "突きこま": { + "w_type": "godan verb stem", + "romaji": "tsukikoma" + }, + "突きこみ": { + "w_type": "godan verb stem", + "romaji": "tsukikomi" + }, + "突きこめ": { + "w_type": "conjugated godan verb", + "romaji": "tsukikome" + }, + "突きこも": { + "w_type": "godan verb stem", + "romaji": "tsukikomo" + }, + "突きこんだ": { + "w_type": "conjugated godan verb", + "romaji": "tsukikonda" + }, + "突きこんで": { + "w_type": "conjugated godan verb", + "romaji": "tsukikonde" + }, + "闘わ": { + "w_type": "godan verb stem", + "romaji": "tatakawa" + }, + "闘い": { + "w_type": "godan verb stem", + "romaji": "tatakai" + }, + "闘え": { + "w_type": "conjugated godan verb", + "romaji": "tatakae" + }, + "闘お": { + "w_type": "godan verb stem", + "romaji": "tatakao" + }, + "闘った": { + "w_type": "conjugated godan verb", + "romaji": "tatakatta" + }, + "闘って": { + "w_type": "conjugated godan verb", + "romaji": "tatakatte" + }, + "振向か": { + "w_type": "godan verb stem", + "romaji": "furimuka" + }, + "振向き": { + "w_type": "godan verb stem", + "romaji": "furimuki" + }, + "振向け": { + "w_type": "conjugated godan verb", + "romaji": "furimuke" + }, + "振向こ": { + "w_type": "godan verb stem", + "romaji": "furimuko" + }, + "振向いた": { + "w_type": "conjugated godan verb", + "romaji": "furimuita" + }, + "振向いて": { + "w_type": "conjugated godan verb", + "romaji": "furimuite" + }, + "目覚まさ": { + "w_type": "godan verb stem", + "romaji": "mezamasa" + }, + "目覚まし": { + "w_type": "godan verb stem", + "romaji": "mezamashi" + }, + "目覚ませ": { + "w_type": "conjugated godan verb", + "romaji": "mezamase" + }, + "目覚まそ": { + "w_type": "godan verb stem", + "romaji": "mezamaso" + }, + "目覚ました": { + "w_type": "conjugated godan verb", + "romaji": "mezamashita" + }, + "目覚まして": { + "w_type": "conjugated godan verb", + "romaji": "mezamashite" + }, + "飛び上がら": { + "w_type": "godan verb stem", + "romaji": "tobiagara" + }, + "飛び上がり": { + "w_type": "godan verb stem", + "romaji": "tobiagari" + }, + "飛び上がれ": { + "w_type": "conjugated godan verb", + "romaji": "tobiagare" + }, + "飛び上がろ": { + "w_type": "godan verb stem", + "romaji": "tobiagaro" + }, + "飛び上がった": { + "w_type": "conjugated godan verb", + "romaji": "tobiagatta" + }, + "飛び上がって": { + "w_type": "conjugated godan verb", + "romaji": "tobiagatte" + }, + "織り成さ": { + "w_type": "godan verb stem", + "romaji": "orinasa" + }, + "織り成し": { + "w_type": "godan verb stem", + "romaji": "orinashi" + }, + "織り成せ": { + "w_type": "conjugated godan verb", + "romaji": "orinase" + }, + "織り成そ": { + "w_type": "godan verb stem", + "romaji": "orinaso" + }, + "織り成した": { + "w_type": "conjugated godan verb", + "romaji": "orinashita" + }, + "織り成して": { + "w_type": "conjugated godan verb", + "romaji": "orinashite" + }, + "しゃちほこ張ら": { + "w_type": "godan verb stem", + "romaji": "shachihokobara" + }, + "しゃちほこ張り": { + "w_type": "godan verb stem", + "romaji": "shachihokobari" + }, + "しゃちほこ張れ": { + "w_type": "conjugated godan verb", + "romaji": "shachihokobare" + }, + "しゃちほこ張ろ": { + "w_type": "godan verb stem", + "romaji": "shachihokobaro" + }, + "しゃちほこ張った": { + "w_type": "conjugated godan verb", + "romaji": "shachihokobatta" + }, + "しゃちほこ張って": { + "w_type": "conjugated godan verb", + "romaji": "shachihokobatte" + }, + "毛羽立た": { + "w_type": "godan verb stem", + "romaji": "kebadata" + }, + "毛羽立ち": { + "w_type": "godan verb stem", + "romaji": "kebadachi" + }, + "毛羽立て": { + "w_type": "conjugated godan verb", + "romaji": "kebadate" + }, + "毛羽立と": { + "w_type": "godan verb stem", + "romaji": "kebadato" + }, + "毛羽立った": { + "w_type": "conjugated godan verb", + "romaji": "kebadatta" + }, + "毛羽立って": { + "w_type": "conjugated godan verb", + "romaji": "kebadatte" + }, + "ゆで上がら": { + "w_type": "godan verb stem", + "romaji": "yudeagara" + }, + "ゆで上がり": { + "w_type": "godan verb stem", + "romaji": "yudeagari" + }, + "ゆで上がれ": { + "w_type": "conjugated godan verb", + "romaji": "yudeagare" + }, + "ゆで上がろ": { + "w_type": "godan verb stem", + "romaji": "yudeagaro" + }, + "ゆで上がった": { + "w_type": "conjugated godan verb", + "romaji": "yudeagatta" + }, + "ゆで上がって": { + "w_type": "conjugated godan verb", + "romaji": "yudeagatte" + }, + "働か": { + "w_type": "godan verb stem", + "romaji": "hataraka" + }, + "働き": { + "w_type": "godan verb stem", + "romaji": "hataraki" + }, + "働け": { + "w_type": "conjugated godan verb", + "romaji": "hatarake" + }, + "働こ": { + "w_type": "godan verb stem", + "romaji": "hatarako" + }, + "働いた": { + "w_type": "conjugated godan verb", + "romaji": "hataraita" + }, + "働いて": { + "w_type": "conjugated godan verb", + "romaji": "hataraite" + }, + "荘ら": { + "w_type": "godan verb stem", + "romaji": "kazara" + }, + "荘り": { + "w_type": "godan verb stem", + "romaji": "kazari" + }, + "荘れ": { + "w_type": "conjugated godan verb", + "romaji": "kazare" + }, + "荘ろ": { + "w_type": "godan verb stem", + "romaji": "kazaro" + }, + "荘った": { + "w_type": "conjugated godan verb", + "romaji": "kazatta" + }, + "荘って": { + "w_type": "conjugated godan verb", + "romaji": "kazatte" + }, + "先走ら": { + "w_type": "godan verb stem", + "romaji": "sakibashira" + }, + "先走り": { + "w_type": "godan verb stem", + "romaji": "sakibashiri" + }, + "先走れ": { + "w_type": "conjugated godan verb", + "romaji": "sakibashire" + }, + "先走ろ": { + "w_type": "godan verb stem", + "romaji": "sakibashiro" + }, + "先走った": { + "w_type": "conjugated godan verb", + "romaji": "sakibashitta" + }, + "先走って": { + "w_type": "conjugated godan verb", + "romaji": "sakibashitte" + }, + "怯ま": { + "w_type": "godan verb stem", + "romaji": "hiruma" + }, + "怯み": { + "w_type": "godan verb stem", + "romaji": "hirumi" + }, + "怯め": { + "w_type": "conjugated godan verb", + "romaji": "hirume" + }, + "怯も": { + "w_type": "godan verb stem", + "romaji": "hirumo" + }, + "怯んだ": { + "w_type": "conjugated godan verb", + "romaji": "hirunda" + }, + "怯んで": { + "w_type": "conjugated godan verb", + "romaji": "hirunde" + }, + "固まら": { + "w_type": "godan verb stem", + "romaji": "katamara" + }, + "固まり": { + "w_type": "godan verb stem", + "romaji": "katamari" + }, + "固まれ": { + "w_type": "conjugated godan verb", + "romaji": "katamare" + }, + "固まろ": { + "w_type": "godan verb stem", + "romaji": "katamaro" + }, + "固まった": { + "w_type": "conjugated godan verb", + "romaji": "katamatta" + }, + "固まって": { + "w_type": "conjugated godan verb", + "romaji": "katamatte" + }, + "逃げ惑わ": { + "w_type": "godan verb stem", + "romaji": "nigemadowa" + }, + "逃げ惑い": { + "w_type": "godan verb stem", + "romaji": "nigemadoi" + }, + "逃げ惑え": { + "w_type": "conjugated godan verb", + "romaji": "nigemadoe" + }, + "逃げ惑お": { + "w_type": "godan verb stem", + "romaji": "nigemadoo" + }, + "逃げ惑った": { + "w_type": "conjugated godan verb", + "romaji": "nigemadotta" + }, + "逃げ惑って": { + "w_type": "conjugated godan verb", + "romaji": "nigemadotte" + }, + "透徹さ": { + "w_type": "godan verb stem", + "romaji": "sukitoosa" + }, + "透徹し": { + "w_type": "godan verb stem", + "romaji": "sukitooshi" + }, + "透徹せ": { + "w_type": "conjugated godan verb", + "romaji": "sukitoose" + }, + "透徹そ": { + "w_type": "godan verb stem", + "romaji": "sukitooso" + }, + "透徹した": { + "w_type": "conjugated godan verb", + "romaji": "sukitooshita" + }, + "透徹して": { + "w_type": "conjugated godan verb", + "romaji": "sukitooshite" + }, + "輝き渡ら": { + "w_type": "godan verb stem", + "romaji": "kagayakiwatara" + }, + "輝き渡り": { + "w_type": "godan verb stem", + "romaji": "kagayakiwatari" + }, + "輝き渡れ": { + "w_type": "conjugated godan verb", + "romaji": "kagayakiwatare" + }, + "輝き渡ろ": { + "w_type": "godan verb stem", + "romaji": "kagayakiwataro" + }, + "輝き渡った": { + "w_type": "conjugated godan verb", + "romaji": "kagayakiwatatta" + }, + "輝き渡って": { + "w_type": "conjugated godan verb", + "romaji": "kagayakiwatatte" + }, + "泊り込ま": { + "w_type": "godan verb stem", + "romaji": "tomarikoma" + }, + "泊り込み": { + "w_type": "godan verb stem", + "romaji": "tomarikomi" + }, + "泊り込め": { + "w_type": "conjugated godan verb", + "romaji": "tomarikome" + }, + "泊り込も": { + "w_type": "godan verb stem", + "romaji": "tomarikomo" + }, + "泊り込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tomarikonda" + }, + "泊り込んで": { + "w_type": "conjugated godan verb", + "romaji": "tomarikonde" + }, + "毒突か": { + "w_type": "godan verb stem", + "romaji": "dokuzuka" + }, + "毒突き": { + "w_type": "godan verb stem", + "romaji": "dokuzuki" + }, + "毒突け": { + "w_type": "conjugated godan verb", + "romaji": "dokuzuke" + }, + "毒突こ": { + "w_type": "godan verb stem", + "romaji": "dokuzuko" + }, + "毒突いた": { + "w_type": "conjugated godan verb", + "romaji": "dokuzuita" + }, + "毒突いて": { + "w_type": "conjugated godan verb", + "romaji": "dokuzuite" + }, + "書き送ら": { + "w_type": "godan verb stem", + "romaji": "kakiokura" + }, + "書き送り": { + "w_type": "godan verb stem", + "romaji": "kakiokuri" + }, + "書き送れ": { + "w_type": "conjugated godan verb", + "romaji": "kakiokure" + }, + "書き送ろ": { + "w_type": "godan verb stem", + "romaji": "kakiokuro" + }, + "書き送った": { + "w_type": "conjugated godan verb", + "romaji": "kakiokutta" + }, + "書き送って": { + "w_type": "conjugated godan verb", + "romaji": "kakiokutte" + }, + "仕舞わ": { + "w_type": "godan verb stem", + "romaji": "shimawa" + }, + "仕舞い": { + "w_type": "godan verb stem", + "romaji": "shimai" + }, + "仕舞え": { + "w_type": "conjugated godan verb", + "romaji": "shimae" + }, + "仕舞お": { + "w_type": "godan verb stem", + "romaji": "shimao" + }, + "仕舞った": { + "w_type": "conjugated godan verb", + "romaji": "shimatta" + }, + "仕舞って": { + "w_type": "conjugated godan verb", + "romaji": "shimatte" + }, + "もたれ掛から": { + "w_type": "godan verb stem", + "romaji": "motarekakara" + }, + "もたれ掛かり": { + "w_type": "godan verb stem", + "romaji": "motarekakari" + }, + "もたれ掛かれ": { + "w_type": "conjugated godan verb", + "romaji": "motarekakare" + }, + "もたれ掛かろ": { + "w_type": "godan verb stem", + "romaji": "motarekakaro" + }, + "もたれ掛かった": { + "w_type": "conjugated godan verb", + "romaji": "motarekakatta" + }, + "もたれ掛かって": { + "w_type": "conjugated godan verb", + "romaji": "motarekakatte" + }, + "篭ま": { + "w_type": "godan verb stem", + "romaji": "koma" + }, + "篭み": { + "w_type": "godan verb stem", + "romaji": "komi" + }, + "篭め": { + "w_type": "conjugated godan verb", + "romaji": "kome" + }, + "篭も": { + "w_type": "godan verb stem", + "romaji": "komo" + }, + "篭んだ": { + "w_type": "conjugated godan verb", + "romaji": "konda" + }, + "篭んで": { + "w_type": "conjugated godan verb", + "romaji": "konde" + }, + "荒らし回ら": { + "w_type": "godan verb stem", + "romaji": "arashimawara" + }, + "荒らし回り": { + "w_type": "godan verb stem", + "romaji": "arashimawari" + }, + "荒らし回れ": { + "w_type": "conjugated godan verb", + "romaji": "arashimaware" + }, + "荒らし回ろ": { + "w_type": "godan verb stem", + "romaji": "arashimawaro" + }, + "荒らし回った": { + "w_type": "conjugated godan verb", + "romaji": "arashimawatta" + }, + "荒らし回って": { + "w_type": "conjugated godan verb", + "romaji": "arashimawatte" + }, + "捜し回ら": { + "w_type": "godan verb stem", + "romaji": "sagashimawara" + }, + "捜し回り": { + "w_type": "godan verb stem", + "romaji": "sagashimawari" + }, + "捜し回れ": { + "w_type": "conjugated godan verb", + "romaji": "sagashimaware" + }, + "捜し回ろ": { + "w_type": "godan verb stem", + "romaji": "sagashimawaro" + }, + "捜し回った": { + "w_type": "conjugated godan verb", + "romaji": "sagashimawatta" + }, + "捜し回って": { + "w_type": "conjugated godan verb", + "romaji": "sagashimawatte" + }, + "天降ら": { + "w_type": "godan verb stem", + "romaji": "amakudara" + }, + "天降り": { + "w_type": "godan verb stem", + "romaji": "amakudari" + }, + "天降れ": { + "w_type": "conjugated godan verb", + "romaji": "amakudare" + }, + "天降ろ": { + "w_type": "godan verb stem", + "romaji": "amakudaro" + }, + "天降った": { + "w_type": "conjugated godan verb", + "romaji": "amakudatta" + }, + "天降って": { + "w_type": "conjugated godan verb", + "romaji": "amakudatte" + }, + "遜ら": { + "w_type": "godan verb stem", + "romaji": "herikudara" + }, + "遜り": { + "w_type": "godan verb stem", + "romaji": "herikudari" + }, + "遜れ": { + "w_type": "conjugated godan verb", + "romaji": "herikudare" + }, + "遜ろ": { + "w_type": "godan verb stem", + "romaji": "herikudaro" + }, + "遜った": { + "w_type": "conjugated godan verb", + "romaji": "herikudatta" + }, + "遜って": { + "w_type": "conjugated godan verb", + "romaji": "herikudatte" + }, + "炊上ら": { + "w_type": "godan verb stem", + "romaji": "takiagara" + }, + "炊上り": { + "w_type": "godan verb stem", + "romaji": "takiagari" + }, + "炊上れ": { + "w_type": "conjugated godan verb", + "romaji": "takiagare" + }, + "炊上ろ": { + "w_type": "godan verb stem", + "romaji": "takiagaro" + }, + "炊上った": { + "w_type": "conjugated godan verb", + "romaji": "takiagatta" + }, + "炊上って": { + "w_type": "conjugated godan verb", + "romaji": "takiagatte" + }, + "組み敷か": { + "w_type": "godan verb stem", + "romaji": "kumishika" + }, + "組み敷き": { + "w_type": "godan verb stem", + "romaji": "kumishiki" + }, + "組み敷け": { + "w_type": "conjugated godan verb", + "romaji": "kumishike" + }, + "組み敷こ": { + "w_type": "godan verb stem", + "romaji": "kumishiko" + }, + "組み敷いた": { + "w_type": "conjugated godan verb", + "romaji": "kumishiita" + }, + "組み敷いて": { + "w_type": "conjugated godan verb", + "romaji": "kumishiite" + }, + "覚込ま": { + "w_type": "godan verb stem", + "romaji": "oboekoma" + }, + "覚込み": { + "w_type": "godan verb stem", + "romaji": "oboekomi" + }, + "覚込め": { + "w_type": "conjugated godan verb", + "romaji": "oboekome" + }, + "覚込も": { + "w_type": "godan verb stem", + "romaji": "oboekomo" + }, + "覚込んだ": { + "w_type": "conjugated godan verb", + "romaji": "oboekonda" + }, + "覚込んで": { + "w_type": "conjugated godan verb", + "romaji": "oboekonde" + }, + "補わ": { + "w_type": "godan verb stem", + "romaji": "oginawa" + }, + "補い": { + "w_type": "godan verb stem", + "romaji": "oginai" + }, + "補え": { + "w_type": "conjugated godan verb", + "romaji": "oginae" + }, + "補お": { + "w_type": "godan verb stem", + "romaji": "oginao" + }, + "補った": { + "w_type": "conjugated godan verb", + "romaji": "oginatta" + }, + "補って": { + "w_type": "conjugated godan verb", + "romaji": "oginatte" + }, + "跳ね返ら": { + "w_type": "godan verb stem", + "romaji": "hanekaera" + }, + "跳ね返り": { + "w_type": "godan verb stem", + "romaji": "hanekaeri" + }, + "跳ね返れ": { + "w_type": "conjugated godan verb", + "romaji": "hanekaere" + }, + "跳ね返ろ": { + "w_type": "godan verb stem", + "romaji": "hanekaero" + }, + "跳ね返った": { + "w_type": "conjugated godan verb", + "romaji": "hanekaetta" + }, + "跳ね返って": { + "w_type": "conjugated godan verb", + "romaji": "hanekaette" + }, + "鬻が": { + "w_type": "godan verb stem", + "romaji": "hisaga" + }, + "鬻ぎ": { + "w_type": "godan verb stem", + "romaji": "hisagi" + }, + "鬻げ": { + "w_type": "conjugated godan verb", + "romaji": "hisage" + }, + "鬻ご": { + "w_type": "godan verb stem", + "romaji": "hisago" + }, + "鬻いだ": { + "w_type": "conjugated godan verb", + "romaji": "hisaida" + }, + "鬻いで": { + "w_type": "conjugated godan verb", + "romaji": "hisaide" + }, + "ほっつき歩か": { + "w_type": "godan verb stem", + "romaji": "hottsukiaruka" + }, + "ほっつき歩き": { + "w_type": "godan verb stem", + "romaji": "hottsukiaruki" + }, + "ほっつき歩け": { + "w_type": "conjugated godan verb", + "romaji": "hottsukiaruke" + }, + "ほっつき歩こ": { + "w_type": "godan verb stem", + "romaji": "hottsukiaruko" + }, + "ほっつき歩いた": { + "w_type": "conjugated godan verb", + "romaji": "hottsukiaruita" + }, + "ほっつき歩いて": { + "w_type": "conjugated godan verb", + "romaji": "hottsukiaruite" + }, + "倚ら": { + "w_type": "godan verb stem", + "romaji": "yora" + }, + "倚り": { + "w_type": "godan verb stem", + "romaji": "yori" + }, + "倚れ": { + "w_type": "conjugated godan verb", + "romaji": "yore" + }, + "倚ろ": { + "w_type": "godan verb stem", + "romaji": "yoro" + }, + "倚った": { + "w_type": "conjugated godan verb", + "romaji": "yotta" + }, + "倚って": { + "w_type": "conjugated godan verb", + "romaji": "yotte" + }, + "起ち上がら": { + "w_type": "godan verb stem", + "romaji": "tachiagara" + }, + "起ち上がり": { + "w_type": "godan verb stem", + "romaji": "tachiagari" + }, + "起ち上がれ": { + "w_type": "conjugated godan verb", + "romaji": "tachiagare" + }, + "起ち上がろ": { + "w_type": "godan verb stem", + "romaji": "tachiagaro" + }, + "起ち上がった": { + "w_type": "conjugated godan verb", + "romaji": "tachiagatta" + }, + "起ち上がって": { + "w_type": "conjugated godan verb", + "romaji": "tachiagatte" + }, + "つけ入ら": { + "w_type": "godan verb stem", + "romaji": "tsukeira" + }, + "つけ入り": { + "w_type": "godan verb stem", + "romaji": "tsukeiri" + }, + "つけ入れ": { + "w_type": "conjugated godan verb", + "romaji": "tsukeire" + }, + "つけ入ろ": { + "w_type": "godan verb stem", + "romaji": "tsukeiro" + }, + "つけ入った": { + "w_type": "conjugated godan verb", + "romaji": "tsukeitta" + }, + "つけ入って": { + "w_type": "conjugated godan verb", + "romaji": "tsukeitte" + }, + "和らが": { + "w_type": "godan verb stem", + "romaji": "yawaraga" + }, + "和らぎ": { + "w_type": "godan verb stem", + "romaji": "yawaragi" + }, + "和らげ": { + "w_type": "conjugated godan verb", + "romaji": "yawarage" + }, + "和らご": { + "w_type": "godan verb stem", + "romaji": "yawarago" + }, + "和らいだ": { + "w_type": "conjugated godan verb", + "romaji": "yawaraida" + }, + "和らいで": { + "w_type": "conjugated godan verb", + "romaji": "yawaraide" + }, + "当てこすら": { + "w_type": "godan verb stem", + "romaji": "atekosura" + }, + "当てこすり": { + "w_type": "godan verb stem", + "romaji": "atekosuri" + }, + "当てこすれ": { + "w_type": "conjugated godan verb", + "romaji": "atekosure" + }, + "当てこすろ": { + "w_type": "godan verb stem", + "romaji": "atekosuro" + }, + "当てこすった": { + "w_type": "conjugated godan verb", + "romaji": "atekosutta" + }, + "当てこすって": { + "w_type": "conjugated godan verb", + "romaji": "atekosutte" + }, + "威かさ": { + "w_type": "godan verb stem", + "romaji": "odokasa" + }, + "威かし": { + "w_type": "godan verb stem", + "romaji": "odokashi" + }, + "威かせ": { + "w_type": "conjugated godan verb", + "romaji": "odokase" + }, + "威かそ": { + "w_type": "godan verb stem", + "romaji": "odokaso" + }, + "威かした": { + "w_type": "conjugated godan verb", + "romaji": "odokashita" + }, + "威かして": { + "w_type": "conjugated godan verb", + "romaji": "odokashite" + }, + "跳ね返さ": { + "w_type": "godan verb stem", + "romaji": "hanekaesa" + }, + "跳ね返し": { + "w_type": "godan verb stem", + "romaji": "hanekaeshi" + }, + "跳ね返せ": { + "w_type": "conjugated godan verb", + "romaji": "hanekaese" + }, + "跳ね返そ": { + "w_type": "godan verb stem", + "romaji": "hanekaeso" + }, + "跳ね返した": { + "w_type": "conjugated godan verb", + "romaji": "hanekaeshita" + }, + "跳ね返して": { + "w_type": "conjugated godan verb", + "romaji": "hanekaeshite" + }, + "妬か": { + "w_type": "godan verb stem", + "romaji": "yaka" + }, + "妬き": { + "w_type": "godan verb stem", + "romaji": "yaki" + }, + "妬け": { + "w_type": "conjugated godan verb", + "romaji": "yake" + }, + "妬こ": { + "w_type": "godan verb stem", + "romaji": "yako" + }, + "妬いた": { + "w_type": "conjugated godan verb", + "romaji": "yaita" + }, + "妬いて": { + "w_type": "conjugated godan verb", + "romaji": "yaite" + }, + "そっぽを向か": { + "w_type": "godan verb stem", + "romaji": "soppo wo muka" + }, + "そっぽを向き": { + "w_type": "godan verb stem", + "romaji": "soppo wo muki" + }, + "そっぽを向け": { + "w_type": "conjugated godan verb", + "romaji": "soppo wo muke" + }, + "そっぽを向こ": { + "w_type": "godan verb stem", + "romaji": "soppo wo muko" + }, + "そっぽを向いた": { + "w_type": "conjugated godan verb", + "romaji": "soppo wo muita" + }, + "そっぽを向いて": { + "w_type": "conjugated godan verb", + "romaji": "soppo wo muite" + }, + "切り出さ": { + "w_type": "godan verb stem", + "romaji": "kiridasa" + }, + "切り出し": { + "w_type": "godan verb stem", + "romaji": "kiridashi" + }, + "切り出せ": { + "w_type": "conjugated godan verb", + "romaji": "kiridase" + }, + "切り出そ": { + "w_type": "godan verb stem", + "romaji": "kiridaso" + }, + "切り出した": { + "w_type": "conjugated godan verb", + "romaji": "kiridashita" + }, + "切り出して": { + "w_type": "conjugated godan verb", + "romaji": "kiridashite" + }, + "読み終わら": { + "w_type": "godan verb stem", + "romaji": "yomiowara" + }, + "読み終わり": { + "w_type": "godan verb stem", + "romaji": "yomiowari" + }, + "読み終われ": { + "w_type": "conjugated godan verb", + "romaji": "yomioware" + }, + "読み終わろ": { + "w_type": "godan verb stem", + "romaji": "yomiowaro" + }, + "読み終わった": { + "w_type": "conjugated godan verb", + "romaji": "yomiowatta" + }, + "読み終わって": { + "w_type": "conjugated godan verb", + "romaji": "yomiowatte" + }, + "行き着か": { + "w_type": "godan verb stem", + "romaji": "yukitsuka" + }, + "行き着き": { + "w_type": "godan verb stem", + "romaji": "yukitsuki" + }, + "行き着け": { + "w_type": "conjugated godan verb", + "romaji": "yukitsuke" + }, + "行き着こ": { + "w_type": "godan verb stem", + "romaji": "yukitsuko" + }, + "行き着いた": { + "w_type": "conjugated godan verb", + "romaji": "yukitsuita" + }, + "行き着いて": { + "w_type": "conjugated godan verb", + "romaji": "yukitsuite" + }, + "吐散らさ": { + "w_type": "godan verb stem", + "romaji": "hakichirasa" + }, + "吐散らし": { + "w_type": "godan verb stem", + "romaji": "hakichirashi" + }, + "吐散らせ": { + "w_type": "conjugated godan verb", + "romaji": "hakichirase" + }, + "吐散らそ": { + "w_type": "godan verb stem", + "romaji": "hakichiraso" + }, + "吐散らした": { + "w_type": "conjugated godan verb", + "romaji": "hakichirashita" + }, + "吐散らして": { + "w_type": "conjugated godan verb", + "romaji": "hakichirashite" + }, + "咳か": { + "w_type": "godan verb stem", + "romaji": "shiwabuka" + }, + "咳き": { + "w_type": "godan verb stem", + "romaji": "shiwabuki" + }, + "咳け": { + "w_type": "conjugated godan verb", + "romaji": "shiwabuke" + }, + "咳こ": { + "w_type": "godan verb stem", + "romaji": "shiwabuko" + }, + "咳いた": { + "w_type": "conjugated godan verb", + "romaji": "shiwabuita" + }, + "咳いて": { + "w_type": "conjugated godan verb", + "romaji": "shiwabuite" + }, + "取りなおさ": { + "w_type": "godan verb stem", + "romaji": "torinaosa" + }, + "取りなおし": { + "w_type": "godan verb stem", + "romaji": "torinaoshi" + }, + "取りなおせ": { + "w_type": "conjugated godan verb", + "romaji": "torinaose" + }, + "取りなおそ": { + "w_type": "godan verb stem", + "romaji": "torinaoso" + }, + "取りなおした": { + "w_type": "conjugated godan verb", + "romaji": "torinaoshita" + }, + "取りなおして": { + "w_type": "conjugated godan verb", + "romaji": "torinaoshite" + }, + "先細ら": { + "w_type": "godan verb stem", + "romaji": "sakibosora" + }, + "先細り": { + "w_type": "godan verb stem", + "romaji": "sakibosori" + }, + "先細れ": { + "w_type": "conjugated godan verb", + "romaji": "sakibosore" + }, + "先細ろ": { + "w_type": "godan verb stem", + "romaji": "sakibosoro" + }, + "先細った": { + "w_type": "conjugated godan verb", + "romaji": "sakibosotta" + }, + "先細って": { + "w_type": "conjugated godan verb", + "romaji": "sakibosotte" + }, + "噎せ返ら": { + "w_type": "godan verb stem", + "romaji": "musekaera" + }, + "噎せ返り": { + "w_type": "godan verb stem", + "romaji": "musekaeri" + }, + "噎せ返れ": { + "w_type": "conjugated godan verb", + "romaji": "musekaere" + }, + "噎せ返ろ": { + "w_type": "godan verb stem", + "romaji": "musekaero" + }, + "噎せ返った": { + "w_type": "conjugated godan verb", + "romaji": "musekaetta" + }, + "噎せ返って": { + "w_type": "conjugated godan verb", + "romaji": "musekaette" + }, + "奏さ": { + "w_type": "godan verb stem", + "romaji": "sousa" + }, + "奏し": { + "w_type": "godan verb stem", + "romaji": "soushi" + }, + "奏せ": { + "w_type": "conjugated godan verb", + "romaji": "souse" + }, + "奏そ": { + "w_type": "godan verb stem", + "romaji": "souso" + }, + "奏した": { + "w_type": "conjugated godan verb", + "romaji": "soushita" + }, + "奏して": { + "w_type": "conjugated godan verb", + "romaji": "soushite" + }, + "感情にはしら": { + "w_type": "godan verb stem", + "romaji": "kanjounihashira" + }, + "感情にはしり": { + "w_type": "godan verb stem", + "romaji": "kanjounihashiri" + }, + "感情にはしれ": { + "w_type": "conjugated godan verb", + "romaji": "kanjounihashire" + }, + "感情にはしろ": { + "w_type": "godan verb stem", + "romaji": "kanjounihashiro" + }, + "感情にはしった": { + "w_type": "conjugated godan verb", + "romaji": "kanjounihashitta" + }, + "感情にはしって": { + "w_type": "conjugated godan verb", + "romaji": "kanjounihashitte" + }, + "まつわり付か": { + "w_type": "godan verb stem", + "romaji": "matowaritsuka" + }, + "まつわり付き": { + "w_type": "godan verb stem", + "romaji": "matowaritsuki" + }, + "まつわり付け": { + "w_type": "conjugated godan verb", + "romaji": "matowaritsuke" + }, + "まつわり付こ": { + "w_type": "godan verb stem", + "romaji": "matowaritsuko" + }, + "まつわり付いた": { + "w_type": "conjugated godan verb", + "romaji": "matowaritsuita" + }, + "まつわり付いて": { + "w_type": "conjugated godan verb", + "romaji": "matowaritsuite" + }, + "組織立た": { + "w_type": "godan verb stem", + "romaji": "soshikidata" + }, + "組織立ち": { + "w_type": "godan verb stem", + "romaji": "soshikidachi" + }, + "組織立て": { + "w_type": "conjugated godan verb", + "romaji": "soshikidate" + }, + "組織立と": { + "w_type": "godan verb stem", + "romaji": "soshikidato" + }, + "組織立った": { + "w_type": "conjugated godan verb", + "romaji": "soshikidatta" + }, + "組織立って": { + "w_type": "conjugated godan verb", + "romaji": "soshikidatte" + }, + "洗い出さ": { + "w_type": "godan verb stem", + "romaji": "araidasa" + }, + "洗い出し": { + "w_type": "godan verb stem", + "romaji": "araidashi" + }, + "洗い出せ": { + "w_type": "conjugated godan verb", + "romaji": "araidase" + }, + "洗い出そ": { + "w_type": "godan verb stem", + "romaji": "araidaso" + }, + "洗い出した": { + "w_type": "conjugated godan verb", + "romaji": "araidashita" + }, + "洗い出して": { + "w_type": "conjugated godan verb", + "romaji": "araidashite" + }, + "書き落さ": { + "w_type": "godan verb stem", + "romaji": "kakiotosa" + }, + "書き落し": { + "w_type": "godan verb stem", + "romaji": "kakiotoshi" + }, + "書き落せ": { + "w_type": "conjugated godan verb", + "romaji": "kakiotose" + }, + "書き落そ": { + "w_type": "godan verb stem", + "romaji": "kakiotoso" + }, + "書き落した": { + "w_type": "conjugated godan verb", + "romaji": "kakiotoshita" + }, + "書き落して": { + "w_type": "conjugated godan verb", + "romaji": "kakiotoshite" + }, + "跳ね飛ばさ": { + "w_type": "godan verb stem", + "romaji": "hanetobasa" + }, + "跳ね飛ばし": { + "w_type": "godan verb stem", + "romaji": "hanetobashi" + }, + "跳ね飛ばせ": { + "w_type": "conjugated godan verb", + "romaji": "hanetobase" + }, + "跳ね飛ばそ": { + "w_type": "godan verb stem", + "romaji": "hanetobaso" + }, + "跳ね飛ばした": { + "w_type": "conjugated godan verb", + "romaji": "hanetobashita" + }, + "跳ね飛ばして": { + "w_type": "conjugated godan verb", + "romaji": "hanetobashite" + }, + "うち続か": { + "w_type": "godan verb stem", + "romaji": "uchitsuzuka" + }, + "うち続き": { + "w_type": "godan verb stem", + "romaji": "uchitsuzuki" + }, + "うち続け": { + "w_type": "conjugated godan verb", + "romaji": "uchitsuzuke" + }, + "うち続こ": { + "w_type": "godan verb stem", + "romaji": "uchitsuzuko" + }, + "うち続いた": { + "w_type": "conjugated godan verb", + "romaji": "uchitsuzuita" + }, + "うち続いて": { + "w_type": "conjugated godan verb", + "romaji": "uchitsuzuite" + }, + "出し惜しま": { + "w_type": "godan verb stem", + "romaji": "dashioshima" + }, + "出し惜しみ": { + "w_type": "godan verb stem", + "romaji": "dashioshimi" + }, + "出し惜しめ": { + "w_type": "conjugated godan verb", + "romaji": "dashioshime" + }, + "出し惜しも": { + "w_type": "godan verb stem", + "romaji": "dashioshimo" + }, + "出し惜しんだ": { + "w_type": "conjugated godan verb", + "romaji": "dashioshinda" + }, + "出し惜しんで": { + "w_type": "conjugated godan verb", + "romaji": "dashioshinde" + }, + "進ま": { + "w_type": "godan verb stem", + "romaji": "susuma" + }, + "進み": { + "w_type": "godan verb stem", + "romaji": "susumi" + }, + "進め": { + "w_type": "conjugated godan verb", + "romaji": "susume" + }, + "進も": { + "w_type": "godan verb stem", + "romaji": "susumo" + }, + "進んだ": { + "w_type": "conjugated godan verb", + "romaji": "susunda" + }, + "進んで": { + "w_type": "conjugated godan verb", + "romaji": "susunde" + }, + "入り組ま": { + "w_type": "godan verb stem", + "romaji": "irikuma" + }, + "入り組み": { + "w_type": "godan verb stem", + "romaji": "irikumi" + }, + "入り組め": { + "w_type": "conjugated godan verb", + "romaji": "irikume" + }, + "入り組も": { + "w_type": "godan verb stem", + "romaji": "irikumo" + }, + "入り組んだ": { + "w_type": "conjugated godan verb", + "romaji": "irikunda" + }, + "入り組んで": { + "w_type": "conjugated godan verb", + "romaji": "irikunde" + }, + "和ま": { + "w_type": "godan verb stem", + "romaji": "nagoma" + }, + "和み": { + "w_type": "godan verb stem", + "romaji": "nagomi" + }, + "和め": { + "w_type": "conjugated godan verb", + "romaji": "nagome" + }, + "和も": { + "w_type": "godan verb stem", + "romaji": "nagomo" + }, + "和んだ": { + "w_type": "conjugated godan verb", + "romaji": "nagonda" + }, + "和んで": { + "w_type": "conjugated godan verb", + "romaji": "nagonde" + }, + "推し測ら": { + "w_type": "godan verb stem", + "romaji": "oshihakara" + }, + "推し測り": { + "w_type": "godan verb stem", + "romaji": "oshihakari" + }, + "推し測れ": { + "w_type": "conjugated godan verb", + "romaji": "oshihakare" + }, + "推し測ろ": { + "w_type": "godan verb stem", + "romaji": "oshihakaro" + }, + "推し測った": { + "w_type": "conjugated godan verb", + "romaji": "oshihakatta" + }, + "推し測って": { + "w_type": "conjugated godan verb", + "romaji": "oshihakatte" + }, + "拗ら": { + "w_type": "godan verb stem", + "romaji": "nejira" + }, + "拗り": { + "w_type": "godan verb stem", + "romaji": "nejiri" + }, + "拗れ": { + "w_type": "conjugated godan verb", + "romaji": "nejire" + }, + "拗ろ": { + "w_type": "godan verb stem", + "romaji": "nejiro" + }, + "拗った": { + "w_type": "conjugated godan verb", + "romaji": "nejitta" + }, + "拗って": { + "w_type": "conjugated godan verb", + "romaji": "nejitte" + }, + "刷り上がら": { + "w_type": "godan verb stem", + "romaji": "suriagara" + }, + "刷り上がり": { + "w_type": "godan verb stem", + "romaji": "suriagari" + }, + "刷り上がれ": { + "w_type": "conjugated godan verb", + "romaji": "suriagare" + }, + "刷り上がろ": { + "w_type": "godan verb stem", + "romaji": "suriagaro" + }, + "刷り上がった": { + "w_type": "conjugated godan verb", + "romaji": "suriagatta" + }, + "刷り上がって": { + "w_type": "conjugated godan verb", + "romaji": "suriagatte" + }, + "熟さ": { + "w_type": "godan verb stem", + "romaji": "konasa" + }, + "熟し": { + "w_type": "godan verb stem", + "romaji": "konashi" + }, + "熟せ": { + "w_type": "conjugated godan verb", + "romaji": "konase" + }, + "熟そ": { + "w_type": "godan verb stem", + "romaji": "konaso" + }, + "熟した": { + "w_type": "conjugated godan verb", + "romaji": "konashita" + }, + "熟して": { + "w_type": "conjugated godan verb", + "romaji": "konashite" + }, + "取り残さ": { + "w_type": "godan verb stem", + "romaji": "torinokosa" + }, + "取り残し": { + "w_type": "godan verb stem", + "romaji": "torinokoshi" + }, + "取り残せ": { + "w_type": "conjugated godan verb", + "romaji": "torinokose" + }, + "取り残そ": { + "w_type": "godan verb stem", + "romaji": "torinokoso" + }, + "取り残した": { + "w_type": "conjugated godan verb", + "romaji": "torinokoshita" + }, + "取り残して": { + "w_type": "conjugated godan verb", + "romaji": "torinokoshite" + }, + "見舞わ": { + "w_type": "godan verb stem", + "romaji": "mimawa" + }, + "見舞い": { + "w_type": "godan verb stem", + "romaji": "mimai" + }, + "見舞え": { + "w_type": "conjugated godan verb", + "romaji": "mimae" + }, + "見舞お": { + "w_type": "godan verb stem", + "romaji": "mimao" + }, + "見舞った": { + "w_type": "conjugated godan verb", + "romaji": "mimatta" + }, + "見舞って": { + "w_type": "conjugated godan verb", + "romaji": "mimatte" + }, + "撃ち払わ": { + "w_type": "godan verb stem", + "romaji": "uchiharawa" + }, + "撃ち払い": { + "w_type": "godan verb stem", + "romaji": "uchiharai" + }, + "撃ち払え": { + "w_type": "conjugated godan verb", + "romaji": "uchiharae" + }, + "撃ち払お": { + "w_type": "godan verb stem", + "romaji": "uchiharao" + }, + "撃ち払った": { + "w_type": "conjugated godan verb", + "romaji": "uchiharatta" + }, + "撃ち払って": { + "w_type": "conjugated godan verb", + "romaji": "uchiharatte" + }, + "つり合わ": { + "w_type": "godan verb stem", + "romaji": "tsuriawa" + }, + "つり合い": { + "w_type": "godan verb stem", + "romaji": "tsuriai" + }, + "つり合え": { + "w_type": "conjugated godan verb", + "romaji": "tsuriae" + }, + "つり合お": { + "w_type": "godan verb stem", + "romaji": "tsuriao" + }, + "つり合った": { + "w_type": "conjugated godan verb", + "romaji": "tsuriatta" + }, + "つり合って": { + "w_type": "conjugated godan verb", + "romaji": "tsuriatte" + }, + "込みあわ": { + "w_type": "godan verb stem", + "romaji": "komiawa" + }, + "込みあい": { + "w_type": "godan verb stem", + "romaji": "komiai" + }, + "込みあえ": { + "w_type": "conjugated godan verb", + "romaji": "komiae" + }, + "込みあお": { + "w_type": "godan verb stem", + "romaji": "komiao" + }, + "込みあった": { + "w_type": "conjugated godan verb", + "romaji": "komiatta" + }, + "込みあって": { + "w_type": "conjugated godan verb", + "romaji": "komiatte" + }, + "卸さ": { + "w_type": "godan verb stem", + "romaji": "orosa" + }, + "卸し": { + "w_type": "godan verb stem", + "romaji": "oroshi" + }, + "卸せ": { + "w_type": "conjugated godan verb", + "romaji": "orose" + }, + "卸そ": { + "w_type": "godan verb stem", + "romaji": "oroso" + }, + "卸した": { + "w_type": "conjugated godan verb", + "romaji": "oroshita" + }, + "卸して": { + "w_type": "conjugated godan verb", + "romaji": "oroshite" + }, + "ひた走ら": { + "w_type": "godan verb stem", + "romaji": "hitahashira" + }, + "ひた走り": { + "w_type": "godan verb stem", + "romaji": "hitahashiri" + }, + "ひた走れ": { + "w_type": "conjugated godan verb", + "romaji": "hitahashire" + }, + "ひた走ろ": { + "w_type": "godan verb stem", + "romaji": "hitahashiro" + }, + "ひた走った": { + "w_type": "conjugated godan verb", + "romaji": "hitahashitta" + }, + "ひた走って": { + "w_type": "conjugated godan verb", + "romaji": "hitahashitte" + }, + "見過さ": { + "w_type": "godan verb stem", + "romaji": "misugosa" + }, + "見過し": { + "w_type": "godan verb stem", + "romaji": "misugoshi" + }, + "見過せ": { + "w_type": "conjugated godan verb", + "romaji": "misugose" + }, + "見過そ": { + "w_type": "godan verb stem", + "romaji": "misugoso" + }, + "見過した": { + "w_type": "conjugated godan verb", + "romaji": "misugoshita" + }, + "見過して": { + "w_type": "conjugated godan verb", + "romaji": "misugoshite" + }, + "狩出さ": { + "w_type": "godan verb stem", + "romaji": "karidasa" + }, + "狩出し": { + "w_type": "godan verb stem", + "romaji": "karidashi" + }, + "狩出せ": { + "w_type": "conjugated godan verb", + "romaji": "karidase" + }, + "狩出そ": { + "w_type": "godan verb stem", + "romaji": "karidaso" + }, + "狩出した": { + "w_type": "conjugated godan verb", + "romaji": "karidashita" + }, + "狩出して": { + "w_type": "conjugated godan verb", + "romaji": "karidashite" + }, + "使い倒さ": { + "w_type": "godan verb stem", + "romaji": "tsukaitaosa" + }, + "使い倒し": { + "w_type": "godan verb stem", + "romaji": "tsukaitaoshi" + }, + "使い倒せ": { + "w_type": "conjugated godan verb", + "romaji": "tsukaitaose" + }, + "使い倒そ": { + "w_type": "godan verb stem", + "romaji": "tsukaitaoso" + }, + "使い倒した": { + "w_type": "conjugated godan verb", + "romaji": "tsukaitaoshita" + }, + "使い倒して": { + "w_type": "conjugated godan verb", + "romaji": "tsukaitaoshite" + }, + "はだ脱が": { + "w_type": "godan verb stem", + "romaji": "hadanuga" + }, + "はだ脱ぎ": { + "w_type": "godan verb stem", + "romaji": "hadanugi" + }, + "はだ脱げ": { + "w_type": "conjugated godan verb", + "romaji": "hadanuge" + }, + "はだ脱ご": { + "w_type": "godan verb stem", + "romaji": "hadanugo" + }, + "はだ脱いだ": { + "w_type": "conjugated godan verb", + "romaji": "hadanuida" + }, + "はだ脱いで": { + "w_type": "conjugated godan verb", + "romaji": "hadanuide" + }, + "噛み千切ら": { + "w_type": "godan verb stem", + "romaji": "kamichigira" + }, + "噛み千切り": { + "w_type": "godan verb stem", + "romaji": "kamichigiri" + }, + "噛み千切れ": { + "w_type": "conjugated godan verb", + "romaji": "kamichigire" + }, + "噛み千切ろ": { + "w_type": "godan verb stem", + "romaji": "kamichigiro" + }, + "噛み千切った": { + "w_type": "conjugated godan verb", + "romaji": "kamichigitta" + }, + "噛み千切って": { + "w_type": "conjugated godan verb", + "romaji": "kamichigitte" + }, + "読みきら": { + "w_type": "godan verb stem", + "romaji": "yomikira" + }, + "読みきり": { + "w_type": "godan verb stem", + "romaji": "yomikiri" + }, + "読みきれ": { + "w_type": "conjugated godan verb", + "romaji": "yomikire" + }, + "読みきろ": { + "w_type": "godan verb stem", + "romaji": "yomikiro" + }, + "読みきった": { + "w_type": "conjugated godan verb", + "romaji": "yomikitta" + }, + "読みきって": { + "w_type": "conjugated godan verb", + "romaji": "yomikitte" + }, + "でんぐり返ら": { + "w_type": "godan verb stem", + "romaji": "dengurigaera" + }, + "でんぐり返り": { + "w_type": "godan verb stem", + "romaji": "dengurigaeri" + }, + "でんぐり返れ": { + "w_type": "conjugated godan verb", + "romaji": "dengurigaere" + }, + "でんぐり返ろ": { + "w_type": "godan verb stem", + "romaji": "dengurigaero" + }, + "でんぐり返った": { + "w_type": "conjugated godan verb", + "romaji": "dengurigaetta" + }, + "でんぐり返って": { + "w_type": "conjugated godan verb", + "romaji": "dengurigaette" + }, + "煎りつか": { + "w_type": "godan verb stem", + "romaji": "iritsuka" + }, + "煎りつき": { + "w_type": "godan verb stem", + "romaji": "iritsuki" + }, + "煎りつけ": { + "w_type": "conjugated godan verb", + "romaji": "iritsuke" + }, + "煎りつこ": { + "w_type": "godan verb stem", + "romaji": "iritsuko" + }, + "煎りついた": { + "w_type": "conjugated godan verb", + "romaji": "iritsuita" + }, + "煎りついて": { + "w_type": "conjugated godan verb", + "romaji": "iritsuite" + }, + "ぶち砕か": { + "w_type": "godan verb stem", + "romaji": "uchikudaka" + }, + "ぶち砕き": { + "w_type": "godan verb stem", + "romaji": "uchikudaki" + }, + "ぶち砕け": { + "w_type": "conjugated godan verb", + "romaji": "uchikudake" + }, + "ぶち砕こ": { + "w_type": "godan verb stem", + "romaji": "uchikudako" + }, + "ぶち砕いた": { + "w_type": "conjugated godan verb", + "romaji": "uchikudaita" + }, + "ぶち砕いて": { + "w_type": "conjugated godan verb", + "romaji": "uchikudaite" + }, + "列ば": { + "w_type": "godan verb stem", + "romaji": "naraba" + }, + "列び": { + "w_type": "godan verb stem", + "romaji": "narabi" + }, + "列べ": { + "w_type": "conjugated godan verb", + "romaji": "narabe" + }, + "列ぼ": { + "w_type": "godan verb stem", + "romaji": "narabo" + }, + "列んだ": { + "w_type": "conjugated godan verb", + "romaji": "naranda" + }, + "列んで": { + "w_type": "conjugated godan verb", + "romaji": "narande" + }, + "責っ付か": { + "w_type": "godan verb stem", + "romaji": "settsuka" + }, + "責っ付き": { + "w_type": "godan verb stem", + "romaji": "settsuki" + }, + "責っ付け": { + "w_type": "conjugated godan verb", + "romaji": "settsuke" + }, + "責っ付こ": { + "w_type": "godan verb stem", + "romaji": "settsuko" + }, + "責っ付いた": { + "w_type": "conjugated godan verb", + "romaji": "settsuita" + }, + "責っ付いて": { + "w_type": "conjugated godan verb", + "romaji": "settsuite" + }, + "ぬぐい去ら": { + "w_type": "godan verb stem", + "romaji": "nuguisara" + }, + "ぬぐい去り": { + "w_type": "godan verb stem", + "romaji": "nuguisari" + }, + "ぬぐい去れ": { + "w_type": "conjugated godan verb", + "romaji": "nuguisare" + }, + "ぬぐい去ろ": { + "w_type": "godan verb stem", + "romaji": "nuguisaro" + }, + "ぬぐい去った": { + "w_type": "conjugated godan verb", + "romaji": "nuguisatta" + }, + "ぬぐい去って": { + "w_type": "conjugated godan verb", + "romaji": "nuguisatte" + }, + "織り交ざら": { + "w_type": "godan verb stem", + "romaji": "orimazara" + }, + "織り交ざり": { + "w_type": "godan verb stem", + "romaji": "orimazari" + }, + "織り交ざれ": { + "w_type": "conjugated godan verb", + "romaji": "orimazare" + }, + "織り交ざろ": { + "w_type": "godan verb stem", + "romaji": "orimazaro" + }, + "織り交ざった": { + "w_type": "conjugated godan verb", + "romaji": "orimazatta" + }, + "織り交ざって": { + "w_type": "conjugated godan verb", + "romaji": "orimazatte" + }, + "灯ら": { + "w_type": "godan verb stem", + "romaji": "tomora" + }, + "灯り": { + "w_type": "godan verb stem", + "romaji": "tomori" + }, + "灯れ": { + "w_type": "conjugated godan verb", + "romaji": "tomore" + }, + "灯ろ": { + "w_type": "godan verb stem", + "romaji": "tomoro" + }, + "灯った": { + "w_type": "conjugated godan verb", + "romaji": "tomotta" + }, + "灯って": { + "w_type": "conjugated godan verb", + "romaji": "tomotte" + }, + "拗らさ": { + "w_type": "godan verb stem", + "romaji": "kojirasa" + }, + "拗らし": { + "w_type": "godan verb stem", + "romaji": "kojirashi" + }, + "拗らせ": { + "w_type": "conjugated godan verb", + "romaji": "kojirase" + }, + "拗らそ": { + "w_type": "godan verb stem", + "romaji": "kojiraso" + }, + "拗らした": { + "w_type": "conjugated godan verb", + "romaji": "kojirashita" + }, + "拗らして": { + "w_type": "conjugated godan verb", + "romaji": "kojirashite" + }, + "哀れま": { + "w_type": "godan verb stem", + "romaji": "awarema" + }, + "哀れみ": { + "w_type": "godan verb stem", + "romaji": "awaremi" + }, + "哀れめ": { + "w_type": "conjugated godan verb", + "romaji": "awareme" + }, + "哀れも": { + "w_type": "godan verb stem", + "romaji": "awaremo" + }, + "哀れんだ": { + "w_type": "conjugated godan verb", + "romaji": "awarenda" + }, + "哀れんで": { + "w_type": "conjugated godan verb", + "romaji": "awarende" + }, + "乳くり合わ": { + "w_type": "godan verb stem", + "romaji": "chichikuriawa" + }, + "乳くり合い": { + "w_type": "godan verb stem", + "romaji": "chichikuriai" + }, + "乳くり合え": { + "w_type": "conjugated godan verb", + "romaji": "chichikuriae" + }, + "乳くり合お": { + "w_type": "godan verb stem", + "romaji": "chichikuriao" + }, + "乳くり合った": { + "w_type": "conjugated godan verb", + "romaji": "chichikuriatta" + }, + "乳くり合って": { + "w_type": "conjugated godan verb", + "romaji": "chichikuriatte" + }, + "諱ま": { + "w_type": "godan verb stem", + "romaji": "ima" + }, + "諱み": { + "w_type": "godan verb stem", + "romaji": "imi" + }, + "諱め": { + "w_type": "conjugated godan verb", + "romaji": "ime" + }, + "諱も": { + "w_type": "godan verb stem", + "romaji": "imo" + }, + "諱んだ": { + "w_type": "conjugated godan verb", + "romaji": "inda" + }, + "諱んで": { + "w_type": "conjugated godan verb", + "romaji": "inde" + }, + "僻ま": { + "w_type": "godan verb stem", + "romaji": "higama" + }, + "僻み": { + "w_type": "godan verb stem", + "romaji": "higami" + }, + "僻め": { + "w_type": "conjugated godan verb", + "romaji": "higame" + }, + "僻も": { + "w_type": "godan verb stem", + "romaji": "higamo" + }, + "僻んだ": { + "w_type": "conjugated godan verb", + "romaji": "higanda" + }, + "僻んで": { + "w_type": "conjugated godan verb", + "romaji": "higande" + }, + "面食らわ": { + "w_type": "godan verb stem", + "romaji": "menkurawa" + }, + "面食らい": { + "w_type": "godan verb stem", + "romaji": "menkurai" + }, + "面食らえ": { + "w_type": "conjugated godan verb", + "romaji": "menkurae" + }, + "面食らお": { + "w_type": "godan verb stem", + "romaji": "menkurao" + }, + "面食らった": { + "w_type": "conjugated godan verb", + "romaji": "menkuratta" + }, + "面食らって": { + "w_type": "conjugated godan verb", + "romaji": "menkuratte" + }, + "たち働か": { + "w_type": "godan verb stem", + "romaji": "tachihataraka" + }, + "たち働き": { + "w_type": "godan verb stem", + "romaji": "tachihataraki" + }, + "たち働け": { + "w_type": "conjugated godan verb", + "romaji": "tachihatarake" + }, + "たち働こ": { + "w_type": "godan verb stem", + "romaji": "tachihatarako" + }, + "たち働いた": { + "w_type": "conjugated godan verb", + "romaji": "tachihataraita" + }, + "たち働いて": { + "w_type": "conjugated godan verb", + "romaji": "tachihataraite" + }, + "降注が": { + "w_type": "godan verb stem", + "romaji": "furisosoga" + }, + "降注ぎ": { + "w_type": "godan verb stem", + "romaji": "furisosogi" + }, + "降注げ": { + "w_type": "conjugated godan verb", + "romaji": "furisosoge" + }, + "降注ご": { + "w_type": "godan verb stem", + "romaji": "furisosogo" + }, + "降注いだ": { + "w_type": "conjugated godan verb", + "romaji": "furisosoida" + }, + "降注いで": { + "w_type": "conjugated godan verb", + "romaji": "furisosoide" + }, + "打ち毀さ": { + "w_type": "godan verb stem", + "romaji": "buchikowasa" + }, + "打ち毀し": { + "w_type": "godan verb stem", + "romaji": "buchikowashi" + }, + "打ち毀せ": { + "w_type": "conjugated godan verb", + "romaji": "buchikowase" + }, + "打ち毀そ": { + "w_type": "godan verb stem", + "romaji": "buchikowaso" + }, + "打ち毀した": { + "w_type": "conjugated godan verb", + "romaji": "buchikowashita" + }, + "打ち毀して": { + "w_type": "conjugated godan verb", + "romaji": "buchikowashite" + }, + "治ら": { + "w_type": "godan verb stem", + "romaji": "naora" + }, + "治り": { + "w_type": "godan verb stem", + "romaji": "naori" + }, + "治れ": { + "w_type": "conjugated godan verb", + "romaji": "naore" + }, + "治ろ": { + "w_type": "godan verb stem", + "romaji": "naoro" + }, + "治った": { + "w_type": "conjugated godan verb", + "romaji": "naotta" + }, + "治って": { + "w_type": "conjugated godan verb", + "romaji": "naotte" + }, + "圧し掛から": { + "w_type": "godan verb stem", + "romaji": "noshikakara" + }, + "圧し掛かり": { + "w_type": "godan verb stem", + "romaji": "noshikakari" + }, + "圧し掛かれ": { + "w_type": "conjugated godan verb", + "romaji": "noshikakare" + }, + "圧し掛かろ": { + "w_type": "godan verb stem", + "romaji": "noshikakaro" + }, + "圧し掛かった": { + "w_type": "conjugated godan verb", + "romaji": "noshikakatta" + }, + "圧し掛かって": { + "w_type": "conjugated godan verb", + "romaji": "noshikakatte" + }, + "酔いつぶさ": { + "w_type": "godan verb stem", + "romaji": "yoitsubusa" + }, + "酔いつぶし": { + "w_type": "godan verb stem", + "romaji": "yoitsubushi" + }, + "酔いつぶせ": { + "w_type": "conjugated godan verb", + "romaji": "yoitsubuse" + }, + "酔いつぶそ": { + "w_type": "godan verb stem", + "romaji": "yoitsubuso" + }, + "酔いつぶした": { + "w_type": "conjugated godan verb", + "romaji": "yoitsubushita" + }, + "酔いつぶして": { + "w_type": "conjugated godan verb", + "romaji": "yoitsubushite" + }, + "尖がら": { + "w_type": "godan verb stem", + "romaji": "togara" + }, + "尖がり": { + "w_type": "godan verb stem", + "romaji": "togari" + }, + "尖がれ": { + "w_type": "conjugated godan verb", + "romaji": "togare" + }, + "尖がろ": { + "w_type": "godan verb stem", + "romaji": "togaro" + }, + "尖がった": { + "w_type": "conjugated godan verb", + "romaji": "togatta" + }, + "尖がって": { + "w_type": "conjugated godan verb", + "romaji": "togatte" + }, + "分捕ら": { + "w_type": "godan verb stem", + "romaji": "bundora" + }, + "分捕り": { + "w_type": "godan verb stem", + "romaji": "bundori" + }, + "分捕れ": { + "w_type": "conjugated godan verb", + "romaji": "bundore" + }, + "分捕ろ": { + "w_type": "godan verb stem", + "romaji": "bundoro" + }, + "分捕った": { + "w_type": "conjugated godan verb", + "romaji": "bundotta" + }, + "分捕って": { + "w_type": "conjugated godan verb", + "romaji": "bundotte" + }, + "鬩ぎ合わ": { + "w_type": "godan verb stem", + "romaji": "semegiawa" + }, + "鬩ぎ合い": { + "w_type": "godan verb stem", + "romaji": "semegiai" + }, + "鬩ぎ合え": { + "w_type": "conjugated godan verb", + "romaji": "semegiae" + }, + "鬩ぎ合お": { + "w_type": "godan verb stem", + "romaji": "semegiao" + }, + "鬩ぎ合った": { + "w_type": "conjugated godan verb", + "romaji": "semegiatta" + }, + "鬩ぎ合って": { + "w_type": "conjugated godan verb", + "romaji": "semegiatte" + }, + "訓ま": { + "w_type": "godan verb stem", + "romaji": "yoma" + }, + "訓み": { + "w_type": "godan verb stem", + "romaji": "yomi" + }, + "訓め": { + "w_type": "conjugated godan verb", + "romaji": "yome" + }, + "訓も": { + "w_type": "godan verb stem", + "romaji": "yomo" + }, + "訓んだ": { + "w_type": "conjugated godan verb", + "romaji": "yonda" + }, + "訓んで": { + "w_type": "conjugated godan verb", + "romaji": "yonde" + }, + "纏わ": { + "w_type": "godan verb stem", + "romaji": "matowa" + }, + "纏い": { + "w_type": "godan verb stem", + "romaji": "matoi" + }, + "纏え": { + "w_type": "conjugated godan verb", + "romaji": "matoe" + }, + "纏お": { + "w_type": "godan verb stem", + "romaji": "matoo" + }, + "纏った": { + "w_type": "conjugated godan verb", + "romaji": "matotta" + }, + "纏って": { + "w_type": "conjugated godan verb", + "romaji": "matotte" + }, + "読み誤ら": { + "w_type": "godan verb stem", + "romaji": "yomiayamara" + }, + "読み誤り": { + "w_type": "godan verb stem", + "romaji": "yomiayamari" + }, + "読み誤れ": { + "w_type": "conjugated godan verb", + "romaji": "yomiayamare" + }, + "読み誤ろ": { + "w_type": "godan verb stem", + "romaji": "yomiayamaro" + }, + "読み誤った": { + "w_type": "conjugated godan verb", + "romaji": "yomiayamatta" + }, + "読み誤って": { + "w_type": "conjugated godan verb", + "romaji": "yomiayamatte" + }, + "阿ねら": { + "w_type": "godan verb stem", + "romaji": "omonera" + }, + "阿ねり": { + "w_type": "godan verb stem", + "romaji": "omoneri" + }, + "阿ねれ": { + "w_type": "conjugated godan verb", + "romaji": "omonere" + }, + "阿ねろ": { + "w_type": "godan verb stem", + "romaji": "omonero" + }, + "阿ねった": { + "w_type": "conjugated godan verb", + "romaji": "omonetta" + }, + "阿ねって": { + "w_type": "conjugated godan verb", + "romaji": "omonette" + }, + "回り込ま": { + "w_type": "godan verb stem", + "romaji": "mawarikoma" + }, + "回り込み": { + "w_type": "godan verb stem", + "romaji": "mawarikomi" + }, + "回り込め": { + "w_type": "conjugated godan verb", + "romaji": "mawarikome" + }, + "回り込も": { + "w_type": "godan verb stem", + "romaji": "mawarikomo" + }, + "回り込んだ": { + "w_type": "conjugated godan verb", + "romaji": "mawarikonda" + }, + "回り込んで": { + "w_type": "conjugated godan verb", + "romaji": "mawarikonde" + }, + "勝ち放さ": { + "w_type": "godan verb stem", + "romaji": "kachihanasa" + }, + "勝ち放し": { + "w_type": "godan verb stem", + "romaji": "kachihanashi" + }, + "勝ち放せ": { + "w_type": "conjugated godan verb", + "romaji": "kachihanase" + }, + "勝ち放そ": { + "w_type": "godan verb stem", + "romaji": "kachihanaso" + }, + "勝ち放した": { + "w_type": "conjugated godan verb", + "romaji": "kachihanashita" + }, + "勝ち放して": { + "w_type": "conjugated godan verb", + "romaji": "kachihanashite" + }, + "笑わかさ": { + "w_type": "godan verb stem", + "romaji": "warawakasa" + }, + "笑わかし": { + "w_type": "godan verb stem", + "romaji": "warawakashi" + }, + "笑わかせ": { + "w_type": "conjugated godan verb", + "romaji": "warawakase" + }, + "笑わかそ": { + "w_type": "godan verb stem", + "romaji": "warawakaso" + }, + "笑わかした": { + "w_type": "conjugated godan verb", + "romaji": "warawakashita" + }, + "笑わかして": { + "w_type": "conjugated godan verb", + "romaji": "warawakashite" + }, + "死に変ら": { + "w_type": "godan verb stem", + "romaji": "shinikawara" + }, + "死に変り": { + "w_type": "godan verb stem", + "romaji": "shinikawari" + }, + "死に変れ": { + "w_type": "conjugated godan verb", + "romaji": "shinikaware" + }, + "死に変ろ": { + "w_type": "godan verb stem", + "romaji": "shinikawaro" + }, + "死に変った": { + "w_type": "conjugated godan verb", + "romaji": "shinikawatta" + }, + "死に変って": { + "w_type": "conjugated godan verb", + "romaji": "shinikawatte" + }, + "略さ": { + "w_type": "godan verb stem", + "romaji": "ryakusa" + }, + "略し": { + "w_type": "godan verb stem", + "romaji": "ryakushi" + }, + "略せ": { + "w_type": "conjugated godan verb", + "romaji": "ryakuse" + }, + "略そ": { + "w_type": "godan verb stem", + "romaji": "ryakuso" + }, + "略した": { + "w_type": "conjugated godan verb", + "romaji": "ryakushita" + }, + "略して": { + "w_type": "conjugated godan verb", + "romaji": "ryakushite" + }, + "燃え上がら": { + "w_type": "godan verb stem", + "romaji": "moeagara" + }, + "燃え上がり": { + "w_type": "godan verb stem", + "romaji": "moeagari" + }, + "燃え上がれ": { + "w_type": "conjugated godan verb", + "romaji": "moeagare" + }, + "燃え上がろ": { + "w_type": "godan verb stem", + "romaji": "moeagaro" + }, + "燃え上がった": { + "w_type": "conjugated godan verb", + "romaji": "moeagatta" + }, + "燃え上がって": { + "w_type": "conjugated godan verb", + "romaji": "moeagatte" + }, + "分ちあわ": { + "w_type": "godan verb stem", + "romaji": "wakachiawa" + }, + "分ちあい": { + "w_type": "godan verb stem", + "romaji": "wakachiai" + }, + "分ちあえ": { + "w_type": "conjugated godan verb", + "romaji": "wakachiae" + }, + "分ちあお": { + "w_type": "godan verb stem", + "romaji": "wakachiao" + }, + "分ちあった": { + "w_type": "conjugated godan verb", + "romaji": "wakachiatta" + }, + "分ちあって": { + "w_type": "conjugated godan verb", + "romaji": "wakachiatte" + }, + "述べ合わ": { + "w_type": "godan verb stem", + "romaji": "nobeawa" + }, + "述べ合い": { + "w_type": "godan verb stem", + "romaji": "nobeai" + }, + "述べ合え": { + "w_type": "conjugated godan verb", + "romaji": "nobeae" + }, + "述べ合お": { + "w_type": "godan verb stem", + "romaji": "nobeao" + }, + "述べ合った": { + "w_type": "conjugated godan verb", + "romaji": "nobeatta" + }, + "述べ合って": { + "w_type": "conjugated godan verb", + "romaji": "nobeatte" + }, + "踊り狂わ": { + "w_type": "godan verb stem", + "romaji": "odorikuruwa" + }, + "踊り狂い": { + "w_type": "godan verb stem", + "romaji": "odorikurui" + }, + "踊り狂え": { + "w_type": "conjugated godan verb", + "romaji": "odorikurue" + }, + "踊り狂お": { + "w_type": "godan verb stem", + "romaji": "odorikuruo" + }, + "踊り狂った": { + "w_type": "conjugated godan verb", + "romaji": "odorikurutta" + }, + "踊り狂って": { + "w_type": "conjugated godan verb", + "romaji": "odorikurutte" + }, + "届か": { + "w_type": "godan verb stem", + "romaji": "todoka" + }, + "届き": { + "w_type": "godan verb stem", + "romaji": "todoki" + }, + "届け": { + "w_type": "conjugated godan verb", + "romaji": "todoke" + }, + "届こ": { + "w_type": "godan verb stem", + "romaji": "todoko" + }, + "届いた": { + "w_type": "conjugated godan verb", + "romaji": "todoita" + }, + "届いて": { + "w_type": "conjugated godan verb", + "romaji": "todoite" + }, + "噛砕か": { + "w_type": "godan verb stem", + "romaji": "kamikudaka" + }, + "噛砕き": { + "w_type": "godan verb stem", + "romaji": "kamikudaki" + }, + "噛砕け": { + "w_type": "conjugated godan verb", + "romaji": "kamikudake" + }, + "噛砕こ": { + "w_type": "godan verb stem", + "romaji": "kamikudako" + }, + "噛砕いた": { + "w_type": "conjugated godan verb", + "romaji": "kamikudaita" + }, + "噛砕いて": { + "w_type": "conjugated godan verb", + "romaji": "kamikudaite" + }, + "撃払わ": { + "w_type": "godan verb stem", + "romaji": "uchiharawa" + }, + "撃払い": { + "w_type": "godan verb stem", + "romaji": "uchiharai" + }, + "撃払え": { + "w_type": "conjugated godan verb", + "romaji": "uchiharae" + }, + "撃払お": { + "w_type": "godan verb stem", + "romaji": "uchiharao" + }, + "撃払った": { + "w_type": "conjugated godan verb", + "romaji": "uchiharatta" + }, + "撃払って": { + "w_type": "conjugated godan verb", + "romaji": "uchiharatte" + }, + "役だた": { + "w_type": "godan verb stem", + "romaji": "yakudata" + }, + "役だち": { + "w_type": "godan verb stem", + "romaji": "yakudachi" + }, + "役だて": { + "w_type": "conjugated godan verb", + "romaji": "yakudate" + }, + "役だと": { + "w_type": "godan verb stem", + "romaji": "yakudato" + }, + "役だった": { + "w_type": "conjugated godan verb", + "romaji": "yakudatta" + }, + "役だって": { + "w_type": "conjugated godan verb", + "romaji": "yakudatte" + }, + "巻き込ま": { + "w_type": "godan verb stem", + "romaji": "makikoma" + }, + "巻き込み": { + "w_type": "godan verb stem", + "romaji": "makikomi" + }, + "巻き込め": { + "w_type": "conjugated godan verb", + "romaji": "makikome" + }, + "巻き込も": { + "w_type": "godan verb stem", + "romaji": "makikomo" + }, + "巻き込んだ": { + "w_type": "conjugated godan verb", + "romaji": "makikonda" + }, + "巻き込んで": { + "w_type": "conjugated godan verb", + "romaji": "makikonde" + }, + "給わら": { + "w_type": "godan verb stem", + "romaji": "tamawara" + }, + "給わり": { + "w_type": "godan verb stem", + "romaji": "tamawari" + }, + "給われ": { + "w_type": "conjugated godan verb", + "romaji": "tamaware" + }, + "給わろ": { + "w_type": "godan verb stem", + "romaji": "tamawaro" + }, + "給わった": { + "w_type": "conjugated godan verb", + "romaji": "tamawatta" + }, + "給わって": { + "w_type": "conjugated godan verb", + "romaji": "tamawatte" + }, + "償わ": { + "w_type": "godan verb stem", + "romaji": "tsugunawa" + }, + "償い": { + "w_type": "godan verb stem", + "romaji": "tsugunai" + }, + "償え": { + "w_type": "conjugated godan verb", + "romaji": "tsugunae" + }, + "償お": { + "w_type": "godan verb stem", + "romaji": "tsugunao" + }, + "償った": { + "w_type": "conjugated godan verb", + "romaji": "tsugunatta" + }, + "償って": { + "w_type": "conjugated godan verb", + "romaji": "tsugunatte" + }, + "揺り動か": { + "w_type": "godan verb stem", + "romaji": "yuriugoka" + }, + "揺り動き": { + "w_type": "godan verb stem", + "romaji": "yuriugoki" + }, + "揺り動け": { + "w_type": "conjugated godan verb", + "romaji": "yuriugoke" + }, + "揺り動こ": { + "w_type": "godan verb stem", + "romaji": "yuriugoko" + }, + "揺り動いた": { + "w_type": "conjugated godan verb", + "romaji": "yuriugoita" + }, + "揺り動いて": { + "w_type": "conjugated godan verb", + "romaji": "yuriugoite" + }, + "引継が": { + "w_type": "godan verb stem", + "romaji": "hikitsuga" + }, + "引継ぎ": { + "w_type": "godan verb stem", + "romaji": "hikitsugi" + }, + "引継げ": { + "w_type": "conjugated godan verb", + "romaji": "hikitsuge" + }, + "引継ご": { + "w_type": "godan verb stem", + "romaji": "hikitsugo" + }, + "引継いだ": { + "w_type": "conjugated godan verb", + "romaji": "hikitsuida" + }, + "引継いで": { + "w_type": "conjugated godan verb", + "romaji": "hikitsuide" + }, + "繕わ": { + "w_type": "godan verb stem", + "romaji": "tsukurowa" + }, + "繕い": { + "w_type": "godan verb stem", + "romaji": "tsukuroi" + }, + "繕え": { + "w_type": "conjugated godan verb", + "romaji": "tsukuroe" + }, + "繕お": { + "w_type": "godan verb stem", + "romaji": "tsukuroo" + }, + "繕った": { + "w_type": "conjugated godan verb", + "romaji": "tsukurotta" + }, + "繕って": { + "w_type": "conjugated godan verb", + "romaji": "tsukurotte" + }, + "討ち合わ": { + "w_type": "godan verb stem", + "romaji": "uchiawa" + }, + "討ち合い": { + "w_type": "godan verb stem", + "romaji": "uchiai" + }, + "討ち合え": { + "w_type": "conjugated godan verb", + "romaji": "uchiae" + }, + "討ち合お": { + "w_type": "godan verb stem", + "romaji": "uchiao" + }, + "討ち合った": { + "w_type": "conjugated godan verb", + "romaji": "uchiatta" + }, + "討ち合って": { + "w_type": "conjugated godan verb", + "romaji": "uchiatte" + }, + "掛け合わ": { + "w_type": "godan verb stem", + "romaji": "kakeawa" + }, + "掛け合い": { + "w_type": "godan verb stem", + "romaji": "kakeai" + }, + "掛け合え": { + "w_type": "conjugated godan verb", + "romaji": "kakeae" + }, + "掛け合お": { + "w_type": "godan verb stem", + "romaji": "kakeao" + }, + "掛け合った": { + "w_type": "conjugated godan verb", + "romaji": "kakeatta" + }, + "掛け合って": { + "w_type": "conjugated godan verb", + "romaji": "kakeatte" + }, + "むせび泣か": { + "w_type": "godan verb stem", + "romaji": "musebinaka" + }, + "むせび泣き": { + "w_type": "godan verb stem", + "romaji": "musebinaki" + }, + "むせび泣け": { + "w_type": "conjugated godan verb", + "romaji": "musebinake" + }, + "むせび泣こ": { + "w_type": "godan verb stem", + "romaji": "musebinako" + }, + "むせび泣いた": { + "w_type": "conjugated godan verb", + "romaji": "musebinaita" + }, + "むせび泣いて": { + "w_type": "conjugated godan verb", + "romaji": "musebinaite" + }, + "眺め遣ら": { + "w_type": "godan verb stem", + "romaji": "nagameyara" + }, + "眺め遣り": { + "w_type": "godan verb stem", + "romaji": "nagameyari" + }, + "眺め遣れ": { + "w_type": "conjugated godan verb", + "romaji": "nagameyare" + }, + "眺め遣ろ": { + "w_type": "godan verb stem", + "romaji": "nagameyaro" + }, + "眺め遣った": { + "w_type": "conjugated godan verb", + "romaji": "nagameyatta" + }, + "眺め遣って": { + "w_type": "conjugated godan verb", + "romaji": "nagameyatte" + }, + "見繕わ": { + "w_type": "godan verb stem", + "romaji": "mitsukurowa" + }, + "見繕い": { + "w_type": "godan verb stem", + "romaji": "mitsukuroi" + }, + "見繕え": { + "w_type": "conjugated godan verb", + "romaji": "mitsukuroe" + }, + "見繕お": { + "w_type": "godan verb stem", + "romaji": "mitsukuroo" + }, + "見繕った": { + "w_type": "conjugated godan verb", + "romaji": "mitsukurotta" + }, + "見繕って": { + "w_type": "conjugated godan verb", + "romaji": "mitsukurotte" + }, + "溢れかえら": { + "w_type": "godan verb stem", + "romaji": "afurekaera" + }, + "溢れかえり": { + "w_type": "godan verb stem", + "romaji": "afurekaeri" + }, + "溢れかえれ": { + "w_type": "conjugated godan verb", + "romaji": "afurekaere" + }, + "溢れかえろ": { + "w_type": "godan verb stem", + "romaji": "afurekaero" + }, + "溢れかえった": { + "w_type": "conjugated godan verb", + "romaji": "afurekaetta" + }, + "溢れかえって": { + "w_type": "conjugated godan verb", + "romaji": "afurekaette" + }, + "抱き下ろさ": { + "w_type": "godan verb stem", + "romaji": "dakiorosa" + }, + "抱き下ろし": { + "w_type": "godan verb stem", + "romaji": "dakioroshi" + }, + "抱き下ろせ": { + "w_type": "conjugated godan verb", + "romaji": "dakiorose" + }, + "抱き下ろそ": { + "w_type": "godan verb stem", + "romaji": "dakioroso" + }, + "抱き下ろした": { + "w_type": "conjugated godan verb", + "romaji": "dakioroshita" + }, + "抱き下ろして": { + "w_type": "conjugated godan verb", + "romaji": "dakioroshite" + }, + "粧わ": { + "w_type": "godan verb stem", + "romaji": "yosoowa" + }, + "粧い": { + "w_type": "godan verb stem", + "romaji": "yosooi" + }, + "粧え": { + "w_type": "conjugated godan verb", + "romaji": "yosooe" + }, + "粧お": { + "w_type": "godan verb stem", + "romaji": "yosooo" + }, + "粧った": { + "w_type": "conjugated godan verb", + "romaji": "yosootta" + }, + "粧って": { + "w_type": "conjugated godan verb", + "romaji": "yosootte" + }, + "平伏さ": { + "w_type": "godan verb stem", + "romaji": "hirefusa" + }, + "平伏し": { + "w_type": "godan verb stem", + "romaji": "hirefushi" + }, + "平伏せ": { + "w_type": "conjugated godan verb", + "romaji": "hirefuse" + }, + "平伏そ": { + "w_type": "godan verb stem", + "romaji": "hirefuso" + }, + "平伏した": { + "w_type": "conjugated godan verb", + "romaji": "hirefushita" + }, + "平伏して": { + "w_type": "conjugated godan verb", + "romaji": "hirefushite" + }, + "ほじくり返さ": { + "w_type": "godan verb stem", + "romaji": "hojikurikaesa" + }, + "ほじくり返し": { + "w_type": "godan verb stem", + "romaji": "hojikurikaeshi" + }, + "ほじくり返せ": { + "w_type": "conjugated godan verb", + "romaji": "hojikurikaese" + }, + "ほじくり返そ": { + "w_type": "godan verb stem", + "romaji": "hojikurikaeso" + }, + "ほじくり返した": { + "w_type": "conjugated godan verb", + "romaji": "hojikurikaeshita" + }, + "ほじくり返して": { + "w_type": "conjugated godan verb", + "romaji": "hojikurikaeshite" + }, + "暖まら": { + "w_type": "godan verb stem", + "romaji": "atatamara" + }, + "暖まり": { + "w_type": "godan verb stem", + "romaji": "atatamari" + }, + "暖まれ": { + "w_type": "conjugated godan verb", + "romaji": "atatamare" + }, + "暖まろ": { + "w_type": "godan verb stem", + "romaji": "atatamaro" + }, + "暖まった": { + "w_type": "conjugated godan verb", + "romaji": "atatamatta" + }, + "暖まって": { + "w_type": "conjugated godan verb", + "romaji": "atatamatte" + }, + "捜し出さ": { + "w_type": "godan verb stem", + "romaji": "sagashidasa" + }, + "捜し出し": { + "w_type": "godan verb stem", + "romaji": "sagashidashi" + }, + "捜し出せ": { + "w_type": "conjugated godan verb", + "romaji": "sagashidase" + }, + "捜し出そ": { + "w_type": "godan verb stem", + "romaji": "sagashidaso" + }, + "捜し出した": { + "w_type": "conjugated godan verb", + "romaji": "sagashidashita" + }, + "捜し出して": { + "w_type": "conjugated godan verb", + "romaji": "sagashidashite" + }, + "慶ば": { + "w_type": "godan verb stem", + "romaji": "yorokoba" + }, + "慶び": { + "w_type": "godan verb stem", + "romaji": "yorokobi" + }, + "慶べ": { + "w_type": "conjugated godan verb", + "romaji": "yorokobe" + }, + "慶ぼ": { + "w_type": "godan verb stem", + "romaji": "yorokobo" + }, + "慶んだ": { + "w_type": "conjugated godan verb", + "romaji": "yorokonda" + }, + "慶んで": { + "w_type": "conjugated godan verb", + "romaji": "yorokonde" + }, + "読み損わ": { + "w_type": "godan verb stem", + "romaji": "yomisokonawa" + }, + "読み損い": { + "w_type": "godan verb stem", + "romaji": "yomisokonai" + }, + "読み損え": { + "w_type": "conjugated godan verb", + "romaji": "yomisokonae" + }, + "読み損お": { + "w_type": "godan verb stem", + "romaji": "yomisokonao" + }, + "読み損った": { + "w_type": "conjugated godan verb", + "romaji": "yomisokonatta" + }, + "読み損って": { + "w_type": "conjugated godan verb", + "romaji": "yomisokonatte" + }, + "伸さ": { + "w_type": "godan verb stem", + "romaji": "nosa" + }, + "伸し": { + "w_type": "godan verb stem", + "romaji": "noshi" + }, + "伸せ": { + "w_type": "conjugated godan verb", + "romaji": "nose" + }, + "伸そ": { + "w_type": "godan verb stem", + "romaji": "noso" + }, + "伸した": { + "w_type": "conjugated godan verb", + "romaji": "noshita" + }, + "伸して": { + "w_type": "conjugated godan verb", + "romaji": "noshite" + }, + "巣くわ": { + "w_type": "godan verb stem", + "romaji": "sukuwa" + }, + "巣くい": { + "w_type": "godan verb stem", + "romaji": "sukui" + }, + "巣くえ": { + "w_type": "conjugated godan verb", + "romaji": "sukue" + }, + "巣くお": { + "w_type": "godan verb stem", + "romaji": "sukuo" + }, + "巣くった": { + "w_type": "conjugated godan verb", + "romaji": "sukutta" + }, + "巣くって": { + "w_type": "conjugated godan verb", + "romaji": "sukutte" + }, + "吹きしきら": { + "w_type": "godan verb stem", + "romaji": "fukishikira" + }, + "吹きしきり": { + "w_type": "godan verb stem", + "romaji": "fukishikiri" + }, + "吹きしきれ": { + "w_type": "conjugated godan verb", + "romaji": "fukishikire" + }, + "吹きしきろ": { + "w_type": "godan verb stem", + "romaji": "fukishikiro" + }, + "吹きしきった": { + "w_type": "conjugated godan verb", + "romaji": "fukishikitta" + }, + "吹きしきって": { + "w_type": "conjugated godan verb", + "romaji": "fukishikitte" + }, + "たけり立た": { + "w_type": "godan verb stem", + "romaji": "takeritata" + }, + "たけり立ち": { + "w_type": "godan verb stem", + "romaji": "takeritachi" + }, + "たけり立て": { + "w_type": "conjugated godan verb", + "romaji": "takeritate" + }, + "たけり立と": { + "w_type": "godan verb stem", + "romaji": "takeritato" + }, + "たけり立った": { + "w_type": "conjugated godan verb", + "romaji": "takeritatta" + }, + "たけり立って": { + "w_type": "conjugated godan verb", + "romaji": "takeritatte" + }, + "言合わ": { + "w_type": "godan verb stem", + "romaji": "iiawa" + }, + "言合い": { + "w_type": "godan verb stem", + "romaji": "iiai" + }, + "言合え": { + "w_type": "conjugated godan verb", + "romaji": "iiae" + }, + "言合お": { + "w_type": "godan verb stem", + "romaji": "iiao" + }, + "言合った": { + "w_type": "conjugated godan verb", + "romaji": "iiatta" + }, + "言合って": { + "w_type": "conjugated godan verb", + "romaji": "iiatte" + }, + "崩れ去ら": { + "w_type": "godan verb stem", + "romaji": "kuzuresara" + }, + "崩れ去り": { + "w_type": "godan verb stem", + "romaji": "kuzuresari" + }, + "崩れ去れ": { + "w_type": "conjugated godan verb", + "romaji": "kuzuresare" + }, + "崩れ去ろ": { + "w_type": "godan verb stem", + "romaji": "kuzuresaro" + }, + "崩れ去った": { + "w_type": "conjugated godan verb", + "romaji": "kuzuresatta" + }, + "崩れ去って": { + "w_type": "conjugated godan verb", + "romaji": "kuzuresatte" + }, + "入り浸ら": { + "w_type": "godan verb stem", + "romaji": "iribitara" + }, + "入り浸り": { + "w_type": "godan verb stem", + "romaji": "iribitari" + }, + "入り浸れ": { + "w_type": "conjugated godan verb", + "romaji": "iribitare" + }, + "入り浸ろ": { + "w_type": "godan verb stem", + "romaji": "iribitaro" + }, + "入り浸った": { + "w_type": "conjugated godan verb", + "romaji": "iribitatta" + }, + "入り浸って": { + "w_type": "conjugated godan verb", + "romaji": "iribitatte" + }, + "泣き喚か": { + "w_type": "godan verb stem", + "romaji": "nakiwameka" + }, + "泣き喚き": { + "w_type": "godan verb stem", + "romaji": "nakiwameki" + }, + "泣き喚け": { + "w_type": "conjugated godan verb", + "romaji": "nakiwameke" + }, + "泣き喚こ": { + "w_type": "godan verb stem", + "romaji": "nakiwameko" + }, + "泣き喚いた": { + "w_type": "conjugated godan verb", + "romaji": "nakiwameita" + }, + "泣き喚いて": { + "w_type": "conjugated godan verb", + "romaji": "nakiwameite" + }, + "萌やさ": { + "w_type": "godan verb stem", + "romaji": "moyasa" + }, + "萌やし": { + "w_type": "godan verb stem", + "romaji": "moyashi" + }, + "萌やせ": { + "w_type": "conjugated godan verb", + "romaji": "moyase" + }, + "萌やそ": { + "w_type": "godan verb stem", + "romaji": "moyaso" + }, + "萌やした": { + "w_type": "conjugated godan verb", + "romaji": "moyashita" + }, + "萌やして": { + "w_type": "conjugated godan verb", + "romaji": "moyashite" + }, + "寝転がら": { + "w_type": "godan verb stem", + "romaji": "nekorogara" + }, + "寝転がり": { + "w_type": "godan verb stem", + "romaji": "nekorogari" + }, + "寝転がれ": { + "w_type": "conjugated godan verb", + "romaji": "nekorogare" + }, + "寝転がろ": { + "w_type": "godan verb stem", + "romaji": "nekorogaro" + }, + "寝転がった": { + "w_type": "conjugated godan verb", + "romaji": "nekorogatta" + }, + "寝転がって": { + "w_type": "conjugated godan verb", + "romaji": "nekorogatte" + }, + "恐れおののか": { + "w_type": "godan verb stem", + "romaji": "osoreononoka" + }, + "恐れおののき": { + "w_type": "godan verb stem", + "romaji": "osoreononoki" + }, + "恐れおののけ": { + "w_type": "conjugated godan verb", + "romaji": "osoreononoke" + }, + "恐れおののこ": { + "w_type": "godan verb stem", + "romaji": "osoreononoko" + }, + "恐れおののいた": { + "w_type": "conjugated godan verb", + "romaji": "osoreononoita" + }, + "恐れおののいて": { + "w_type": "conjugated godan verb", + "romaji": "osoreononoite" + }, + "踏み荒さ": { + "w_type": "godan verb stem", + "romaji": "fumiarasa" + }, + "踏み荒し": { + "w_type": "godan verb stem", + "romaji": "fumiarashi" + }, + "踏み荒せ": { + "w_type": "conjugated godan verb", + "romaji": "fumiarase" + }, + "踏み荒そ": { + "w_type": "godan verb stem", + "romaji": "fumiaraso" + }, + "踏み荒した": { + "w_type": "conjugated godan verb", + "romaji": "fumiarashita" + }, + "踏み荒して": { + "w_type": "conjugated godan verb", + "romaji": "fumiarashite" + }, + "泣き落とさ": { + "w_type": "godan verb stem", + "romaji": "nakiotosa" + }, + "泣き落とし": { + "w_type": "godan verb stem", + "romaji": "nakiotoshi" + }, + "泣き落とせ": { + "w_type": "conjugated godan verb", + "romaji": "nakiotose" + }, + "泣き落とそ": { + "w_type": "godan verb stem", + "romaji": "nakiotoso" + }, + "泣き落とした": { + "w_type": "conjugated godan verb", + "romaji": "nakiotoshita" + }, + "泣き落として": { + "w_type": "conjugated godan verb", + "romaji": "nakiotoshite" + }, + "野次ら": { + "w_type": "godan verb stem", + "romaji": "yajira" + }, + "野次り": { + "w_type": "godan verb stem", + "romaji": "yajiri" + }, + "野次れ": { + "w_type": "conjugated godan verb", + "romaji": "yajire" + }, + "野次ろ": { + "w_type": "godan verb stem", + "romaji": "yajiro" + }, + "野次った": { + "w_type": "conjugated godan verb", + "romaji": "yajitta" + }, + "野次って": { + "w_type": "conjugated godan verb", + "romaji": "yajitte" + }, + "貶ま": { + "w_type": "godan verb stem", + "romaji": "sagesuma" + }, + "貶み": { + "w_type": "godan verb stem", + "romaji": "sagesumi" + }, + "貶め": { + "w_type": "conjugated godan verb", + "romaji": "sagesume" + }, + "貶も": { + "w_type": "godan verb stem", + "romaji": "sagesumo" + }, + "貶んだ": { + "w_type": "conjugated godan verb", + "romaji": "sagesunda" + }, + "貶んで": { + "w_type": "conjugated godan verb", + "romaji": "sagesunde" + }, + "泣潰さ": { + "w_type": "godan verb stem", + "romaji": "nakitsubusa" + }, + "泣潰し": { + "w_type": "godan verb stem", + "romaji": "nakitsubushi" + }, + "泣潰せ": { + "w_type": "conjugated godan verb", + "romaji": "nakitsubuse" + }, + "泣潰そ": { + "w_type": "godan verb stem", + "romaji": "nakitsubuso" + }, + "泣潰した": { + "w_type": "conjugated godan verb", + "romaji": "nakitsubushita" + }, + "泣潰して": { + "w_type": "conjugated godan verb", + "romaji": "nakitsubushite" + }, + "名告ら": { + "w_type": "godan verb stem", + "romaji": "nanora" + }, + "名告り": { + "w_type": "godan verb stem", + "romaji": "nanori" + }, + "名告れ": { + "w_type": "conjugated godan verb", + "romaji": "nanore" + }, + "名告ろ": { + "w_type": "godan verb stem", + "romaji": "nanoro" + }, + "名告った": { + "w_type": "conjugated godan verb", + "romaji": "nanotta" + }, + "名告って": { + "w_type": "conjugated godan verb", + "romaji": "nanotte" + }, + "出かから": { + "w_type": "godan verb stem", + "romaji": "dekakara" + }, + "出かかり": { + "w_type": "godan verb stem", + "romaji": "dekakari" + }, + "出かかれ": { + "w_type": "conjugated godan verb", + "romaji": "dekakare" + }, + "出かかろ": { + "w_type": "godan verb stem", + "romaji": "dekakaro" + }, + "出かかった": { + "w_type": "conjugated godan verb", + "romaji": "dekakatta" + }, + "出かかって": { + "w_type": "conjugated godan verb", + "romaji": "dekakatte" + }, + "交わし合わ": { + "w_type": "godan verb stem", + "romaji": "kawashiawa" + }, + "交わし合い": { + "w_type": "godan verb stem", + "romaji": "kawashiai" + }, + "交わし合え": { + "w_type": "conjugated godan verb", + "romaji": "kawashiae" + }, + "交わし合お": { + "w_type": "godan verb stem", + "romaji": "kawashiao" + }, + "交わし合った": { + "w_type": "conjugated godan verb", + "romaji": "kawashiatta" + }, + "交わし合って": { + "w_type": "conjugated godan verb", + "romaji": "kawashiatte" + }, + "言聞かさ": { + "w_type": "godan verb stem", + "romaji": "iikikasa" + }, + "言聞かし": { + "w_type": "godan verb stem", + "romaji": "iikikashi" + }, + "言聞かせ": { + "w_type": "conjugated godan verb", + "romaji": "iikikase" + }, + "言聞かそ": { + "w_type": "godan verb stem", + "romaji": "iikikaso" + }, + "言聞かした": { + "w_type": "conjugated godan verb", + "romaji": "iikikashita" + }, + "言聞かして": { + "w_type": "conjugated godan verb", + "romaji": "iikikashite" + }, + "貶さ": { + "w_type": "godan verb stem", + "romaji": "kenasa" + }, + "貶し": { + "w_type": "godan verb stem", + "romaji": "kenashi" + }, + "貶せ": { + "w_type": "conjugated godan verb", + "romaji": "kenase" + }, + "貶そ": { + "w_type": "godan verb stem", + "romaji": "kenaso" + }, + "貶した": { + "w_type": "conjugated godan verb", + "romaji": "kenashita" + }, + "貶して": { + "w_type": "conjugated godan verb", + "romaji": "kenashite" + }, + "塗りつぶさ": { + "w_type": "godan verb stem", + "romaji": "nuritsubusa" + }, + "塗りつぶし": { + "w_type": "godan verb stem", + "romaji": "nuritsubushi" + }, + "塗りつぶせ": { + "w_type": "conjugated godan verb", + "romaji": "nuritsubuse" + }, + "塗りつぶそ": { + "w_type": "godan verb stem", + "romaji": "nuritsubuso" + }, + "塗りつぶした": { + "w_type": "conjugated godan verb", + "romaji": "nuritsubushita" + }, + "塗りつぶして": { + "w_type": "conjugated godan verb", + "romaji": "nuritsubushite" + }, + "縫いなおさ": { + "w_type": "godan verb stem", + "romaji": "nuinaosa" + }, + "縫いなおし": { + "w_type": "godan verb stem", + "romaji": "nuinaoshi" + }, + "縫いなおせ": { + "w_type": "conjugated godan verb", + "romaji": "nuinaose" + }, + "縫いなおそ": { + "w_type": "godan verb stem", + "romaji": "nuinaoso" + }, + "縫いなおした": { + "w_type": "conjugated godan verb", + "romaji": "nuinaoshita" + }, + "縫いなおして": { + "w_type": "conjugated godan verb", + "romaji": "nuinaoshite" + }, + "連れて行か": { + "w_type": "godan verb stem", + "romaji": "tsureteika" + }, + "連れて行き": { + "w_type": "godan verb stem", + "romaji": "tsureteiki" + }, + "連れて行け": { + "w_type": "conjugated godan verb", + "romaji": "tsureteike" + }, + "連れて行こ": { + "w_type": "godan verb stem", + "romaji": "tsureteiko" + }, + "連れて行いた": { + "w_type": "conjugated godan verb", + "romaji": "tsureteiita" + }, + "連れて行いて": { + "w_type": "conjugated godan verb", + "romaji": "tsureteiite" + }, + "取殺さ": { + "w_type": "godan verb stem", + "romaji": "torikorosa" + }, + "取殺し": { + "w_type": "godan verb stem", + "romaji": "torikoroshi" + }, + "取殺せ": { + "w_type": "conjugated godan verb", + "romaji": "torikorose" + }, + "取殺そ": { + "w_type": "godan verb stem", + "romaji": "torikoroso" + }, + "取殺した": { + "w_type": "conjugated godan verb", + "romaji": "torikoroshita" + }, + "取殺して": { + "w_type": "conjugated godan verb", + "romaji": "torikoroshite" + }, + "飛ばさ": { + "w_type": "godan verb stem", + "romaji": "tobasa" + }, + "飛ばし": { + "w_type": "godan verb stem", + "romaji": "tobashi" + }, + "飛ばせ": { + "w_type": "conjugated godan verb", + "romaji": "tobase" + }, + "飛ばそ": { + "w_type": "godan verb stem", + "romaji": "tobaso" + }, + "飛ばした": { + "w_type": "conjugated godan verb", + "romaji": "tobashita" + }, + "飛ばして": { + "w_type": "conjugated godan verb", + "romaji": "tobashite" + }, + "翻筋斗打た": { + "w_type": "godan verb stem", + "romaji": "mondoriuta" + }, + "翻筋斗打ち": { + "w_type": "godan verb stem", + "romaji": "mondoriuchi" + }, + "翻筋斗打て": { + "w_type": "conjugated godan verb", + "romaji": "mondoriute" + }, + "翻筋斗打と": { + "w_type": "godan verb stem", + "romaji": "mondoriuto" + }, + "翻筋斗打った": { + "w_type": "conjugated godan verb", + "romaji": "mondoriutta" + }, + "翻筋斗打って": { + "w_type": "conjugated godan verb", + "romaji": "mondoriutte" + }, + "掴み合わ": { + "w_type": "godan verb stem", + "romaji": "tsukamiawa" + }, + "掴み合い": { + "w_type": "godan verb stem", + "romaji": "tsukamiai" + }, + "掴み合え": { + "w_type": "conjugated godan verb", + "romaji": "tsukamiae" + }, + "掴み合お": { + "w_type": "godan verb stem", + "romaji": "tsukamiao" + }, + "掴み合った": { + "w_type": "conjugated godan verb", + "romaji": "tsukamiatta" + }, + "掴み合って": { + "w_type": "conjugated godan verb", + "romaji": "tsukamiatte" + }, + "引離さ": { + "w_type": "godan verb stem", + "romaji": "hikihanasa" + }, + "引離し": { + "w_type": "godan verb stem", + "romaji": "hikihanashi" + }, + "引離せ": { + "w_type": "conjugated godan verb", + "romaji": "hikihanase" + }, + "引離そ": { + "w_type": "godan verb stem", + "romaji": "hikihanaso" + }, + "引離した": { + "w_type": "conjugated godan verb", + "romaji": "hikihanashita" + }, + "引離して": { + "w_type": "conjugated godan verb", + "romaji": "hikihanashite" + }, + "融け込ま": { + "w_type": "godan verb stem", + "romaji": "tokekoma" + }, + "融け込み": { + "w_type": "godan verb stem", + "romaji": "tokekomi" + }, + "融け込め": { + "w_type": "conjugated godan verb", + "romaji": "tokekome" + }, + "融け込も": { + "w_type": "godan verb stem", + "romaji": "tokekomo" + }, + "融け込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tokekonda" + }, + "融け込んで": { + "w_type": "conjugated godan verb", + "romaji": "tokekonde" + }, + "ゆすり取ら": { + "w_type": "godan verb stem", + "romaji": "yusuritora" + }, + "ゆすり取り": { + "w_type": "godan verb stem", + "romaji": "yusuritori" + }, + "ゆすり取れ": { + "w_type": "conjugated godan verb", + "romaji": "yusuritore" + }, + "ゆすり取ろ": { + "w_type": "godan verb stem", + "romaji": "yusuritoro" + }, + "ゆすり取った": { + "w_type": "conjugated godan verb", + "romaji": "yusuritotta" + }, + "ゆすり取って": { + "w_type": "conjugated godan verb", + "romaji": "yusuritotte" + }, + "あきれ返ら": { + "w_type": "godan verb stem", + "romaji": "akirekaera" + }, + "あきれ返り": { + "w_type": "godan verb stem", + "romaji": "akirekaeri" + }, + "あきれ返れ": { + "w_type": "conjugated godan verb", + "romaji": "akirekaere" + }, + "あきれ返ろ": { + "w_type": "godan verb stem", + "romaji": "akirekaero" + }, + "あきれ返った": { + "w_type": "conjugated godan verb", + "romaji": "akirekaetta" + }, + "あきれ返って": { + "w_type": "conjugated godan verb", + "romaji": "akirekaette" + }, + "呑ま": { + "w_type": "godan verb stem", + "romaji": "noma" + }, + "呑み": { + "w_type": "godan verb stem", + "romaji": "nomi" + }, + "呑め": { + "w_type": "conjugated godan verb", + "romaji": "nome" + }, + "呑も": { + "w_type": "godan verb stem", + "romaji": "nomo" + }, + "呑んだ": { + "w_type": "conjugated godan verb", + "romaji": "nonda" + }, + "呑んで": { + "w_type": "conjugated godan verb", + "romaji": "nonde" + }, + "飛びかわ": { + "w_type": "godan verb stem", + "romaji": "tobikawa" + }, + "飛びかい": { + "w_type": "godan verb stem", + "romaji": "tobikai" + }, + "飛びかえ": { + "w_type": "conjugated godan verb", + "romaji": "tobikae" + }, + "飛びかお": { + "w_type": "godan verb stem", + "romaji": "tobikao" + }, + "飛びかった": { + "w_type": "conjugated godan verb", + "romaji": "tobikatta" + }, + "飛びかって": { + "w_type": "conjugated godan verb", + "romaji": "tobikatte" + }, + "貪り食わ": { + "w_type": "godan verb stem", + "romaji": "musaborikuwa" + }, + "貪り食い": { + "w_type": "godan verb stem", + "romaji": "musaborikui" + }, + "貪り食え": { + "w_type": "conjugated godan verb", + "romaji": "musaborikue" + }, + "貪り食お": { + "w_type": "godan verb stem", + "romaji": "musaborikuo" + }, + "貪り食った": { + "w_type": "conjugated godan verb", + "romaji": "musaborikutta" + }, + "貪り食って": { + "w_type": "conjugated godan verb", + "romaji": "musaborikutte" + }, + "降り掛ら": { + "w_type": "godan verb stem", + "romaji": "furikakara" + }, + "降り掛り": { + "w_type": "godan verb stem", + "romaji": "furikakari" + }, + "降り掛れ": { + "w_type": "conjugated godan verb", + "romaji": "furikakare" + }, + "降り掛ろ": { + "w_type": "godan verb stem", + "romaji": "furikakaro" + }, + "降り掛った": { + "w_type": "conjugated godan verb", + "romaji": "furikakatta" + }, + "降り掛って": { + "w_type": "conjugated godan verb", + "romaji": "furikakatte" + }, + "染込ま": { + "w_type": "godan verb stem", + "romaji": "shimikoma" + }, + "染込み": { + "w_type": "godan verb stem", + "romaji": "shimikomi" + }, + "染込め": { + "w_type": "conjugated godan verb", + "romaji": "shimikome" + }, + "染込も": { + "w_type": "godan verb stem", + "romaji": "shimikomo" + }, + "染込んだ": { + "w_type": "conjugated godan verb", + "romaji": "shimikonda" + }, + "染込んで": { + "w_type": "conjugated godan verb", + "romaji": "shimikonde" + }, + "慕わ": { + "w_type": "godan verb stem", + "romaji": "shitawa" + }, + "慕い": { + "w_type": "godan verb stem", + "romaji": "shitai" + }, + "慕え": { + "w_type": "conjugated godan verb", + "romaji": "shitae" + }, + "慕お": { + "w_type": "godan verb stem", + "romaji": "shitao" + }, + "慕った": { + "w_type": "conjugated godan verb", + "romaji": "shitatta" + }, + "慕って": { + "w_type": "conjugated godan verb", + "romaji": "shitatte" + }, + "跳び付か": { + "w_type": "godan verb stem", + "romaji": "tobitsuka" + }, + "跳び付き": { + "w_type": "godan verb stem", + "romaji": "tobitsuki" + }, + "跳び付け": { + "w_type": "conjugated godan verb", + "romaji": "tobitsuke" + }, + "跳び付こ": { + "w_type": "godan verb stem", + "romaji": "tobitsuko" + }, + "跳び付いた": { + "w_type": "conjugated godan verb", + "romaji": "tobitsuita" + }, + "跳び付いて": { + "w_type": "conjugated godan verb", + "romaji": "tobitsuite" + }, + "愚図付か": { + "w_type": "godan verb stem", + "romaji": "guzutsuka" + }, + "愚図付き": { + "w_type": "godan verb stem", + "romaji": "guzutsuki" + }, + "愚図付け": { + "w_type": "conjugated godan verb", + "romaji": "guzutsuke" + }, + "愚図付こ": { + "w_type": "godan verb stem", + "romaji": "guzutsuko" + }, + "愚図付いた": { + "w_type": "conjugated godan verb", + "romaji": "guzutsuita" + }, + "愚図付いて": { + "w_type": "conjugated godan verb", + "romaji": "guzutsuite" + }, + "言い放た": { + "w_type": "godan verb stem", + "romaji": "iihanata" + }, + "言い放ち": { + "w_type": "godan verb stem", + "romaji": "iihanachi" + }, + "言い放て": { + "w_type": "conjugated godan verb", + "romaji": "iihanate" + }, + "言い放と": { + "w_type": "godan verb stem", + "romaji": "iihanato" + }, + "言い放った": { + "w_type": "conjugated godan verb", + "romaji": "iihanatta" + }, + "言い放って": { + "w_type": "conjugated godan verb", + "romaji": "iihanatte" + }, + "取り去ら": { + "w_type": "godan verb stem", + "romaji": "torisara" + }, + "取り去り": { + "w_type": "godan verb stem", + "romaji": "torisari" + }, + "取り去れ": { + "w_type": "conjugated godan verb", + "romaji": "torisare" + }, + "取り去ろ": { + "w_type": "godan verb stem", + "romaji": "torisaro" + }, + "取り去った": { + "w_type": "conjugated godan verb", + "romaji": "torisatta" + }, + "取り去って": { + "w_type": "conjugated godan verb", + "romaji": "torisatte" + }, + "凍てつか": { + "w_type": "godan verb stem", + "romaji": "itetsuka" + }, + "凍てつき": { + "w_type": "godan verb stem", + "romaji": "itetsuki" + }, + "凍てつけ": { + "w_type": "conjugated godan verb", + "romaji": "itetsuke" + }, + "凍てつこ": { + "w_type": "godan verb stem", + "romaji": "itetsuko" + }, + "凍てついた": { + "w_type": "conjugated godan verb", + "romaji": "itetsuita" + }, + "凍てついて": { + "w_type": "conjugated godan verb", + "romaji": "itetsuite" + }, + "晴れ上がら": { + "w_type": "godan verb stem", + "romaji": "hareagara" + }, + "晴れ上がり": { + "w_type": "godan verb stem", + "romaji": "hareagari" + }, + "晴れ上がれ": { + "w_type": "conjugated godan verb", + "romaji": "hareagare" + }, + "晴れ上がろ": { + "w_type": "godan verb stem", + "romaji": "hareagaro" + }, + "晴れ上がった": { + "w_type": "conjugated godan verb", + "romaji": "hareagatta" + }, + "晴れ上がって": { + "w_type": "conjugated godan verb", + "romaji": "hareagatte" + }, + "炊か": { + "w_type": "godan verb stem", + "romaji": "taka" + }, + "炊き": { + "w_type": "godan verb stem", + "romaji": "taki" + }, + "炊け": { + "w_type": "conjugated godan verb", + "romaji": "take" + }, + "炊こ": { + "w_type": "godan verb stem", + "romaji": "tako" + }, + "炊いた": { + "w_type": "conjugated godan verb", + "romaji": "taita" + }, + "炊いて": { + "w_type": "conjugated godan verb", + "romaji": "taite" + }, + "引っ込まさ": { + "w_type": "godan verb stem", + "romaji": "hikkomasa" + }, + "引っ込まし": { + "w_type": "godan verb stem", + "romaji": "hikkomashi" + }, + "引っ込ませ": { + "w_type": "conjugated godan verb", + "romaji": "hikkomase" + }, + "引っ込まそ": { + "w_type": "godan verb stem", + "romaji": "hikkomaso" + }, + "引っ込ました": { + "w_type": "conjugated godan verb", + "romaji": "hikkomashita" + }, + "引っ込まして": { + "w_type": "conjugated godan verb", + "romaji": "hikkomashite" + }, + "追いやら": { + "w_type": "godan verb stem", + "romaji": "oiyara" + }, + "追いやり": { + "w_type": "godan verb stem", + "romaji": "oiyari" + }, + "追いやれ": { + "w_type": "conjugated godan verb", + "romaji": "oiyare" + }, + "追いやろ": { + "w_type": "godan verb stem", + "romaji": "oiyaro" + }, + "追いやった": { + "w_type": "conjugated godan verb", + "romaji": "oiyatta" + }, + "追いやって": { + "w_type": "conjugated godan verb", + "romaji": "oiyatte" + }, + "間誤付か": { + "w_type": "godan verb stem", + "romaji": "magotsuka" + }, + "間誤付き": { + "w_type": "godan verb stem", + "romaji": "magotsuki" + }, + "間誤付け": { + "w_type": "conjugated godan verb", + "romaji": "magotsuke" + }, + "間誤付こ": { + "w_type": "godan verb stem", + "romaji": "magotsuko" + }, + "間誤付いた": { + "w_type": "conjugated godan verb", + "romaji": "magotsuita" + }, + "間誤付いて": { + "w_type": "conjugated godan verb", + "romaji": "magotsuite" + }, + "立ち返ら": { + "w_type": "godan verb stem", + "romaji": "tachikaera" + }, + "立ち返り": { + "w_type": "godan verb stem", + "romaji": "tachikaeri" + }, + "立ち返れ": { + "w_type": "conjugated godan verb", + "romaji": "tachikaere" + }, + "立ち返ろ": { + "w_type": "godan verb stem", + "romaji": "tachikaero" + }, + "立ち返った": { + "w_type": "conjugated godan verb", + "romaji": "tachikaetta" + }, + "立ち返って": { + "w_type": "conjugated godan verb", + "romaji": "tachikaette" + }, + "寝取ら": { + "w_type": "godan verb stem", + "romaji": "netora" + }, + "寝取り": { + "w_type": "godan verb stem", + "romaji": "netori" + }, + "寝取れ": { + "w_type": "conjugated godan verb", + "romaji": "netore" + }, + "寝取ろ": { + "w_type": "godan verb stem", + "romaji": "netoro" + }, + "寝取った": { + "w_type": "conjugated godan verb", + "romaji": "netotta" + }, + "寝取って": { + "w_type": "conjugated godan verb", + "romaji": "netotte" + }, + "追い返さ": { + "w_type": "godan verb stem", + "romaji": "oikaesa" + }, + "追い返し": { + "w_type": "godan verb stem", + "romaji": "oikaeshi" + }, + "追い返せ": { + "w_type": "conjugated godan verb", + "romaji": "oikaese" + }, + "追い返そ": { + "w_type": "godan verb stem", + "romaji": "oikaeso" + }, + "追い返した": { + "w_type": "conjugated godan verb", + "romaji": "oikaeshita" + }, + "追い返して": { + "w_type": "conjugated godan verb", + "romaji": "oikaeshite" + }, + "押っ立た": { + "w_type": "godan verb stem", + "romaji": "ottata" + }, + "押っ立ち": { + "w_type": "godan verb stem", + "romaji": "ottachi" + }, + "押っ立て": { + "w_type": "conjugated godan verb", + "romaji": "ottate" + }, + "押っ立と": { + "w_type": "godan verb stem", + "romaji": "ottato" + }, + "押っ立った": { + "w_type": "conjugated godan verb", + "romaji": "ottatta" + }, + "押っ立って": { + "w_type": "conjugated godan verb", + "romaji": "ottatte" + }, + "踏ま": { + "w_type": "godan verb stem", + "romaji": "fuma" + }, + "踏み": { + "w_type": "godan verb stem", + "romaji": "fumi" + }, + "踏め": { + "w_type": "conjugated godan verb", + "romaji": "fume" + }, + "踏も": { + "w_type": "godan verb stem", + "romaji": "fumo" + }, + "踏んだ": { + "w_type": "conjugated godan verb", + "romaji": "funda" + }, + "踏んで": { + "w_type": "conjugated godan verb", + "romaji": "funde" + }, + "引き摺ら": { + "w_type": "godan verb stem", + "romaji": "hikizura" + }, + "引き摺り": { + "w_type": "godan verb stem", + "romaji": "hikizuri" + }, + "引き摺れ": { + "w_type": "conjugated godan verb", + "romaji": "hikizure" + }, + "引き摺ろ": { + "w_type": "godan verb stem", + "romaji": "hikizuro" + }, + "引き摺った": { + "w_type": "conjugated godan verb", + "romaji": "hikizutta" + }, + "引き摺って": { + "w_type": "conjugated godan verb", + "romaji": "hikizutte" + }, + "勾引さ": { + "w_type": "godan verb stem", + "romaji": "kadowasa" + }, + "勾引し": { + "w_type": "godan verb stem", + "romaji": "kadowashi" + }, + "勾引せ": { + "w_type": "conjugated godan verb", + "romaji": "kadowase" + }, + "勾引そ": { + "w_type": "godan verb stem", + "romaji": "kadowaso" + }, + "勾引した": { + "w_type": "conjugated godan verb", + "romaji": "kadowashita" + }, + "勾引して": { + "w_type": "conjugated godan verb", + "romaji": "kadowashite" + }, + "見てとら": { + "w_type": "godan verb stem", + "romaji": "mitetora" + }, + "見てとり": { + "w_type": "godan verb stem", + "romaji": "mitetori" + }, + "見てとれ": { + "w_type": "conjugated godan verb", + "romaji": "mitetore" + }, + "見てとろ": { + "w_type": "godan verb stem", + "romaji": "mitetoro" + }, + "見てとった": { + "w_type": "conjugated godan verb", + "romaji": "mitetotta" + }, + "見てとって": { + "w_type": "conjugated godan verb", + "romaji": "mitetotte" + }, + "見損なわ": { + "w_type": "godan verb stem", + "romaji": "misokonawa" + }, + "見損ない": { + "w_type": "godan verb stem", + "romaji": "misokonai" + }, + "見損なえ": { + "w_type": "conjugated godan verb", + "romaji": "misokonae" + }, + "見損なお": { + "w_type": "godan verb stem", + "romaji": "misokonao" + }, + "見損なった": { + "w_type": "conjugated godan verb", + "romaji": "misokonatta" + }, + "見損なって": { + "w_type": "conjugated godan verb", + "romaji": "misokonatte" + }, + "一席打た": { + "w_type": "godan verb stem", + "romaji": "issekibuta" + }, + "一席打ち": { + "w_type": "godan verb stem", + "romaji": "issekibuchi" + }, + "一席打て": { + "w_type": "conjugated godan verb", + "romaji": "issekibute" + }, + "一席打と": { + "w_type": "godan verb stem", + "romaji": "issekibuto" + }, + "一席打った": { + "w_type": "conjugated godan verb", + "romaji": "issekibutta" + }, + "一席打って": { + "w_type": "conjugated godan verb", + "romaji": "issekibutte" + }, + "ごった返さ": { + "w_type": "godan verb stem", + "romaji": "gottagaesa" + }, + "ごった返し": { + "w_type": "godan verb stem", + "romaji": "gottagaeshi" + }, + "ごった返せ": { + "w_type": "conjugated godan verb", + "romaji": "gottagaese" + }, + "ごった返そ": { + "w_type": "godan verb stem", + "romaji": "gottagaeso" + }, + "ごった返した": { + "w_type": "conjugated godan verb", + "romaji": "gottagaeshita" + }, + "ごった返して": { + "w_type": "conjugated godan verb", + "romaji": "gottagaeshite" + }, + "言囃さ": { + "w_type": "godan verb stem", + "romaji": "iihayasa" + }, + "言囃し": { + "w_type": "godan verb stem", + "romaji": "iihayashi" + }, + "言囃せ": { + "w_type": "conjugated godan verb", + "romaji": "iihayase" + }, + "言囃そ": { + "w_type": "godan verb stem", + "romaji": "iihayaso" + }, + "言囃した": { + "w_type": "conjugated godan verb", + "romaji": "iihayashita" + }, + "言囃して": { + "w_type": "conjugated godan verb", + "romaji": "iihayashite" + }, + "つれ帰ら": { + "w_type": "godan verb stem", + "romaji": "tsurekaera" + }, + "つれ帰り": { + "w_type": "godan verb stem", + "romaji": "tsurekaeri" + }, + "つれ帰れ": { + "w_type": "conjugated godan verb", + "romaji": "tsurekaere" + }, + "つれ帰ろ": { + "w_type": "godan verb stem", + "romaji": "tsurekaero" + }, + "つれ帰った": { + "w_type": "conjugated godan verb", + "romaji": "tsurekaetta" + }, + "つれ帰って": { + "w_type": "conjugated godan verb", + "romaji": "tsurekaette" + }, + "書き飛ばさ": { + "w_type": "godan verb stem", + "romaji": "kakitobasa" + }, + "書き飛ばし": { + "w_type": "godan verb stem", + "romaji": "kakitobashi" + }, + "書き飛ばせ": { + "w_type": "conjugated godan verb", + "romaji": "kakitobase" + }, + "書き飛ばそ": { + "w_type": "godan verb stem", + "romaji": "kakitobaso" + }, + "書き飛ばした": { + "w_type": "conjugated godan verb", + "romaji": "kakitobashita" + }, + "書き飛ばして": { + "w_type": "conjugated godan verb", + "romaji": "kakitobashite" + }, + "邀え撃た": { + "w_type": "godan verb stem", + "romaji": "mukaeuta" + }, + "邀え撃ち": { + "w_type": "godan verb stem", + "romaji": "mukaeuchi" + }, + "邀え撃て": { + "w_type": "conjugated godan verb", + "romaji": "mukaeute" + }, + "邀え撃と": { + "w_type": "godan verb stem", + "romaji": "mukaeuto" + }, + "邀え撃った": { + "w_type": "conjugated godan verb", + "romaji": "mukaeutta" + }, + "邀え撃って": { + "w_type": "conjugated godan verb", + "romaji": "mukaeutte" + }, + "挾ま": { + "w_type": "godan verb stem", + "romaji": "hasama" + }, + "挾み": { + "w_type": "godan verb stem", + "romaji": "hasami" + }, + "挾め": { + "w_type": "conjugated godan verb", + "romaji": "hasame" + }, + "挾も": { + "w_type": "godan verb stem", + "romaji": "hasamo" + }, + "挾んだ": { + "w_type": "conjugated godan verb", + "romaji": "hasanda" + }, + "挾んで": { + "w_type": "conjugated godan verb", + "romaji": "hasande" + }, + "迫上がら": { + "w_type": "godan verb stem", + "romaji": "seriagara" + }, + "迫上がり": { + "w_type": "godan verb stem", + "romaji": "seriagari" + }, + "迫上がれ": { + "w_type": "conjugated godan verb", + "romaji": "seriagare" + }, + "迫上がろ": { + "w_type": "godan verb stem", + "romaji": "seriagaro" + }, + "迫上がった": { + "w_type": "conjugated godan verb", + "romaji": "seriagatta" + }, + "迫上がって": { + "w_type": "conjugated godan verb", + "romaji": "seriagatte" + }, + "空嘯か": { + "w_type": "godan verb stem", + "romaji": "sorausobuka" + }, + "空嘯き": { + "w_type": "godan verb stem", + "romaji": "sorausobuki" + }, + "空嘯け": { + "w_type": "conjugated godan verb", + "romaji": "sorausobuke" + }, + "空嘯こ": { + "w_type": "godan verb stem", + "romaji": "sorausobuko" + }, + "空嘯いた": { + "w_type": "conjugated godan verb", + "romaji": "sorausobuita" + }, + "空嘯いて": { + "w_type": "conjugated godan verb", + "romaji": "sorausobuite" + }, + "見まわさ": { + "w_type": "godan verb stem", + "romaji": "mimawasa" + }, + "見まわし": { + "w_type": "godan verb stem", + "romaji": "mimawashi" + }, + "見まわせ": { + "w_type": "conjugated godan verb", + "romaji": "mimawase" + }, + "見まわそ": { + "w_type": "godan verb stem", + "romaji": "mimawaso" + }, + "見まわした": { + "w_type": "conjugated godan verb", + "romaji": "mimawashita" + }, + "見まわして": { + "w_type": "conjugated godan verb", + "romaji": "mimawashite" + }, + "乗り潰さ": { + "w_type": "godan verb stem", + "romaji": "noritsubusa" + }, + "乗り潰し": { + "w_type": "godan verb stem", + "romaji": "noritsubushi" + }, + "乗り潰せ": { + "w_type": "conjugated godan verb", + "romaji": "noritsubuse" + }, + "乗り潰そ": { + "w_type": "godan verb stem", + "romaji": "noritsubuso" + }, + "乗り潰した": { + "w_type": "conjugated godan verb", + "romaji": "noritsubushita" + }, + "乗り潰して": { + "w_type": "conjugated godan verb", + "romaji": "noritsubushite" + }, + "割り出さ": { + "w_type": "godan verb stem", + "romaji": "waridasa" + }, + "割り出し": { + "w_type": "godan verb stem", + "romaji": "waridashi" + }, + "割り出せ": { + "w_type": "conjugated godan verb", + "romaji": "waridase" + }, + "割り出そ": { + "w_type": "godan verb stem", + "romaji": "waridaso" + }, + "割り出した": { + "w_type": "conjugated godan verb", + "romaji": "waridashita" + }, + "割り出して": { + "w_type": "conjugated godan verb", + "romaji": "waridashite" + }, + "攫わ": { + "w_type": "godan verb stem", + "romaji": "sarawa" + }, + "攫い": { + "w_type": "godan verb stem", + "romaji": "sarai" + }, + "攫え": { + "w_type": "conjugated godan verb", + "romaji": "sarae" + }, + "攫お": { + "w_type": "godan verb stem", + "romaji": "sarao" + }, + "攫った": { + "w_type": "conjugated godan verb", + "romaji": "saratta" + }, + "攫って": { + "w_type": "conjugated godan verb", + "romaji": "saratte" + }, + "挙ら": { + "w_type": "godan verb stem", + "romaji": "kozora" + }, + "挙り": { + "w_type": "godan verb stem", + "romaji": "kozori" + }, + "挙れ": { + "w_type": "conjugated godan verb", + "romaji": "kozore" + }, + "挙ろ": { + "w_type": "godan verb stem", + "romaji": "kozoro" + }, + "挙った": { + "w_type": "conjugated godan verb", + "romaji": "kozotta" + }, + "挙って": { + "w_type": "conjugated godan verb", + "romaji": "kozotte" + }, + "心づか": { + "w_type": "godan verb stem", + "romaji": "kokorozuka" + }, + "心づき": { + "w_type": "godan verb stem", + "romaji": "kokorozuki" + }, + "心づけ": { + "w_type": "conjugated godan verb", + "romaji": "kokorozuke" + }, + "心づこ": { + "w_type": "godan verb stem", + "romaji": "kokorozuko" + }, + "心づいた": { + "w_type": "conjugated godan verb", + "romaji": "kokorozuita" + }, + "心づいて": { + "w_type": "conjugated godan verb", + "romaji": "kokorozuite" + }, + "断ら": { + "w_type": "godan verb stem", + "romaji": "kotowara" + }, + "断り": { + "w_type": "godan verb stem", + "romaji": "kotowari" + }, + "断れ": { + "w_type": "conjugated godan verb", + "romaji": "kotoware" + }, + "断ろ": { + "w_type": "godan verb stem", + "romaji": "kotowaro" + }, + "断った": { + "w_type": "conjugated godan verb", + "romaji": "kotowatta" + }, + "断って": { + "w_type": "conjugated godan verb", + "romaji": "kotowatte" + }, + "言散らさ": { + "w_type": "godan verb stem", + "romaji": "iichirasa" + }, + "言散らし": { + "w_type": "godan verb stem", + "romaji": "iichirashi" + }, + "言散らせ": { + "w_type": "conjugated godan verb", + "romaji": "iichirase" + }, + "言散らそ": { + "w_type": "godan verb stem", + "romaji": "iichiraso" + }, + "言散らした": { + "w_type": "conjugated godan verb", + "romaji": "iichirashita" + }, + "言散らして": { + "w_type": "conjugated godan verb", + "romaji": "iichirashite" + }, + "感情に走ら": { + "w_type": "godan verb stem", + "romaji": "kanjounihashira" + }, + "感情に走り": { + "w_type": "godan verb stem", + "romaji": "kanjounihashiri" + }, + "感情に走れ": { + "w_type": "conjugated godan verb", + "romaji": "kanjounihashire" + }, + "感情に走ろ": { + "w_type": "godan verb stem", + "romaji": "kanjounihashiro" + }, + "感情に走った": { + "w_type": "conjugated godan verb", + "romaji": "kanjounihashitta" + }, + "感情に走って": { + "w_type": "conjugated godan verb", + "romaji": "kanjounihashitte" + }, + "喜歌わ": { + "w_type": "godan verb stem", + "romaji": "yorokobiutawa" + }, + "喜歌い": { + "w_type": "godan verb stem", + "romaji": "yorokobiutai" + }, + "喜歌え": { + "w_type": "conjugated godan verb", + "romaji": "yorokobiutae" + }, + "喜歌お": { + "w_type": "godan verb stem", + "romaji": "yorokobiutao" + }, + "喜歌った": { + "w_type": "conjugated godan verb", + "romaji": "yorokobiutatta" + }, + "喜歌って": { + "w_type": "conjugated godan verb", + "romaji": "yorokobiutatte" + }, + "刈り葺か": { + "w_type": "godan verb stem", + "romaji": "karifuka" + }, + "刈り葺き": { + "w_type": "godan verb stem", + "romaji": "karifuki" + }, + "刈り葺け": { + "w_type": "conjugated godan verb", + "romaji": "karifuke" + }, + "刈り葺こ": { + "w_type": "godan verb stem", + "romaji": "karifuko" + }, + "刈り葺いた": { + "w_type": "conjugated godan verb", + "romaji": "karifuita" + }, + "刈り葺いて": { + "w_type": "conjugated godan verb", + "romaji": "karifuite" + }, + "俟た": { + "w_type": "godan verb stem", + "romaji": "mata" + }, + "俟ち": { + "w_type": "godan verb stem", + "romaji": "machi" + }, + "俟て": { + "w_type": "conjugated godan verb", + "romaji": "mate" + }, + "俟と": { + "w_type": "godan verb stem", + "romaji": "mato" + }, + "俟った": { + "w_type": "conjugated godan verb", + "romaji": "matta" + }, + "俟って": { + "w_type": "conjugated godan verb", + "romaji": "matte" + }, + "噛み合わ": { + "w_type": "godan verb stem", + "romaji": "kamiawa" + }, + "噛み合い": { + "w_type": "godan verb stem", + "romaji": "kamiai" + }, + "噛み合え": { + "w_type": "conjugated godan verb", + "romaji": "kamiae" + }, + "噛み合お": { + "w_type": "godan verb stem", + "romaji": "kamiao" + }, + "噛み合った": { + "w_type": "conjugated godan verb", + "romaji": "kamiatta" + }, + "噛み合って": { + "w_type": "conjugated godan verb", + "romaji": "kamiatte" + }, + "溜め込ま": { + "w_type": "godan verb stem", + "romaji": "tamekoma" + }, + "溜め込み": { + "w_type": "godan verb stem", + "romaji": "tamekomi" + }, + "溜め込め": { + "w_type": "conjugated godan verb", + "romaji": "tamekome" + }, + "溜め込も": { + "w_type": "godan verb stem", + "romaji": "tamekomo" + }, + "溜め込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tamekonda" + }, + "溜め込んで": { + "w_type": "conjugated godan verb", + "romaji": "tamekonde" + }, + "上廻ら": { + "w_type": "godan verb stem", + "romaji": "uwamawara" + }, + "上廻り": { + "w_type": "godan verb stem", + "romaji": "uwamawari" + }, + "上廻れ": { + "w_type": "conjugated godan verb", + "romaji": "uwamaware" + }, + "上廻ろ": { + "w_type": "godan verb stem", + "romaji": "uwamawaro" + }, + "上廻った": { + "w_type": "conjugated godan verb", + "romaji": "uwamawatta" + }, + "上廻って": { + "w_type": "conjugated godan verb", + "romaji": "uwamawatte" + }, + "練歩か": { + "w_type": "godan verb stem", + "romaji": "neriaruka" + }, + "練歩き": { + "w_type": "godan verb stem", + "romaji": "neriaruki" + }, + "練歩け": { + "w_type": "conjugated godan verb", + "romaji": "neriaruke" + }, + "練歩こ": { + "w_type": "godan verb stem", + "romaji": "neriaruko" + }, + "練歩いた": { + "w_type": "conjugated godan verb", + "romaji": "neriaruita" + }, + "練歩いて": { + "w_type": "conjugated godan verb", + "romaji": "neriaruite" + }, + "乗り過ごさ": { + "w_type": "godan verb stem", + "romaji": "norisugosa" + }, + "乗り過ごし": { + "w_type": "godan verb stem", + "romaji": "norisugoshi" + }, + "乗り過ごせ": { + "w_type": "conjugated godan verb", + "romaji": "norisugose" + }, + "乗り過ごそ": { + "w_type": "godan verb stem", + "romaji": "norisugoso" + }, + "乗り過ごした": { + "w_type": "conjugated godan verb", + "romaji": "norisugoshita" + }, + "乗り過ごして": { + "w_type": "conjugated godan verb", + "romaji": "norisugoshite" + }, + "こね返さ": { + "w_type": "godan verb stem", + "romaji": "konekaesa" + }, + "こね返し": { + "w_type": "godan verb stem", + "romaji": "konekaeshi" + }, + "こね返せ": { + "w_type": "conjugated godan verb", + "romaji": "konekaese" + }, + "こね返そ": { + "w_type": "godan verb stem", + "romaji": "konekaeso" + }, + "こね返した": { + "w_type": "conjugated godan verb", + "romaji": "konekaeshita" + }, + "こね返して": { + "w_type": "conjugated godan verb", + "romaji": "konekaeshite" + }, + "通りすがら": { + "w_type": "godan verb stem", + "romaji": "toorisugara" + }, + "通りすがり": { + "w_type": "godan verb stem", + "romaji": "toorisugari" + }, + "通りすがれ": { + "w_type": "conjugated godan verb", + "romaji": "toorisugare" + }, + "通りすがろ": { + "w_type": "godan verb stem", + "romaji": "toorisugaro" + }, + "通りすがった": { + "w_type": "conjugated godan verb", + "romaji": "toorisugatta" + }, + "通りすがって": { + "w_type": "conjugated godan verb", + "romaji": "toorisugatte" + }, + "拭い去ら": { + "w_type": "godan verb stem", + "romaji": "nuguisara" + }, + "拭い去り": { + "w_type": "godan verb stem", + "romaji": "nuguisari" + }, + "拭い去れ": { + "w_type": "conjugated godan verb", + "romaji": "nuguisare" + }, + "拭い去ろ": { + "w_type": "godan verb stem", + "romaji": "nuguisaro" + }, + "拭い去った": { + "w_type": "conjugated godan verb", + "romaji": "nuguisatta" + }, + "拭い去って": { + "w_type": "conjugated godan verb", + "romaji": "nuguisatte" + }, + "佇ま": { + "w_type": "godan verb stem", + "romaji": "tatazuma" + }, + "佇み": { + "w_type": "godan verb stem", + "romaji": "tatazumi" + }, + "佇め": { + "w_type": "conjugated godan verb", + "romaji": "tatazume" + }, + "佇も": { + "w_type": "godan verb stem", + "romaji": "tatazumo" + }, + "佇んだ": { + "w_type": "conjugated godan verb", + "romaji": "tatazunda" + }, + "佇んで": { + "w_type": "conjugated godan verb", + "romaji": "tatazunde" + }, + "脈打た": { + "w_type": "godan verb stem", + "romaji": "myakuuta" + }, + "脈打ち": { + "w_type": "godan verb stem", + "romaji": "myakuuchi" + }, + "脈打て": { + "w_type": "conjugated godan verb", + "romaji": "myakuute" + }, + "脈打と": { + "w_type": "godan verb stem", + "romaji": "myakuuto" + }, + "脈打った": { + "w_type": "conjugated godan verb", + "romaji": "myakuutta" + }, + "脈打って": { + "w_type": "conjugated godan verb", + "romaji": "myakuutte" + }, + "差しかから": { + "w_type": "godan verb stem", + "romaji": "sashikakara" + }, + "差しかかり": { + "w_type": "godan verb stem", + "romaji": "sashikakari" + }, + "差しかかれ": { + "w_type": "conjugated godan verb", + "romaji": "sashikakare" + }, + "差しかかろ": { + "w_type": "godan verb stem", + "romaji": "sashikakaro" + }, + "差しかかった": { + "w_type": "conjugated godan verb", + "romaji": "sashikakatta" + }, + "差しかかって": { + "w_type": "conjugated godan verb", + "romaji": "sashikakatte" + }, + "噛まさ": { + "w_type": "godan verb stem", + "romaji": "kamasa" + }, + "噛まし": { + "w_type": "godan verb stem", + "romaji": "kamashi" + }, + "噛ませ": { + "w_type": "conjugated godan verb", + "romaji": "kamase" + }, + "噛まそ": { + "w_type": "godan verb stem", + "romaji": "kamaso" + }, + "噛ました": { + "w_type": "conjugated godan verb", + "romaji": "kamashita" + }, + "噛まして": { + "w_type": "conjugated godan verb", + "romaji": "kamashite" + }, + "額ずか": { + "w_type": "godan verb stem", + "romaji": "nukazuka" + }, + "額ずき": { + "w_type": "godan verb stem", + "romaji": "nukazuki" + }, + "額ずけ": { + "w_type": "conjugated godan verb", + "romaji": "nukazuke" + }, + "額ずこ": { + "w_type": "godan verb stem", + "romaji": "nukazuko" + }, + "額ずいた": { + "w_type": "conjugated godan verb", + "romaji": "nukazuita" + }, + "額ずいて": { + "w_type": "conjugated godan verb", + "romaji": "nukazuite" + }, + "組み合さ": { + "w_type": "godan verb stem", + "romaji": "kumiawasa" + }, + "組み合し": { + "w_type": "godan verb stem", + "romaji": "kumiawashi" + }, + "組み合せ": { + "w_type": "conjugated godan verb", + "romaji": "kumiawase" + }, + "組み合そ": { + "w_type": "godan verb stem", + "romaji": "kumiawaso" + }, + "組み合した": { + "w_type": "conjugated godan verb", + "romaji": "kumiawashita" + }, + "組み合して": { + "w_type": "conjugated godan verb", + "romaji": "kumiawashite" + }, + "組み合わ": { + "w_type": "godan verb stem", + "romaji": "kumiawa" + }, + "組み合い": { + "w_type": "godan verb stem", + "romaji": "kumiai" + }, + "組み合え": { + "w_type": "conjugated godan verb", + "romaji": "kumiae" + }, + "組み合お": { + "w_type": "godan verb stem", + "romaji": "kumiao" + }, + "組み合った": { + "w_type": "conjugated godan verb", + "romaji": "kumiatta" + }, + "組み合って": { + "w_type": "conjugated godan verb", + "romaji": "kumiatte" + }, + "扱使わ": { + "w_type": "godan verb stem", + "romaji": "kokitsukawa" + }, + "扱使い": { + "w_type": "godan verb stem", + "romaji": "kokitsukai" + }, + "扱使え": { + "w_type": "conjugated godan verb", + "romaji": "kokitsukae" + }, + "扱使お": { + "w_type": "godan verb stem", + "romaji": "kokitsukao" + }, + "扱使った": { + "w_type": "conjugated godan verb", + "romaji": "kokitsukatta" + }, + "扱使って": { + "w_type": "conjugated godan verb", + "romaji": "kokitsukatte" + }, + "張り倒さ": { + "w_type": "godan verb stem", + "romaji": "haritaosa" + }, + "張り倒し": { + "w_type": "godan verb stem", + "romaji": "haritaoshi" + }, + "張り倒せ": { + "w_type": "conjugated godan verb", + "romaji": "haritaose" + }, + "張り倒そ": { + "w_type": "godan verb stem", + "romaji": "haritaoso" + }, + "張り倒した": { + "w_type": "conjugated godan verb", + "romaji": "haritaoshita" + }, + "張り倒して": { + "w_type": "conjugated godan verb", + "romaji": "haritaoshite" + }, + "追い散らさ": { + "w_type": "godan verb stem", + "romaji": "oichirasa" + }, + "追い散らし": { + "w_type": "godan verb stem", + "romaji": "oichirashi" + }, + "追い散らせ": { + "w_type": "conjugated godan verb", + "romaji": "oichirase" + }, + "追い散らそ": { + "w_type": "godan verb stem", + "romaji": "oichiraso" + }, + "追い散らした": { + "w_type": "conjugated godan verb", + "romaji": "oichirashita" + }, + "追い散らして": { + "w_type": "conjugated godan verb", + "romaji": "oichirashite" + }, + "出し渋ら": { + "w_type": "godan verb stem", + "romaji": "dashishibura" + }, + "出し渋り": { + "w_type": "godan verb stem", + "romaji": "dashishiburi" + }, + "出し渋れ": { + "w_type": "conjugated godan verb", + "romaji": "dashishibure" + }, + "出し渋ろ": { + "w_type": "godan verb stem", + "romaji": "dashishiburo" + }, + "出し渋った": { + "w_type": "conjugated godan verb", + "romaji": "dashishibutta" + }, + "出し渋って": { + "w_type": "conjugated godan verb", + "romaji": "dashishibutte" + }, + "手伝わ": { + "w_type": "godan verb stem", + "romaji": "tetsudawa" + }, + "手伝い": { + "w_type": "godan verb stem", + "romaji": "tetsudai" + }, + "手伝え": { + "w_type": "conjugated godan verb", + "romaji": "tetsudae" + }, + "手伝お": { + "w_type": "godan verb stem", + "romaji": "tetsudao" + }, + "手伝った": { + "w_type": "conjugated godan verb", + "romaji": "tetsudatta" + }, + "手伝って": { + "w_type": "conjugated godan verb", + "romaji": "tetsudatte" + }, + "埋から": { + "w_type": "godan verb stem", + "romaji": "ikara" + }, + "埋かり": { + "w_type": "godan verb stem", + "romaji": "ikari" + }, + "埋かれ": { + "w_type": "conjugated godan verb", + "romaji": "ikare" + }, + "埋かろ": { + "w_type": "godan verb stem", + "romaji": "ikaro" + }, + "埋かった": { + "w_type": "conjugated godan verb", + "romaji": "ikatta" + }, + "埋かって": { + "w_type": "conjugated godan verb", + "romaji": "ikatte" + }, + "相照らさ": { + "w_type": "godan verb stem", + "romaji": "aiterasa" + }, + "相照らし": { + "w_type": "godan verb stem", + "romaji": "aiterashi" + }, + "相照らせ": { + "w_type": "conjugated godan verb", + "romaji": "aiterase" + }, + "相照らそ": { + "w_type": "godan verb stem", + "romaji": "aiteraso" + }, + "相照らした": { + "w_type": "conjugated godan verb", + "romaji": "aiterashita" + }, + "相照らして": { + "w_type": "conjugated godan verb", + "romaji": "aiterashite" + }, + "集わ": { + "w_type": "godan verb stem", + "romaji": "tsudowa" + }, + "集い": { + "w_type": "godan verb stem", + "romaji": "tsudoi" + }, + "集え": { + "w_type": "conjugated godan verb", + "romaji": "tsudoe" + }, + "集お": { + "w_type": "godan verb stem", + "romaji": "tsudoo" + }, + "集った": { + "w_type": "conjugated godan verb", + "romaji": "tsudotta" + }, + "集って": { + "w_type": "conjugated godan verb", + "romaji": "tsudotte" + }, + "降懸から": { + "w_type": "godan verb stem", + "romaji": "furikakara" + }, + "降懸かり": { + "w_type": "godan verb stem", + "romaji": "furikakari" + }, + "降懸かれ": { + "w_type": "conjugated godan verb", + "romaji": "furikakare" + }, + "降懸かろ": { + "w_type": "godan verb stem", + "romaji": "furikakaro" + }, + "降懸かった": { + "w_type": "conjugated godan verb", + "romaji": "furikakatta" + }, + "降懸かって": { + "w_type": "conjugated godan verb", + "romaji": "furikakatte" + }, + "煎ら": { + "w_type": "godan verb stem", + "romaji": "ira" + }, + "煎り": { + "w_type": "godan verb stem", + "romaji": "iri" + }, + "煎れ": { + "w_type": "conjugated godan verb", + "romaji": "ire" + }, + "煎ろ": { + "w_type": "godan verb stem", + "romaji": "iro" + }, + "煎った": { + "w_type": "conjugated godan verb", + "romaji": "itta" + }, + "煎って": { + "w_type": "conjugated godan verb", + "romaji": "itte" + }, + "引ん剥か": { + "w_type": "godan verb stem", + "romaji": "hinmuka" + }, + "引ん剥き": { + "w_type": "godan verb stem", + "romaji": "hinmuki" + }, + "引ん剥け": { + "w_type": "conjugated godan verb", + "romaji": "hinmuke" + }, + "引ん剥こ": { + "w_type": "godan verb stem", + "romaji": "hinmuko" + }, + "引ん剥いた": { + "w_type": "conjugated godan verb", + "romaji": "hinmuita" + }, + "引ん剥いて": { + "w_type": "conjugated godan verb", + "romaji": "hinmuite" + }, + "咬ま": { + "w_type": "godan verb stem", + "romaji": "kama" + }, + "咬み": { + "w_type": "godan verb stem", + "romaji": "kami" + }, + "咬め": { + "w_type": "conjugated godan verb", + "romaji": "kame" + }, + "咬も": { + "w_type": "godan verb stem", + "romaji": "kamo" + }, + "咬んだ": { + "w_type": "conjugated godan verb", + "romaji": "kanda" + }, + "咬んで": { + "w_type": "conjugated godan verb", + "romaji": "kande" + }, + "盛りあがら": { + "w_type": "godan verb stem", + "romaji": "moriagara" + }, + "盛りあがり": { + "w_type": "godan verb stem", + "romaji": "moriagari" + }, + "盛りあがれ": { + "w_type": "conjugated godan verb", + "romaji": "moriagare" + }, + "盛りあがろ": { + "w_type": "godan verb stem", + "romaji": "moriagaro" + }, + "盛りあがった": { + "w_type": "conjugated godan verb", + "romaji": "moriagatta" + }, + "盛りあがって": { + "w_type": "conjugated godan verb", + "romaji": "moriagatte" + }, + "刷ら": { + "w_type": "godan verb stem", + "romaji": "sura" + }, + "刷り": { + "w_type": "godan verb stem", + "romaji": "suri" + }, + "刷れ": { + "w_type": "conjugated godan verb", + "romaji": "sure" + }, + "刷ろ": { + "w_type": "godan verb stem", + "romaji": "suro" + }, + "刷った": { + "w_type": "conjugated godan verb", + "romaji": "sutta" + }, + "刷って": { + "w_type": "conjugated godan verb", + "romaji": "sutte" + }, + "塗りたくら": { + "w_type": "godan verb stem", + "romaji": "nuritakura" + }, + "塗りたくり": { + "w_type": "godan verb stem", + "romaji": "nuritakuri" + }, + "塗りたくれ": { + "w_type": "conjugated godan verb", + "romaji": "nuritakure" + }, + "塗りたくろ": { + "w_type": "godan verb stem", + "romaji": "nuritakuro" + }, + "塗りたくった": { + "w_type": "conjugated godan verb", + "romaji": "nuritakutta" + }, + "塗りたくって": { + "w_type": "conjugated godan verb", + "romaji": "nuritakutte" + }, + "蠢か": { + "w_type": "godan verb stem", + "romaji": "ugomeka" + }, + "蠢き": { + "w_type": "godan verb stem", + "romaji": "ugomeki" + }, + "蠢け": { + "w_type": "conjugated godan verb", + "romaji": "ugomeke" + }, + "蠢こ": { + "w_type": "godan verb stem", + "romaji": "ugomeko" + }, + "蠢いた": { + "w_type": "conjugated godan verb", + "romaji": "ugomeita" + }, + "蠢いて": { + "w_type": "conjugated godan verb", + "romaji": "ugomeite" + }, + "聞入ら": { + "w_type": "godan verb stem", + "romaji": "kikiira" + }, + "聞入り": { + "w_type": "godan verb stem", + "romaji": "kikiiri" + }, + "聞入れ": { + "w_type": "conjugated godan verb", + "romaji": "kikiire" + }, + "聞入ろ": { + "w_type": "godan verb stem", + "romaji": "kikiiro" + }, + "聞入った": { + "w_type": "conjugated godan verb", + "romaji": "kikiitta" + }, + "聞入って": { + "w_type": "conjugated godan verb", + "romaji": "kikiitte" + }, + "対わ": { + "w_type": "godan verb stem", + "romaji": "mukawa" + }, + "対い": { + "w_type": "godan verb stem", + "romaji": "mukai" + }, + "対え": { + "w_type": "conjugated godan verb", + "romaji": "mukae" + }, + "対お": { + "w_type": "godan verb stem", + "romaji": "mukao" + }, + "対った": { + "w_type": "conjugated godan verb", + "romaji": "mukatta" + }, + "対って": { + "w_type": "conjugated godan verb", + "romaji": "mukatte" + }, + "打ち倒さ": { + "w_type": "godan verb stem", + "romaji": "uchitaosa" + }, + "打ち倒し": { + "w_type": "godan verb stem", + "romaji": "uchitaoshi" + }, + "打ち倒せ": { + "w_type": "conjugated godan verb", + "romaji": "uchitaose" + }, + "打ち倒そ": { + "w_type": "godan verb stem", + "romaji": "uchitaoso" + }, + "打ち倒した": { + "w_type": "conjugated godan verb", + "romaji": "uchitaoshita" + }, + "打ち倒して": { + "w_type": "conjugated godan verb", + "romaji": "uchitaoshite" + }, + "押し合わ": { + "w_type": "godan verb stem", + "romaji": "oshiawa" + }, + "押し合い": { + "w_type": "godan verb stem", + "romaji": "oshiai" + }, + "押し合え": { + "w_type": "conjugated godan verb", + "romaji": "oshiae" + }, + "押し合お": { + "w_type": "godan verb stem", + "romaji": "oshiao" + }, + "押し合った": { + "w_type": "conjugated godan verb", + "romaji": "oshiatta" + }, + "押し合って": { + "w_type": "conjugated godan verb", + "romaji": "oshiatte" + }, + "引っぱりださ": { + "w_type": "godan verb stem", + "romaji": "hipparidasa" + }, + "引っぱりだし": { + "w_type": "godan verb stem", + "romaji": "hipparidashi" + }, + "引っぱりだせ": { + "w_type": "conjugated godan verb", + "romaji": "hipparidase" + }, + "引っぱりだそ": { + "w_type": "godan verb stem", + "romaji": "hipparidaso" + }, + "引っぱりだした": { + "w_type": "conjugated godan verb", + "romaji": "hipparidashita" + }, + "引っぱりだして": { + "w_type": "conjugated godan verb", + "romaji": "hipparidashite" + }, + "博さ": { + "w_type": "godan verb stem", + "romaji": "hakusa" + }, + "博し": { + "w_type": "godan verb stem", + "romaji": "hakushi" + }, + "博せ": { + "w_type": "conjugated godan verb", + "romaji": "hakuse" + }, + "博そ": { + "w_type": "godan verb stem", + "romaji": "hakuso" + }, + "博した": { + "w_type": "conjugated godan verb", + "romaji": "hakushita" + }, + "博して": { + "w_type": "conjugated godan verb", + "romaji": "hakushite" + }, + "褒め殺さ": { + "w_type": "godan verb stem", + "romaji": "homegorosa" + }, + "褒め殺し": { + "w_type": "godan verb stem", + "romaji": "homegoroshi" + }, + "褒め殺せ": { + "w_type": "conjugated godan verb", + "romaji": "homegorose" + }, + "褒め殺そ": { + "w_type": "godan verb stem", + "romaji": "homegoroso" + }, + "褒め殺した": { + "w_type": "conjugated godan verb", + "romaji": "homegoroshita" + }, + "褒め殺して": { + "w_type": "conjugated godan verb", + "romaji": "homegoroshite" + }, + "遣り合わ": { + "w_type": "godan verb stem", + "romaji": "yariawa" + }, + "遣り合い": { + "w_type": "godan verb stem", + "romaji": "yariai" + }, + "遣り合え": { + "w_type": "conjugated godan verb", + "romaji": "yariae" + }, + "遣り合お": { + "w_type": "godan verb stem", + "romaji": "yariao" + }, + "遣り合った": { + "w_type": "conjugated godan verb", + "romaji": "yariatta" + }, + "遣り合って": { + "w_type": "conjugated godan verb", + "romaji": "yariatte" + }, + "立ち向かわ": { + "w_type": "godan verb stem", + "romaji": "tachimukawa" + }, + "立ち向かい": { + "w_type": "godan verb stem", + "romaji": "tachimukai" + }, + "立ち向かえ": { + "w_type": "conjugated godan verb", + "romaji": "tachimukae" + }, + "立ち向かお": { + "w_type": "godan verb stem", + "romaji": "tachimukao" + }, + "立ち向かった": { + "w_type": "conjugated godan verb", + "romaji": "tachimukatta" + }, + "立ち向かって": { + "w_type": "conjugated godan verb", + "romaji": "tachimukatte" + }, + "在り付か": { + "w_type": "godan verb stem", + "romaji": "aritsuka" + }, + "在り付き": { + "w_type": "godan verb stem", + "romaji": "aritsuki" + }, + "在り付け": { + "w_type": "conjugated godan verb", + "romaji": "aritsuke" + }, + "在り付こ": { + "w_type": "godan verb stem", + "romaji": "aritsuko" + }, + "在り付いた": { + "w_type": "conjugated godan verb", + "romaji": "aritsuita" + }, + "在り付いて": { + "w_type": "conjugated godan verb", + "romaji": "aritsuite" + }, + "気づか": { + "w_type": "godan verb stem", + "romaji": "kizuka" + }, + "気づき": { + "w_type": "godan verb stem", + "romaji": "kizuki" + }, + "気づけ": { + "w_type": "conjugated godan verb", + "romaji": "kizuke" + }, + "気づこ": { + "w_type": "godan verb stem", + "romaji": "kizuko" + }, + "気づいた": { + "w_type": "conjugated godan verb", + "romaji": "kizuita" + }, + "気づいて": { + "w_type": "conjugated godan verb", + "romaji": "kizuite" + }, + "買い込ま": { + "w_type": "godan verb stem", + "romaji": "kaikoma" + }, + "買い込み": { + "w_type": "godan verb stem", + "romaji": "kaikomi" + }, + "買い込め": { + "w_type": "conjugated godan verb", + "romaji": "kaikome" + }, + "買い込も": { + "w_type": "godan verb stem", + "romaji": "kaikomo" + }, + "買い込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kaikonda" + }, + "買い込んで": { + "w_type": "conjugated godan verb", + "romaji": "kaikonde" + }, + "忍びよら": { + "w_type": "godan verb stem", + "romaji": "shinobiyora" + }, + "忍びより": { + "w_type": "godan verb stem", + "romaji": "shinobiyori" + }, + "忍びよれ": { + "w_type": "conjugated godan verb", + "romaji": "shinobiyore" + }, + "忍びよろ": { + "w_type": "godan verb stem", + "romaji": "shinobiyoro" + }, + "忍びよった": { + "w_type": "conjugated godan verb", + "romaji": "shinobiyotta" + }, + "忍びよって": { + "w_type": "conjugated godan verb", + "romaji": "shinobiyotte" + }, + "伸し掛から": { + "w_type": "godan verb stem", + "romaji": "noshikakara" + }, + "伸し掛かり": { + "w_type": "godan verb stem", + "romaji": "noshikakari" + }, + "伸し掛かれ": { + "w_type": "conjugated godan verb", + "romaji": "noshikakare" + }, + "伸し掛かろ": { + "w_type": "godan verb stem", + "romaji": "noshikakaro" + }, + "伸し掛かった": { + "w_type": "conjugated godan verb", + "romaji": "noshikakatta" + }, + "伸し掛かって": { + "w_type": "conjugated godan verb", + "romaji": "noshikakatte" + }, + "出渋ら": { + "w_type": "godan verb stem", + "romaji": "deshibura" + }, + "出渋り": { + "w_type": "godan verb stem", + "romaji": "deshiburi" + }, + "出渋れ": { + "w_type": "conjugated godan verb", + "romaji": "deshibure" + }, + "出渋ろ": { + "w_type": "godan verb stem", + "romaji": "deshiburo" + }, + "出渋った": { + "w_type": "conjugated godan verb", + "romaji": "deshibutta" + }, + "出渋って": { + "w_type": "conjugated godan verb", + "romaji": "deshibutte" + }, + "擽ぐら": { + "w_type": "godan verb stem", + "romaji": "kusugura" + }, + "擽ぐり": { + "w_type": "godan verb stem", + "romaji": "kusuguri" + }, + "擽ぐれ": { + "w_type": "conjugated godan verb", + "romaji": "kusugure" + }, + "擽ぐろ": { + "w_type": "godan verb stem", + "romaji": "kusuguro" + }, + "擽ぐった": { + "w_type": "conjugated godan verb", + "romaji": "kusugutta" + }, + "擽ぐって": { + "w_type": "conjugated godan verb", + "romaji": "kusugutte" + }, + "匂わさ": { + "w_type": "godan verb stem", + "romaji": "niowasa" + }, + "匂わし": { + "w_type": "godan verb stem", + "romaji": "niowashi" + }, + "匂わせ": { + "w_type": "conjugated godan verb", + "romaji": "niowase" + }, + "匂わそ": { + "w_type": "godan verb stem", + "romaji": "niowaso" + }, + "匂わした": { + "w_type": "conjugated godan verb", + "romaji": "niowashita" + }, + "匂わして": { + "w_type": "conjugated godan verb", + "romaji": "niowashite" + }, + "急かさ": { + "w_type": "godan verb stem", + "romaji": "sekasa" + }, + "急かし": { + "w_type": "godan verb stem", + "romaji": "sekashi" + }, + "急かせ": { + "w_type": "conjugated godan verb", + "romaji": "sekase" + }, + "急かそ": { + "w_type": "godan verb stem", + "romaji": "sekaso" + }, + "急かした": { + "w_type": "conjugated godan verb", + "romaji": "sekashita" + }, + "急かして": { + "w_type": "conjugated godan verb", + "romaji": "sekashite" + }, + "暮れ掛から": { + "w_type": "godan verb stem", + "romaji": "kurekakara" + }, + "暮れ掛かり": { + "w_type": "godan verb stem", + "romaji": "kurekakari" + }, + "暮れ掛かれ": { + "w_type": "conjugated godan verb", + "romaji": "kurekakare" + }, + "暮れ掛かろ": { + "w_type": "godan verb stem", + "romaji": "kurekakaro" + }, + "暮れ掛かった": { + "w_type": "conjugated godan verb", + "romaji": "kurekakatta" + }, + "暮れ掛かって": { + "w_type": "conjugated godan verb", + "romaji": "kurekakatte" + }, + "織ら": { + "w_type": "godan verb stem", + "romaji": "ora" + }, + "織り": { + "w_type": "godan verb stem", + "romaji": "ori" + }, + "織れ": { + "w_type": "conjugated godan verb", + "romaji": "ore" + }, + "織ろ": { + "w_type": "godan verb stem", + "romaji": "oro" + }, + "織った": { + "w_type": "conjugated godan verb", + "romaji": "otta" + }, + "織って": { + "w_type": "conjugated godan verb", + "romaji": "otte" + }, + "相継が": { + "w_type": "godan verb stem", + "romaji": "aitsuga" + }, + "相継ぎ": { + "w_type": "godan verb stem", + "romaji": "aitsugi" + }, + "相継げ": { + "w_type": "conjugated godan verb", + "romaji": "aitsuge" + }, + "相継ご": { + "w_type": "godan verb stem", + "romaji": "aitsugo" + }, + "相継いだ": { + "w_type": "conjugated godan verb", + "romaji": "aitsuida" + }, + "相継いで": { + "w_type": "conjugated godan verb", + "romaji": "aitsuide" + }, + "臆さ": { + "w_type": "godan verb stem", + "romaji": "okusa" + }, + "臆し": { + "w_type": "godan verb stem", + "romaji": "okushi" + }, + "臆せ": { + "w_type": "conjugated godan verb", + "romaji": "okuse" + }, + "臆そ": { + "w_type": "godan verb stem", + "romaji": "okuso" + }, + "臆した": { + "w_type": "conjugated godan verb", + "romaji": "okushita" + }, + "臆して": { + "w_type": "conjugated godan verb", + "romaji": "okushite" + }, + "打勝た": { + "w_type": "godan verb stem", + "romaji": "uchikata" + }, + "打勝ち": { + "w_type": "godan verb stem", + "romaji": "uchikachi" + }, + "打勝て": { + "w_type": "conjugated godan verb", + "romaji": "uchikate" + }, + "打勝と": { + "w_type": "godan verb stem", + "romaji": "uchikato" + }, + "打勝った": { + "w_type": "conjugated godan verb", + "romaji": "uchikatta" + }, + "打勝って": { + "w_type": "conjugated godan verb", + "romaji": "uchikatte" + }, + "取り交わさ": { + "w_type": "godan verb stem", + "romaji": "torikawasa" + }, + "取り交わし": { + "w_type": "godan verb stem", + "romaji": "torikawashi" + }, + "取り交わせ": { + "w_type": "conjugated godan verb", + "romaji": "torikawase" + }, + "取り交わそ": { + "w_type": "godan verb stem", + "romaji": "torikawaso" + }, + "取り交わした": { + "w_type": "conjugated godan verb", + "romaji": "torikawashita" + }, + "取り交わして": { + "w_type": "conjugated godan verb", + "romaji": "torikawashite" + }, + "仰せ付から": { + "w_type": "godan verb stem", + "romaji": "oosetsukara" + }, + "仰せ付かり": { + "w_type": "godan verb stem", + "romaji": "oosetsukari" + }, + "仰せ付かれ": { + "w_type": "conjugated godan verb", + "romaji": "oosetsukare" + }, + "仰せ付かろ": { + "w_type": "godan verb stem", + "romaji": "oosetsukaro" + }, + "仰せ付かった": { + "w_type": "conjugated godan verb", + "romaji": "oosetsukatta" + }, + "仰せ付かって": { + "w_type": "conjugated godan verb", + "romaji": "oosetsukatte" + }, + "飛びまわら": { + "w_type": "godan verb stem", + "romaji": "tobimawara" + }, + "飛びまわり": { + "w_type": "godan verb stem", + "romaji": "tobimawari" + }, + "飛びまわれ": { + "w_type": "conjugated godan verb", + "romaji": "tobimaware" + }, + "飛びまわろ": { + "w_type": "godan verb stem", + "romaji": "tobimawaro" + }, + "飛びまわった": { + "w_type": "conjugated godan verb", + "romaji": "tobimawatta" + }, + "飛びまわって": { + "w_type": "conjugated godan verb", + "romaji": "tobimawatte" + }, + "振り撒か": { + "w_type": "godan verb stem", + "romaji": "furimaka" + }, + "振り撒き": { + "w_type": "godan verb stem", + "romaji": "furimaki" + }, + "振り撒け": { + "w_type": "conjugated godan verb", + "romaji": "furimake" + }, + "振り撒こ": { + "w_type": "godan verb stem", + "romaji": "furimako" + }, + "振り撒いた": { + "w_type": "conjugated godan verb", + "romaji": "furimaita" + }, + "振り撒いて": { + "w_type": "conjugated godan verb", + "romaji": "furimaite" + }, + "晴れ渡ら": { + "w_type": "godan verb stem", + "romaji": "harewatara" + }, + "晴れ渡り": { + "w_type": "godan verb stem", + "romaji": "harewatari" + }, + "晴れ渡れ": { + "w_type": "conjugated godan verb", + "romaji": "harewatare" + }, + "晴れ渡ろ": { + "w_type": "godan verb stem", + "romaji": "harewataro" + }, + "晴れ渡った": { + "w_type": "conjugated godan verb", + "romaji": "harewatatta" + }, + "晴れ渡って": { + "w_type": "conjugated godan verb", + "romaji": "harewatatte" + }, + "辿ら": { + "w_type": "godan verb stem", + "romaji": "tadora" + }, + "辿り": { + "w_type": "godan verb stem", + "romaji": "tadori" + }, + "辿れ": { + "w_type": "conjugated godan verb", + "romaji": "tadore" + }, + "辿ろ": { + "w_type": "godan verb stem", + "romaji": "tadoro" + }, + "辿った": { + "w_type": "conjugated godan verb", + "romaji": "tadotta" + }, + "辿って": { + "w_type": "conjugated godan verb", + "romaji": "tadotte" + }, + "明るま": { + "w_type": "godan verb stem", + "romaji": "akaruma" + }, + "明るみ": { + "w_type": "godan verb stem", + "romaji": "akarumi" + }, + "明るめ": { + "w_type": "conjugated godan verb", + "romaji": "akarume" + }, + "明るも": { + "w_type": "godan verb stem", + "romaji": "akarumo" + }, + "明るんだ": { + "w_type": "conjugated godan verb", + "romaji": "akarunda" + }, + "明るんで": { + "w_type": "conjugated godan verb", + "romaji": "akarunde" + }, + "寄りそわ": { + "w_type": "godan verb stem", + "romaji": "yorisowa" + }, + "寄りそい": { + "w_type": "godan verb stem", + "romaji": "yorisoi" + }, + "寄りそえ": { + "w_type": "conjugated godan verb", + "romaji": "yorisoe" + }, + "寄りそお": { + "w_type": "godan verb stem", + "romaji": "yorisoo" + }, + "寄りそった": { + "w_type": "conjugated godan verb", + "romaji": "yorisotta" + }, + "寄りそって": { + "w_type": "conjugated godan verb", + "romaji": "yorisotte" + }, + "言出さ": { + "w_type": "godan verb stem", + "romaji": "iidasa" + }, + "言出し": { + "w_type": "godan verb stem", + "romaji": "iidashi" + }, + "言出せ": { + "w_type": "conjugated godan verb", + "romaji": "iidase" + }, + "言出そ": { + "w_type": "godan verb stem", + "romaji": "iidaso" + }, + "言出した": { + "w_type": "conjugated godan verb", + "romaji": "iidashita" + }, + "言出して": { + "w_type": "conjugated godan verb", + "romaji": "iidashite" + }, + "引き下がら": { + "w_type": "godan verb stem", + "romaji": "hikisagara" + }, + "引き下がり": { + "w_type": "godan verb stem", + "romaji": "hikisagari" + }, + "引き下がれ": { + "w_type": "conjugated godan verb", + "romaji": "hikisagare" + }, + "引き下がろ": { + "w_type": "godan verb stem", + "romaji": "hikisagaro" + }, + "引き下がった": { + "w_type": "conjugated godan verb", + "romaji": "hikisagatta" + }, + "引き下がって": { + "w_type": "conjugated godan verb", + "romaji": "hikisagatte" + }, + "漬から": { + "w_type": "godan verb stem", + "romaji": "tsukara" + }, + "漬かり": { + "w_type": "godan verb stem", + "romaji": "tsukari" + }, + "漬かれ": { + "w_type": "conjugated godan verb", + "romaji": "tsukare" + }, + "漬かろ": { + "w_type": "godan verb stem", + "romaji": "tsukaro" + }, + "漬かった": { + "w_type": "conjugated godan verb", + "romaji": "tsukatta" + }, + "漬かって": { + "w_type": "conjugated godan verb", + "romaji": "tsukatte" + }, + "揉解さ": { + "w_type": "godan verb stem", + "romaji": "momihogusa" + }, + "揉解し": { + "w_type": "godan verb stem", + "romaji": "momihogushi" + }, + "揉解せ": { + "w_type": "conjugated godan verb", + "romaji": "momihoguse" + }, + "揉解そ": { + "w_type": "godan verb stem", + "romaji": "momihoguso" + }, + "揉解した": { + "w_type": "conjugated godan verb", + "romaji": "momihogushita" + }, + "揉解して": { + "w_type": "conjugated godan verb", + "romaji": "momihogushite" + }, + "積増さ": { + "w_type": "godan verb stem", + "romaji": "tsumimasa" + }, + "積増し": { + "w_type": "godan verb stem", + "romaji": "tsumimashi" + }, + "積増せ": { + "w_type": "conjugated godan verb", + "romaji": "tsumimase" + }, + "積増そ": { + "w_type": "godan verb stem", + "romaji": "tsumimaso" + }, + "積増した": { + "w_type": "conjugated godan verb", + "romaji": "tsumimashita" + }, + "積増して": { + "w_type": "conjugated godan verb", + "romaji": "tsumimashite" + }, + "ぶっ飛ばさ": { + "w_type": "godan verb stem", + "romaji": "buttobasa" + }, + "ぶっ飛ばし": { + "w_type": "godan verb stem", + "romaji": "buttobashi" + }, + "ぶっ飛ばせ": { + "w_type": "conjugated godan verb", + "romaji": "buttobase" + }, + "ぶっ飛ばそ": { + "w_type": "godan verb stem", + "romaji": "buttobaso" + }, + "ぶっ飛ばした": { + "w_type": "conjugated godan verb", + "romaji": "buttobashita" + }, + "ぶっ飛ばして": { + "w_type": "conjugated godan verb", + "romaji": "buttobashite" + }, + "悩ま": { + "w_type": "godan verb stem", + "romaji": "nayama" + }, + "悩み": { + "w_type": "godan verb stem", + "romaji": "nayami" + }, + "悩め": { + "w_type": "conjugated godan verb", + "romaji": "nayame" + }, + "悩も": { + "w_type": "godan verb stem", + "romaji": "nayamo" + }, + "悩んだ": { + "w_type": "conjugated godan verb", + "romaji": "nayanda" + }, + "悩んで": { + "w_type": "conjugated godan verb", + "romaji": "nayande" + }, + "躱さ": { + "w_type": "godan verb stem", + "romaji": "kawasa" + }, + "躱し": { + "w_type": "godan verb stem", + "romaji": "kawashi" + }, + "躱せ": { + "w_type": "conjugated godan verb", + "romaji": "kawase" + }, + "躱そ": { + "w_type": "godan verb stem", + "romaji": "kawaso" + }, + "躱した": { + "w_type": "conjugated godan verb", + "romaji": "kawashita" + }, + "躱して": { + "w_type": "conjugated godan verb", + "romaji": "kawashite" + }, + "重吹か": { + "w_type": "godan verb stem", + "romaji": "shibuka" + }, + "重吹き": { + "w_type": "godan verb stem", + "romaji": "shibuki" + }, + "重吹け": { + "w_type": "conjugated godan verb", + "romaji": "shibuke" + }, + "重吹こ": { + "w_type": "godan verb stem", + "romaji": "shibuko" + }, + "重吹いた": { + "w_type": "conjugated godan verb", + "romaji": "shibuita" + }, + "重吹いて": { + "w_type": "conjugated godan verb", + "romaji": "shibuite" + }, + "突っ立た": { + "w_type": "godan verb stem", + "romaji": "tsuttata" + }, + "突っ立ち": { + "w_type": "godan verb stem", + "romaji": "tsuttachi" + }, + "突っ立て": { + "w_type": "conjugated godan verb", + "romaji": "tsuttate" + }, + "突っ立と": { + "w_type": "godan verb stem", + "romaji": "tsuttato" + }, + "突っ立った": { + "w_type": "conjugated godan verb", + "romaji": "tsuttatta" + }, + "突っ立って": { + "w_type": "conjugated godan verb", + "romaji": "tsuttatte" + }, + "読込ま": { + "w_type": "godan verb stem", + "romaji": "yomikoma" + }, + "読込み": { + "w_type": "godan verb stem", + "romaji": "yomikomi" + }, + "読込め": { + "w_type": "conjugated godan verb", + "romaji": "yomikome" + }, + "読込も": { + "w_type": "godan verb stem", + "romaji": "yomikomo" + }, + "読込んだ": { + "w_type": "conjugated godan verb", + "romaji": "yomikonda" + }, + "読込んで": { + "w_type": "conjugated godan verb", + "romaji": "yomikonde" + }, + "摑ま": { + "w_type": "godan verb stem", + "romaji": "tsukama" + }, + "摑み": { + "w_type": "godan verb stem", + "romaji": "tsukami" + }, + "摑め": { + "w_type": "conjugated godan verb", + "romaji": "tsukame" + }, + "摑も": { + "w_type": "godan verb stem", + "romaji": "tsukamo" + }, + "摑んだ": { + "w_type": "conjugated godan verb", + "romaji": "tsukanda" + }, + "摑んで": { + "w_type": "conjugated godan verb", + "romaji": "tsukande" + }, + "回りださ": { + "w_type": "godan verb stem", + "romaji": "mawaridasa" + }, + "回りだし": { + "w_type": "godan verb stem", + "romaji": "mawaridashi" + }, + "回りだせ": { + "w_type": "conjugated godan verb", + "romaji": "mawaridase" + }, + "回りだそ": { + "w_type": "godan verb stem", + "romaji": "mawaridaso" + }, + "回りだした": { + "w_type": "conjugated godan verb", + "romaji": "mawaridashita" + }, + "回りだして": { + "w_type": "conjugated godan verb", + "romaji": "mawaridashite" + }, + "帰さ": { + "w_type": "godan verb stem", + "romaji": "kaesa" + }, + "帰し": { + "w_type": "godan verb stem", + "romaji": "kaeshi" + }, + "帰せ": { + "w_type": "conjugated godan verb", + "romaji": "kaese" + }, + "帰そ": { + "w_type": "godan verb stem", + "romaji": "kaeso" + }, + "帰した": { + "w_type": "conjugated godan verb", + "romaji": "kaeshita" + }, + "帰して": { + "w_type": "conjugated godan verb", + "romaji": "kaeshite" + }, + "起ら": { + "w_type": "godan verb stem", + "romaji": "okora" + }, + "起り": { + "w_type": "godan verb stem", + "romaji": "okori" + }, + "起れ": { + "w_type": "conjugated godan verb", + "romaji": "okore" + }, + "起ろ": { + "w_type": "godan verb stem", + "romaji": "okoro" + }, + "起った": { + "w_type": "conjugated godan verb", + "romaji": "okotta" + }, + "起って": { + "w_type": "conjugated godan verb", + "romaji": "okotte" + }, + "つれ添わ": { + "w_type": "godan verb stem", + "romaji": "tsuresowa" + }, + "つれ添い": { + "w_type": "godan verb stem", + "romaji": "tsuresoi" + }, + "つれ添え": { + "w_type": "conjugated godan verb", + "romaji": "tsuresoe" + }, + "つれ添お": { + "w_type": "godan verb stem", + "romaji": "tsuresoo" + }, + "つれ添った": { + "w_type": "conjugated godan verb", + "romaji": "tsuresotta" + }, + "つれ添って": { + "w_type": "conjugated godan verb", + "romaji": "tsuresotte" + }, + "点ら": { + "w_type": "godan verb stem", + "romaji": "tomora" + }, + "点り": { + "w_type": "godan verb stem", + "romaji": "tomori" + }, + "点れ": { + "w_type": "conjugated godan verb", + "romaji": "tomore" + }, + "点ろ": { + "w_type": "godan verb stem", + "romaji": "tomoro" + }, + "点った": { + "w_type": "conjugated godan verb", + "romaji": "tomotta" + }, + "点って": { + "w_type": "conjugated godan verb", + "romaji": "tomotte" + }, + "繰廻さ": { + "w_type": "godan verb stem", + "romaji": "kurimawasa" + }, + "繰廻し": { + "w_type": "godan verb stem", + "romaji": "kurimawashi" + }, + "繰廻せ": { + "w_type": "conjugated godan verb", + "romaji": "kurimawase" + }, + "繰廻そ": { + "w_type": "godan verb stem", + "romaji": "kurimawaso" + }, + "繰廻した": { + "w_type": "conjugated godan verb", + "romaji": "kurimawashita" + }, + "繰廻して": { + "w_type": "conjugated godan verb", + "romaji": "kurimawashite" + }, + "考え直さ": { + "w_type": "godan verb stem", + "romaji": "kangaenaosa" + }, + "考え直し": { + "w_type": "godan verb stem", + "romaji": "kangaenaoshi" + }, + "考え直せ": { + "w_type": "conjugated godan verb", + "romaji": "kangaenaose" + }, + "考え直そ": { + "w_type": "godan verb stem", + "romaji": "kangaenaoso" + }, + "考え直した": { + "w_type": "conjugated godan verb", + "romaji": "kangaenaoshita" + }, + "考え直して": { + "w_type": "conjugated godan verb", + "romaji": "kangaenaoshite" + }, + "討取ら": { + "w_type": "godan verb stem", + "romaji": "uchitora" + }, + "討取り": { + "w_type": "godan verb stem", + "romaji": "uchitori" + }, + "討取れ": { + "w_type": "conjugated godan verb", + "romaji": "uchitore" + }, + "討取ろ": { + "w_type": "godan verb stem", + "romaji": "uchitoro" + }, + "討取った": { + "w_type": "conjugated godan verb", + "romaji": "uchitotta" + }, + "討取って": { + "w_type": "conjugated godan verb", + "romaji": "uchitotte" + }, + "うつ向か": { + "w_type": "godan verb stem", + "romaji": "utsumuka" + }, + "うつ向き": { + "w_type": "godan verb stem", + "romaji": "utsumuki" + }, + "うつ向け": { + "w_type": "conjugated godan verb", + "romaji": "utsumuke" + }, + "うつ向こ": { + "w_type": "godan verb stem", + "romaji": "utsumuko" + }, + "うつ向いた": { + "w_type": "conjugated godan verb", + "romaji": "utsumuita" + }, + "うつ向いて": { + "w_type": "conjugated godan verb", + "romaji": "utsumuite" + }, + "患いつか": { + "w_type": "godan verb stem", + "romaji": "wazuraitsuka" + }, + "患いつき": { + "w_type": "godan verb stem", + "romaji": "wazuraitsuki" + }, + "患いつけ": { + "w_type": "conjugated godan verb", + "romaji": "wazuraitsuke" + }, + "患いつこ": { + "w_type": "godan verb stem", + "romaji": "wazuraitsuko" + }, + "患いついた": { + "w_type": "conjugated godan verb", + "romaji": "wazuraitsuita" + }, + "患いついて": { + "w_type": "conjugated godan verb", + "romaji": "wazuraitsuite" + }, + "わり込ま": { + "w_type": "godan verb stem", + "romaji": "warikoma" + }, + "わり込み": { + "w_type": "godan verb stem", + "romaji": "warikomi" + }, + "わり込め": { + "w_type": "conjugated godan verb", + "romaji": "warikome" + }, + "わり込も": { + "w_type": "godan verb stem", + "romaji": "warikomo" + }, + "わり込んだ": { + "w_type": "conjugated godan verb", + "romaji": "warikonda" + }, + "わり込んで": { + "w_type": "conjugated godan verb", + "romaji": "warikonde" + }, + "従わ": { + "w_type": "godan verb stem", + "romaji": "shitagawa" + }, + "従い": { + "w_type": "godan verb stem", + "romaji": "shitagai" + }, + "従え": { + "w_type": "conjugated godan verb", + "romaji": "shitagae" + }, + "従お": { + "w_type": "godan verb stem", + "romaji": "shitagao" + }, + "従った": { + "w_type": "conjugated godan verb", + "romaji": "shitagatta" + }, + "従って": { + "w_type": "conjugated godan verb", + "romaji": "shitagatte" + }, + "売捌か": { + "w_type": "godan verb stem", + "romaji": "urisabaka" + }, + "売捌き": { + "w_type": "godan verb stem", + "romaji": "urisabaki" + }, + "売捌け": { + "w_type": "conjugated godan verb", + "romaji": "urisabake" + }, + "売捌こ": { + "w_type": "godan verb stem", + "romaji": "urisabako" + }, + "売捌いた": { + "w_type": "conjugated godan verb", + "romaji": "urisabaita" + }, + "売捌いて": { + "w_type": "conjugated godan verb", + "romaji": "urisabaite" + }, + "着込ま": { + "w_type": "godan verb stem", + "romaji": "kikoma" + }, + "着込み": { + "w_type": "godan verb stem", + "romaji": "kikomi" + }, + "着込め": { + "w_type": "conjugated godan verb", + "romaji": "kikome" + }, + "着込も": { + "w_type": "godan verb stem", + "romaji": "kikomo" + }, + "着込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kikonda" + }, + "着込んで": { + "w_type": "conjugated godan verb", + "romaji": "kikonde" + }, + "覆い隠さ": { + "w_type": "godan verb stem", + "romaji": "ooikakusa" + }, + "覆い隠し": { + "w_type": "godan verb stem", + "romaji": "ooikakushi" + }, + "覆い隠せ": { + "w_type": "conjugated godan verb", + "romaji": "ooikakuse" + }, + "覆い隠そ": { + "w_type": "godan verb stem", + "romaji": "ooikakuso" + }, + "覆い隠した": { + "w_type": "conjugated godan verb", + "romaji": "ooikakushita" + }, + "覆い隠して": { + "w_type": "conjugated godan verb", + "romaji": "ooikakushite" + }, + "煮え立た": { + "w_type": "godan verb stem", + "romaji": "nietata" + }, + "煮え立ち": { + "w_type": "godan verb stem", + "romaji": "nietachi" + }, + "煮え立て": { + "w_type": "conjugated godan verb", + "romaji": "nietate" + }, + "煮え立と": { + "w_type": "godan verb stem", + "romaji": "nietato" + }, + "煮え立った": { + "w_type": "conjugated godan verb", + "romaji": "nietatta" + }, + "煮え立って": { + "w_type": "conjugated godan verb", + "romaji": "nietatte" + }, + "擂り潰さ": { + "w_type": "godan verb stem", + "romaji": "suritsubusa" + }, + "擂り潰し": { + "w_type": "godan verb stem", + "romaji": "suritsubushi" + }, + "擂り潰せ": { + "w_type": "conjugated godan verb", + "romaji": "suritsubuse" + }, + "擂り潰そ": { + "w_type": "godan verb stem", + "romaji": "suritsubuso" + }, + "擂り潰した": { + "w_type": "conjugated godan verb", + "romaji": "suritsubushita" + }, + "擂り潰して": { + "w_type": "conjugated godan verb", + "romaji": "suritsubushite" + }, + "纏まら": { + "w_type": "godan verb stem", + "romaji": "matomara" + }, + "纏まり": { + "w_type": "godan verb stem", + "romaji": "matomari" + }, + "纏まれ": { + "w_type": "conjugated godan verb", + "romaji": "matomare" + }, + "纏まろ": { + "w_type": "godan verb stem", + "romaji": "matomaro" + }, + "纏まった": { + "w_type": "conjugated godan verb", + "romaji": "matomatta" + }, + "纏まって": { + "w_type": "conjugated godan verb", + "romaji": "matomatte" + }, + "摘み取ら": { + "w_type": "godan verb stem", + "romaji": "tsumamitora" + }, + "摘み取り": { + "w_type": "godan verb stem", + "romaji": "tsumamitori" + }, + "摘み取れ": { + "w_type": "conjugated godan verb", + "romaji": "tsumamitore" + }, + "摘み取ろ": { + "w_type": "godan verb stem", + "romaji": "tsumamitoro" + }, + "摘み取った": { + "w_type": "conjugated godan verb", + "romaji": "tsumamitotta" + }, + "摘み取って": { + "w_type": "conjugated godan verb", + "romaji": "tsumamitotte" + }, + "取り結ば": { + "w_type": "godan verb stem", + "romaji": "torimusuba" + }, + "取り結び": { + "w_type": "godan verb stem", + "romaji": "torimusubi" + }, + "取り結べ": { + "w_type": "conjugated godan verb", + "romaji": "torimusube" + }, + "取り結ぼ": { + "w_type": "godan verb stem", + "romaji": "torimusubo" + }, + "取り結んだ": { + "w_type": "conjugated godan verb", + "romaji": "torimusunda" + }, + "取り結んで": { + "w_type": "conjugated godan verb", + "romaji": "torimusunde" + }, + "書き著さ": { + "w_type": "godan verb stem", + "romaji": "kakiarawasa" + }, + "書き著し": { + "w_type": "godan verb stem", + "romaji": "kakiarawashi" + }, + "書き著せ": { + "w_type": "conjugated godan verb", + "romaji": "kakiarawase" + }, + "書き著そ": { + "w_type": "godan verb stem", + "romaji": "kakiarawaso" + }, + "書き著した": { + "w_type": "conjugated godan verb", + "romaji": "kakiarawashita" + }, + "書き著して": { + "w_type": "conjugated godan verb", + "romaji": "kakiarawashite" + }, + "会わ": { + "w_type": "godan verb stem", + "romaji": "awa" + }, + "会い": { + "w_type": "godan verb stem", + "romaji": "ai" + }, + "会え": { + "w_type": "conjugated godan verb", + "romaji": "ae" + }, + "会お": { + "w_type": "godan verb stem", + "romaji": "ao" + }, + "会った": { + "w_type": "conjugated godan verb", + "romaji": "atta" + }, + "会って": { + "w_type": "conjugated godan verb", + "romaji": "atte" + }, + "鋳込ま": { + "w_type": "godan verb stem", + "romaji": "ikoma" + }, + "鋳込み": { + "w_type": "godan verb stem", + "romaji": "ikomi" + }, + "鋳込め": { + "w_type": "conjugated godan verb", + "romaji": "ikome" + }, + "鋳込も": { + "w_type": "godan verb stem", + "romaji": "ikomo" + }, + "鋳込んだ": { + "w_type": "conjugated godan verb", + "romaji": "ikonda" + }, + "鋳込んで": { + "w_type": "conjugated godan verb", + "romaji": "ikonde" + }, + "折ら": { + "w_type": "godan verb stem", + "romaji": "ora" + }, + "折り": { + "w_type": "godan verb stem", + "romaji": "ori" + }, + "折れ": { + "w_type": "conjugated godan verb", + "romaji": "ore" + }, + "折ろ": { + "w_type": "godan verb stem", + "romaji": "oro" + }, + "折った": { + "w_type": "conjugated godan verb", + "romaji": "otta" + }, + "折って": { + "w_type": "conjugated godan verb", + "romaji": "otte" + }, + "為し終わら": { + "w_type": "godan verb stem", + "romaji": "nashiowara" + }, + "為し終わり": { + "w_type": "godan verb stem", + "romaji": "nashiowari" + }, + "為し終われ": { + "w_type": "conjugated godan verb", + "romaji": "nashioware" + }, + "為し終わろ": { + "w_type": "godan verb stem", + "romaji": "nashiowaro" + }, + "為し終わった": { + "w_type": "conjugated godan verb", + "romaji": "nashiowatta" + }, + "為し終わって": { + "w_type": "conjugated godan verb", + "romaji": "nashiowatte" + }, + "集まら": { + "w_type": "godan verb stem", + "romaji": "atsumara" + }, + "集まり": { + "w_type": "godan verb stem", + "romaji": "atsumari" + }, + "集まれ": { + "w_type": "conjugated godan verb", + "romaji": "atsumare" + }, + "集まろ": { + "w_type": "godan verb stem", + "romaji": "atsumaro" + }, + "集まった": { + "w_type": "conjugated godan verb", + "romaji": "atsumatta" + }, + "集まって": { + "w_type": "conjugated godan verb", + "romaji": "atsumatte" + }, + "折が": { + "w_type": "godan verb stem", + "romaji": "haga" + }, + "折ぎ": { + "w_type": "godan verb stem", + "romaji": "hagi" + }, + "折げ": { + "w_type": "conjugated godan verb", + "romaji": "hage" + }, + "折ご": { + "w_type": "godan verb stem", + "romaji": "hago" + }, + "折いだ": { + "w_type": "conjugated godan verb", + "romaji": "haida" + }, + "折いで": { + "w_type": "conjugated godan verb", + "romaji": "haide" + }, + "這い上がら": { + "w_type": "godan verb stem", + "romaji": "haiagara" + }, + "這い上がり": { + "w_type": "godan verb stem", + "romaji": "haiagari" + }, + "這い上がれ": { + "w_type": "conjugated godan verb", + "romaji": "haiagare" + }, + "這い上がろ": { + "w_type": "godan verb stem", + "romaji": "haiagaro" + }, + "這い上がった": { + "w_type": "conjugated godan verb", + "romaji": "haiagatta" + }, + "這い上がって": { + "w_type": "conjugated godan verb", + "romaji": "haiagatte" + }, + "張ら": { + "w_type": "godan verb stem", + "romaji": "hara" + }, + "張り": { + "w_type": "godan verb stem", + "romaji": "hari" + }, + "張れ": { + "w_type": "conjugated godan verb", + "romaji": "hare" + }, + "張ろ": { + "w_type": "godan verb stem", + "romaji": "haro" + }, + "張った": { + "w_type": "conjugated godan verb", + "romaji": "hatta" + }, + "張って": { + "w_type": "conjugated godan verb", + "romaji": "hatte" + }, + "斥か": { + "w_type": "godan verb stem", + "romaji": "shirizoka" + }, + "斥き": { + "w_type": "godan verb stem", + "romaji": "shirizoki" + }, + "斥け": { + "w_type": "conjugated godan verb", + "romaji": "shirizoke" + }, + "斥こ": { + "w_type": "godan verb stem", + "romaji": "shirizoko" + }, + "斥いた": { + "w_type": "conjugated godan verb", + "romaji": "shirizoita" + }, + "斥いて": { + "w_type": "conjugated godan verb", + "romaji": "shirizoite" + }, + "障ら": { + "w_type": "godan verb stem", + "romaji": "sawara" + }, + "障り": { + "w_type": "godan verb stem", + "romaji": "sawari" + }, + "障れ": { + "w_type": "conjugated godan verb", + "romaji": "saware" + }, + "障ろ": { + "w_type": "godan verb stem", + "romaji": "sawaro" + }, + "障った": { + "w_type": "conjugated godan verb", + "romaji": "sawatta" + }, + "障って": { + "w_type": "conjugated godan verb", + "romaji": "sawatte" + }, + "斬掛から": { + "w_type": "godan verb stem", + "romaji": "kirikakara" + }, + "斬掛かり": { + "w_type": "godan verb stem", + "romaji": "kirikakari" + }, + "斬掛かれ": { + "w_type": "conjugated godan verb", + "romaji": "kirikakare" + }, + "斬掛かろ": { + "w_type": "godan verb stem", + "romaji": "kirikakaro" + }, + "斬掛かった": { + "w_type": "conjugated godan verb", + "romaji": "kirikakatta" + }, + "斬掛かって": { + "w_type": "conjugated godan verb", + "romaji": "kirikakatte" + }, + "圧潰さ": { + "w_type": "godan verb stem", + "romaji": "oshitsubusa" + }, + "圧潰し": { + "w_type": "godan verb stem", + "romaji": "oshitsubushi" + }, + "圧潰せ": { + "w_type": "conjugated godan verb", + "romaji": "oshitsubuse" + }, + "圧潰そ": { + "w_type": "godan verb stem", + "romaji": "oshitsubuso" + }, + "圧潰した": { + "w_type": "conjugated godan verb", + "romaji": "oshitsubushita" + }, + "圧潰して": { + "w_type": "conjugated godan verb", + "romaji": "oshitsubushite" + }, + "眠ら": { + "w_type": "godan verb stem", + "romaji": "nemura" + }, + "眠り": { + "w_type": "godan verb stem", + "romaji": "nemuri" + }, + "眠れ": { + "w_type": "conjugated godan verb", + "romaji": "nemure" + }, + "眠ろ": { + "w_type": "godan verb stem", + "romaji": "nemuro" + }, + "眠った": { + "w_type": "conjugated godan verb", + "romaji": "nemutta" + }, + "眠って": { + "w_type": "conjugated godan verb", + "romaji": "nemutte" + }, + "せり上ら": { + "w_type": "godan verb stem", + "romaji": "seriagara" + }, + "せり上り": { + "w_type": "godan verb stem", + "romaji": "seriagari" + }, + "せり上れ": { + "w_type": "conjugated godan verb", + "romaji": "seriagare" + }, + "せり上ろ": { + "w_type": "godan verb stem", + "romaji": "seriagaro" + }, + "せり上った": { + "w_type": "conjugated godan verb", + "romaji": "seriagatta" + }, + "せり上って": { + "w_type": "conjugated godan verb", + "romaji": "seriagatte" + }, + "行き渡ら": { + "w_type": "godan verb stem", + "romaji": "ikiwatara" + }, + "行き渡り": { + "w_type": "godan verb stem", + "romaji": "ikiwatari" + }, + "行き渡れ": { + "w_type": "conjugated godan verb", + "romaji": "ikiwatare" + }, + "行き渡ろ": { + "w_type": "godan verb stem", + "romaji": "ikiwataro" + }, + "行き渡った": { + "w_type": "conjugated godan verb", + "romaji": "ikiwatatta" + }, + "行き渡って": { + "w_type": "conjugated godan verb", + "romaji": "ikiwatatte" + }, + "詰め寄ら": { + "w_type": "godan verb stem", + "romaji": "tsumeyora" + }, + "詰め寄り": { + "w_type": "godan verb stem", + "romaji": "tsumeyori" + }, + "詰め寄れ": { + "w_type": "conjugated godan verb", + "romaji": "tsumeyore" + }, + "詰め寄ろ": { + "w_type": "godan verb stem", + "romaji": "tsumeyoro" + }, + "詰め寄った": { + "w_type": "conjugated godan verb", + "romaji": "tsumeyotta" + }, + "詰め寄って": { + "w_type": "conjugated godan verb", + "romaji": "tsumeyotte" + }, + "粋がら": { + "w_type": "godan verb stem", + "romaji": "ikigara" + }, + "粋がり": { + "w_type": "godan verb stem", + "romaji": "ikigari" + }, + "粋がれ": { + "w_type": "conjugated godan verb", + "romaji": "ikigare" + }, + "粋がろ": { + "w_type": "godan verb stem", + "romaji": "ikigaro" + }, + "粋がった": { + "w_type": "conjugated godan verb", + "romaji": "ikigatta" + }, + "粋がって": { + "w_type": "conjugated godan verb", + "romaji": "ikigatte" + }, + "溜ら": { + "w_type": "godan verb stem", + "romaji": "tamara" + }, + "溜り": { + "w_type": "godan verb stem", + "romaji": "tamari" + }, + "溜れ": { + "w_type": "conjugated godan verb", + "romaji": "tamare" + }, + "溜ろ": { + "w_type": "godan verb stem", + "romaji": "tamaro" + }, + "溜った": { + "w_type": "conjugated godan verb", + "romaji": "tamatta" + }, + "溜って": { + "w_type": "conjugated godan verb", + "romaji": "tamatte" + }, + "引き伸ばさ": { + "w_type": "godan verb stem", + "romaji": "hikinobasa" + }, + "引き伸ばし": { + "w_type": "godan verb stem", + "romaji": "hikinobashi" + }, + "引き伸ばせ": { + "w_type": "conjugated godan verb", + "romaji": "hikinobase" + }, + "引き伸ばそ": { + "w_type": "godan verb stem", + "romaji": "hikinobaso" + }, + "引き伸ばした": { + "w_type": "conjugated godan verb", + "romaji": "hikinobashita" + }, + "引き伸ばして": { + "w_type": "conjugated godan verb", + "romaji": "hikinobashite" + }, + "伸び上がら": { + "w_type": "godan verb stem", + "romaji": "nobiagara" + }, + "伸び上がり": { + "w_type": "godan verb stem", + "romaji": "nobiagari" + }, + "伸び上がれ": { + "w_type": "conjugated godan verb", + "romaji": "nobiagare" + }, + "伸び上がろ": { + "w_type": "godan verb stem", + "romaji": "nobiagaro" + }, + "伸び上がった": { + "w_type": "conjugated godan verb", + "romaji": "nobiagatta" + }, + "伸び上がって": { + "w_type": "conjugated godan verb", + "romaji": "nobiagatte" + }, + "入り切ら": { + "w_type": "godan verb stem", + "romaji": "hairikira" + }, + "入り切り": { + "w_type": "godan verb stem", + "romaji": "hairikiri" + }, + "入り切れ": { + "w_type": "conjugated godan verb", + "romaji": "hairikire" + }, + "入り切ろ": { + "w_type": "godan verb stem", + "romaji": "hairikiro" + }, + "入り切った": { + "w_type": "conjugated godan verb", + "romaji": "hairikitta" + }, + "入り切って": { + "w_type": "conjugated godan verb", + "romaji": "hairikitte" + }, + "引きたた": { + "w_type": "godan verb stem", + "romaji": "hikitata" + }, + "引きたち": { + "w_type": "godan verb stem", + "romaji": "hikitachi" + }, + "引きたて": { + "w_type": "conjugated godan verb", + "romaji": "hikitate" + }, + "引きたと": { + "w_type": "godan verb stem", + "romaji": "hikitato" + }, + "引きたった": { + "w_type": "conjugated godan verb", + "romaji": "hikitatta" + }, + "引きたって": { + "w_type": "conjugated godan verb", + "romaji": "hikitatte" + }, + "穿り返さ": { + "w_type": "godan verb stem", + "romaji": "hojikurikaesa" + }, + "穿り返し": { + "w_type": "godan verb stem", + "romaji": "hojikurikaeshi" + }, + "穿り返せ": { + "w_type": "conjugated godan verb", + "romaji": "hojikurikaese" + }, + "穿り返そ": { + "w_type": "godan verb stem", + "romaji": "hojikurikaeso" + }, + "穿り返した": { + "w_type": "conjugated godan verb", + "romaji": "hojikurikaeshita" + }, + "穿り返して": { + "w_type": "conjugated godan verb", + "romaji": "hojikurikaeshite" + }, + "追回さ": { + "w_type": "godan verb stem", + "romaji": "oimawasa" + }, + "追回し": { + "w_type": "godan verb stem", + "romaji": "oimawashi" + }, + "追回せ": { + "w_type": "conjugated godan verb", + "romaji": "oimawase" + }, + "追回そ": { + "w_type": "godan verb stem", + "romaji": "oimawaso" + }, + "追回した": { + "w_type": "conjugated godan verb", + "romaji": "oimawashita" + }, + "追回して": { + "w_type": "conjugated godan verb", + "romaji": "oimawashite" + }, + "呼びならわさ": { + "w_type": "godan verb stem", + "romaji": "yobinarawasa" + }, + "呼びならわし": { + "w_type": "godan verb stem", + "romaji": "yobinarawashi" + }, + "呼びならわせ": { + "w_type": "conjugated godan verb", + "romaji": "yobinarawase" + }, + "呼びならわそ": { + "w_type": "godan verb stem", + "romaji": "yobinarawaso" + }, + "呼びならわした": { + "w_type": "conjugated godan verb", + "romaji": "yobinarawashita" + }, + "呼びならわして": { + "w_type": "conjugated godan verb", + "romaji": "yobinarawashite" + }, + "押しころさ": { + "w_type": "godan verb stem", + "romaji": "oshikorosa" + }, + "押しころし": { + "w_type": "godan verb stem", + "romaji": "oshikoroshi" + }, + "押しころせ": { + "w_type": "conjugated godan verb", + "romaji": "oshikorose" + }, + "押しころそ": { + "w_type": "godan verb stem", + "romaji": "oshikoroso" + }, + "押しころした": { + "w_type": "conjugated godan verb", + "romaji": "oshikoroshita" + }, + "押しころして": { + "w_type": "conjugated godan verb", + "romaji": "oshikoroshite" + }, + "運びださ": { + "w_type": "godan verb stem", + "romaji": "hakobidasa" + }, + "運びだし": { + "w_type": "godan verb stem", + "romaji": "hakobidashi" + }, + "運びだせ": { + "w_type": "conjugated godan verb", + "romaji": "hakobidase" + }, + "運びだそ": { + "w_type": "godan verb stem", + "romaji": "hakobidaso" + }, + "運びだした": { + "w_type": "conjugated godan verb", + "romaji": "hakobidashita" + }, + "運びだして": { + "w_type": "conjugated godan verb", + "romaji": "hakobidashite" + }, + "立ち寄ら": { + "w_type": "godan verb stem", + "romaji": "tachiyora" + }, + "立ち寄り": { + "w_type": "godan verb stem", + "romaji": "tachiyori" + }, + "立ち寄れ": { + "w_type": "conjugated godan verb", + "romaji": "tachiyore" + }, + "立ち寄ろ": { + "w_type": "godan verb stem", + "romaji": "tachiyoro" + }, + "立ち寄った": { + "w_type": "conjugated godan verb", + "romaji": "tachiyotta" + }, + "立ち寄って": { + "w_type": "conjugated godan verb", + "romaji": "tachiyotte" + }, + "裏問わ": { + "w_type": "godan verb stem", + "romaji": "uradowa" + }, + "裏問い": { + "w_type": "godan verb stem", + "romaji": "uradoi" + }, + "裏問え": { + "w_type": "conjugated godan verb", + "romaji": "uradoe" + }, + "裏問お": { + "w_type": "godan verb stem", + "romaji": "uradoo" + }, + "裏問った": { + "w_type": "conjugated godan verb", + "romaji": "uradotta" + }, + "裏問って": { + "w_type": "conjugated godan verb", + "romaji": "uradotte" + }, + "引き継が": { + "w_type": "godan verb stem", + "romaji": "hikitsuga" + }, + "引き継ぎ": { + "w_type": "godan verb stem", + "romaji": "hikitsugi" + }, + "引き継げ": { + "w_type": "conjugated godan verb", + "romaji": "hikitsuge" + }, + "引き継ご": { + "w_type": "godan verb stem", + "romaji": "hikitsugo" + }, + "引き継いだ": { + "w_type": "conjugated godan verb", + "romaji": "hikitsuida" + }, + "引き継いで": { + "w_type": "conjugated godan verb", + "romaji": "hikitsuide" + }, + "驚き入ら": { + "w_type": "godan verb stem", + "romaji": "odorokiira" + }, + "驚き入り": { + "w_type": "godan verb stem", + "romaji": "odorokiiri" + }, + "驚き入れ": { + "w_type": "conjugated godan verb", + "romaji": "odorokiire" + }, + "驚き入ろ": { + "w_type": "godan verb stem", + "romaji": "odorokiiro" + }, + "驚き入った": { + "w_type": "conjugated godan verb", + "romaji": "odorokiitta" + }, + "驚き入って": { + "w_type": "conjugated godan verb", + "romaji": "odorokiitte" + }, + "衝き当たら": { + "w_type": "godan verb stem", + "romaji": "tsukiatara" + }, + "衝き当たり": { + "w_type": "godan verb stem", + "romaji": "tsukiatari" + }, + "衝き当たれ": { + "w_type": "conjugated godan verb", + "romaji": "tsukiatare" + }, + "衝き当たろ": { + "w_type": "godan verb stem", + "romaji": "tsukiataro" + }, + "衝き当たった": { + "w_type": "conjugated godan verb", + "romaji": "tsukiatatta" + }, + "衝き当たって": { + "w_type": "conjugated godan verb", + "romaji": "tsukiatatte" + }, + "事寄さ": { + "w_type": "godan verb stem", + "romaji": "kotoyosa" + }, + "事寄し": { + "w_type": "godan verb stem", + "romaji": "kotoyoshi" + }, + "事寄せ": { + "w_type": "conjugated godan verb", + "romaji": "kotoyose" + }, + "事寄そ": { + "w_type": "godan verb stem", + "romaji": "kotoyoso" + }, + "事寄した": { + "w_type": "conjugated godan verb", + "romaji": "kotoyoshita" + }, + "事寄して": { + "w_type": "conjugated godan verb", + "romaji": "kotoyoshite" + }, + "のぼせ上がら": { + "w_type": "godan verb stem", + "romaji": "noboseagara" + }, + "のぼせ上がり": { + "w_type": "godan verb stem", + "romaji": "noboseagari" + }, + "のぼせ上がれ": { + "w_type": "conjugated godan verb", + "romaji": "noboseagare" + }, + "のぼせ上がろ": { + "w_type": "godan verb stem", + "romaji": "noboseagaro" + }, + "のぼせ上がった": { + "w_type": "conjugated godan verb", + "romaji": "noboseagatta" + }, + "のぼせ上がって": { + "w_type": "conjugated godan verb", + "romaji": "noboseagatte" + }, + "追い捲ら": { + "w_type": "godan verb stem", + "romaji": "oimakura" + }, + "追い捲り": { + "w_type": "godan verb stem", + "romaji": "oimakuri" + }, + "追い捲れ": { + "w_type": "conjugated godan verb", + "romaji": "oimakure" + }, + "追い捲ろ": { + "w_type": "godan verb stem", + "romaji": "oimakuro" + }, + "追い捲った": { + "w_type": "conjugated godan verb", + "romaji": "oimakutta" + }, + "追い捲って": { + "w_type": "conjugated godan verb", + "romaji": "oimakutte" + }, + "据わら": { + "w_type": "godan verb stem", + "romaji": "suwara" + }, + "据わり": { + "w_type": "godan verb stem", + "romaji": "suwari" + }, + "据われ": { + "w_type": "conjugated godan verb", + "romaji": "suware" + }, + "据わろ": { + "w_type": "godan verb stem", + "romaji": "suwaro" + }, + "据わった": { + "w_type": "conjugated godan verb", + "romaji": "suwatta" + }, + "据わって": { + "w_type": "conjugated godan verb", + "romaji": "suwatte" + }, + "禿げ上がら": { + "w_type": "godan verb stem", + "romaji": "hageagara" + }, + "禿げ上がり": { + "w_type": "godan verb stem", + "romaji": "hageagari" + }, + "禿げ上がれ": { + "w_type": "conjugated godan verb", + "romaji": "hageagare" + }, + "禿げ上がろ": { + "w_type": "godan verb stem", + "romaji": "hageagaro" + }, + "禿げ上がった": { + "w_type": "conjugated godan verb", + "romaji": "hageagatta" + }, + "禿げ上がって": { + "w_type": "conjugated godan verb", + "romaji": "hageagatte" + }, + "切り掛ら": { + "w_type": "godan verb stem", + "romaji": "kirikakara" + }, + "切り掛り": { + "w_type": "godan verb stem", + "romaji": "kirikakari" + }, + "切り掛れ": { + "w_type": "conjugated godan verb", + "romaji": "kirikakare" + }, + "切り掛ろ": { + "w_type": "godan verb stem", + "romaji": "kirikakaro" + }, + "切り掛った": { + "w_type": "conjugated godan verb", + "romaji": "kirikakatta" + }, + "切り掛って": { + "w_type": "conjugated godan verb", + "romaji": "kirikakatte" + }, + "去り行か": { + "w_type": "godan verb stem", + "romaji": "sariika" + }, + "去り行き": { + "w_type": "godan verb stem", + "romaji": "sariiki" + }, + "去り行け": { + "w_type": "conjugated godan verb", + "romaji": "sariike" + }, + "去り行こ": { + "w_type": "godan verb stem", + "romaji": "sariiko" + }, + "去り行いた": { + "w_type": "conjugated godan verb", + "romaji": "sariiita" + }, + "去り行いて": { + "w_type": "conjugated godan verb", + "romaji": "sariiite" + }, + "揉ま": { + "w_type": "godan verb stem", + "romaji": "moma" + }, + "揉み": { + "w_type": "godan verb stem", + "romaji": "momi" + }, + "揉め": { + "w_type": "conjugated godan verb", + "romaji": "mome" + }, + "揉も": { + "w_type": "godan verb stem", + "romaji": "momo" + }, + "揉んだ": { + "w_type": "conjugated godan verb", + "romaji": "monda" + }, + "揉んで": { + "w_type": "conjugated godan verb", + "romaji": "monde" + }, + "浮出さ": { + "w_type": "godan verb stem", + "romaji": "ukidasa" + }, + "浮出し": { + "w_type": "godan verb stem", + "romaji": "ukidashi" + }, + "浮出せ": { + "w_type": "conjugated godan verb", + "romaji": "ukidase" + }, + "浮出そ": { + "w_type": "godan verb stem", + "romaji": "ukidaso" + }, + "浮出した": { + "w_type": "conjugated godan verb", + "romaji": "ukidashita" + }, + "浮出して": { + "w_type": "conjugated godan verb", + "romaji": "ukidashite" + }, + "かい摘ま": { + "w_type": "godan verb stem", + "romaji": "kaitsumama" + }, + "かい摘み": { + "w_type": "godan verb stem", + "romaji": "kaitsumami" + }, + "かい摘め": { + "w_type": "conjugated godan verb", + "romaji": "kaitsumame" + }, + "かい摘も": { + "w_type": "godan verb stem", + "romaji": "kaitsumamo" + }, + "かい摘んだ": { + "w_type": "conjugated godan verb", + "romaji": "kaitsumanda" + }, + "かい摘んで": { + "w_type": "conjugated godan verb", + "romaji": "kaitsumande" + }, + "釣合わ": { + "w_type": "godan verb stem", + "romaji": "tsuriawa" + }, + "釣合い": { + "w_type": "godan verb stem", + "romaji": "tsuriai" + }, + "釣合え": { + "w_type": "conjugated godan verb", + "romaji": "tsuriae" + }, + "釣合お": { + "w_type": "godan verb stem", + "romaji": "tsuriao" + }, + "釣合った": { + "w_type": "conjugated godan verb", + "romaji": "tsuriatta" + }, + "釣合って": { + "w_type": "conjugated godan verb", + "romaji": "tsuriatte" + }, + "包隠さ": { + "w_type": "godan verb stem", + "romaji": "tsutsumikakusa" + }, + "包隠し": { + "w_type": "godan verb stem", + "romaji": "tsutsumikakushi" + }, + "包隠せ": { + "w_type": "conjugated godan verb", + "romaji": "tsutsumikakuse" + }, + "包隠そ": { + "w_type": "godan verb stem", + "romaji": "tsutsumikakuso" + }, + "包隠した": { + "w_type": "conjugated godan verb", + "romaji": "tsutsumikakushita" + }, + "包隠して": { + "w_type": "conjugated godan verb", + "romaji": "tsutsumikakushite" + }, + "殴り殺さ": { + "w_type": "godan verb stem", + "romaji": "nagurikorosa" + }, + "殴り殺し": { + "w_type": "godan verb stem", + "romaji": "nagurikoroshi" + }, + "殴り殺せ": { + "w_type": "conjugated godan verb", + "romaji": "nagurikorose" + }, + "殴り殺そ": { + "w_type": "godan verb stem", + "romaji": "nagurikoroso" + }, + "殴り殺した": { + "w_type": "conjugated godan verb", + "romaji": "nagurikoroshita" + }, + "殴り殺して": { + "w_type": "conjugated godan verb", + "romaji": "nagurikoroshite" + }, + "寝ころば": { + "w_type": "godan verb stem", + "romaji": "nekoroba" + }, + "寝ころび": { + "w_type": "godan verb stem", + "romaji": "nekorobi" + }, + "寝ころべ": { + "w_type": "conjugated godan verb", + "romaji": "nekorobe" + }, + "寝ころぼ": { + "w_type": "godan verb stem", + "romaji": "nekorobo" + }, + "寝ころんだ": { + "w_type": "conjugated godan verb", + "romaji": "nekoronda" + }, + "寝ころんで": { + "w_type": "conjugated godan verb", + "romaji": "nekoronde" + }, + "買戻さ": { + "w_type": "godan verb stem", + "romaji": "kaimodosa" + }, + "買戻し": { + "w_type": "godan verb stem", + "romaji": "kaimodoshi" + }, + "買戻せ": { + "w_type": "conjugated godan verb", + "romaji": "kaimodose" + }, + "買戻そ": { + "w_type": "godan verb stem", + "romaji": "kaimodoso" + }, + "買戻した": { + "w_type": "conjugated godan verb", + "romaji": "kaimodoshita" + }, + "買戻して": { + "w_type": "conjugated godan verb", + "romaji": "kaimodoshite" + }, + "揚がら": { + "w_type": "godan verb stem", + "romaji": "agara" + }, + "揚がり": { + "w_type": "godan verb stem", + "romaji": "agari" + }, + "揚がれ": { + "w_type": "conjugated godan verb", + "romaji": "agare" + }, + "揚がろ": { + "w_type": "godan verb stem", + "romaji": "agaro" + }, + "揚がった": { + "w_type": "conjugated godan verb", + "romaji": "agatta" + }, + "揚がって": { + "w_type": "conjugated godan verb", + "romaji": "agatte" + }, + "氏な": { + "w_type": "godan verb stem", + "romaji": "shina" + }, + "氏に": { + "w_type": "godan verb stem", + "romaji": "shini" + }, + "氏ね": { + "w_type": "conjugated godan verb", + "romaji": "shine" + }, + "氏の": { + "w_type": "godan verb stem", + "romaji": "shino" + }, + "氏んだ": { + "w_type": "conjugated godan verb", + "romaji": "shinda" + }, + "氏んで": { + "w_type": "conjugated godan verb", + "romaji": "shinde" + }, + "扼さ": { + "w_type": "godan verb stem", + "romaji": "yakusa" + }, + "扼し": { + "w_type": "godan verb stem", + "romaji": "yakushi" + }, + "扼せ": { + "w_type": "conjugated godan verb", + "romaji": "yakuse" + }, + "扼そ": { + "w_type": "godan verb stem", + "romaji": "yakuso" + }, + "扼した": { + "w_type": "conjugated godan verb", + "romaji": "yakushita" + }, + "扼して": { + "w_type": "conjugated godan verb", + "romaji": "yakushite" + }, + "食わさ": { + "w_type": "godan verb stem", + "romaji": "kuwasa" + }, + "食わし": { + "w_type": "godan verb stem", + "romaji": "kuwashi" + }, + "食わせ": { + "w_type": "conjugated godan verb", + "romaji": "kuwase" + }, + "食わそ": { + "w_type": "godan verb stem", + "romaji": "kuwaso" + }, + "食わした": { + "w_type": "conjugated godan verb", + "romaji": "kuwashita" + }, + "食わして": { + "w_type": "conjugated godan verb", + "romaji": "kuwashite" + }, + "掘り出さ": { + "w_type": "godan verb stem", + "romaji": "horidasa" + }, + "掘り出し": { + "w_type": "godan verb stem", + "romaji": "horidashi" + }, + "掘り出せ": { + "w_type": "conjugated godan verb", + "romaji": "horidase" + }, + "掘り出そ": { + "w_type": "godan verb stem", + "romaji": "horidaso" + }, + "掘り出した": { + "w_type": "conjugated godan verb", + "romaji": "horidashita" + }, + "掘り出して": { + "w_type": "conjugated godan verb", + "romaji": "horidashite" + }, + "掻い込ま": { + "w_type": "godan verb stem", + "romaji": "kaikoma" + }, + "掻い込み": { + "w_type": "godan verb stem", + "romaji": "kaikomi" + }, + "掻い込め": { + "w_type": "conjugated godan verb", + "romaji": "kaikome" + }, + "掻い込も": { + "w_type": "godan verb stem", + "romaji": "kaikomo" + }, + "掻い込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kaikonda" + }, + "掻い込んで": { + "w_type": "conjugated godan verb", + "romaji": "kaikonde" + }, + "息せき切ら": { + "w_type": "godan verb stem", + "romaji": "ikisekikira" + }, + "息せき切り": { + "w_type": "godan verb stem", + "romaji": "ikisekikiri" + }, + "息せき切れ": { + "w_type": "conjugated godan verb", + "romaji": "ikisekikire" + }, + "息せき切ろ": { + "w_type": "godan verb stem", + "romaji": "ikisekikiro" + }, + "息せき切った": { + "w_type": "conjugated godan verb", + "romaji": "ikisekikitta" + }, + "息せき切って": { + "w_type": "conjugated godan verb", + "romaji": "ikisekikitte" + }, + "溺れ損なわ": { + "w_type": "godan verb stem", + "romaji": "oboresokonawa" + }, + "溺れ損ない": { + "w_type": "godan verb stem", + "romaji": "oboresokonai" + }, + "溺れ損なえ": { + "w_type": "conjugated godan verb", + "romaji": "oboresokonae" + }, + "溺れ損なお": { + "w_type": "godan verb stem", + "romaji": "oboresokonao" + }, + "溺れ損なった": { + "w_type": "conjugated godan verb", + "romaji": "oboresokonatta" + }, + "溺れ損なって": { + "w_type": "conjugated godan verb", + "romaji": "oboresokonatte" + }, + "賑あわ": { + "w_type": "godan verb stem", + "romaji": "nigiawa" + }, + "賑あい": { + "w_type": "godan verb stem", + "romaji": "nigiai" + }, + "賑あえ": { + "w_type": "conjugated godan verb", + "romaji": "nigiae" + }, + "賑あお": { + "w_type": "godan verb stem", + "romaji": "nigiao" + }, + "賑あった": { + "w_type": "conjugated godan verb", + "romaji": "nigiatta" + }, + "賑あって": { + "w_type": "conjugated godan verb", + "romaji": "nigiatte" + }, + "懲らさ": { + "w_type": "godan verb stem", + "romaji": "korasa" + }, + "懲らし": { + "w_type": "godan verb stem", + "romaji": "korashi" + }, + "懲らせ": { + "w_type": "conjugated godan verb", + "romaji": "korase" + }, + "懲らそ": { + "w_type": "godan verb stem", + "romaji": "koraso" + }, + "懲らした": { + "w_type": "conjugated godan verb", + "romaji": "korashita" + }, + "懲らして": { + "w_type": "conjugated godan verb", + "romaji": "korashite" + }, + "払い切ら": { + "w_type": "godan verb stem", + "romaji": "haraikira" + }, + "払い切り": { + "w_type": "godan verb stem", + "romaji": "haraikiri" + }, + "払い切れ": { + "w_type": "conjugated godan verb", + "romaji": "haraikire" + }, + "払い切ろ": { + "w_type": "godan verb stem", + "romaji": "haraikiro" + }, + "払い切った": { + "w_type": "conjugated godan verb", + "romaji": "haraikitta" + }, + "払い切って": { + "w_type": "conjugated godan verb", + "romaji": "haraikitte" + }, + "絡ま": { + "w_type": "godan verb stem", + "romaji": "karama" + }, + "絡み": { + "w_type": "godan verb stem", + "romaji": "karami" + }, + "絡め": { + "w_type": "conjugated godan verb", + "romaji": "karame" + }, + "絡も": { + "w_type": "godan verb stem", + "romaji": "karamo" + }, + "絡んだ": { + "w_type": "conjugated godan verb", + "romaji": "karanda" + }, + "絡んで": { + "w_type": "conjugated godan verb", + "romaji": "karande" + }, + "掬い取ら": { + "w_type": "godan verb stem", + "romaji": "sukuitora" + }, + "掬い取り": { + "w_type": "godan verb stem", + "romaji": "sukuitori" + }, + "掬い取れ": { + "w_type": "conjugated godan verb", + "romaji": "sukuitore" + }, + "掬い取ろ": { + "w_type": "godan verb stem", + "romaji": "sukuitoro" + }, + "掬い取った": { + "w_type": "conjugated godan verb", + "romaji": "sukuitotta" + }, + "掬い取って": { + "w_type": "conjugated godan verb", + "romaji": "sukuitotte" + }, + "戯れ付か": { + "w_type": "godan verb stem", + "romaji": "jaretsuka" + }, + "戯れ付き": { + "w_type": "godan verb stem", + "romaji": "jaretsuki" + }, + "戯れ付け": { + "w_type": "conjugated godan verb", + "romaji": "jaretsuke" + }, + "戯れ付こ": { + "w_type": "godan verb stem", + "romaji": "jaretsuko" + }, + "戯れ付いた": { + "w_type": "conjugated godan verb", + "romaji": "jaretsuita" + }, + "戯れ付いて": { + "w_type": "conjugated godan verb", + "romaji": "jaretsuite" + }, + "輔か": { + "w_type": "godan verb stem", + "romaji": "tasuka" + }, + "輔き": { + "w_type": "godan verb stem", + "romaji": "tasuki" + }, + "輔け": { + "w_type": "conjugated godan verb", + "romaji": "tasuke" + }, + "輔こ": { + "w_type": "godan verb stem", + "romaji": "tasuko" + }, + "輔いた": { + "w_type": "conjugated godan verb", + "romaji": "tasuita" + }, + "輔いて": { + "w_type": "conjugated godan verb", + "romaji": "tasuite" + }, + "すっ転ば": { + "w_type": "godan verb stem", + "romaji": "sukkoroba" + }, + "すっ転び": { + "w_type": "godan verb stem", + "romaji": "sukkorobi" + }, + "すっ転べ": { + "w_type": "conjugated godan verb", + "romaji": "sukkorobe" + }, + "すっ転ぼ": { + "w_type": "godan verb stem", + "romaji": "sukkorobo" + }, + "すっ転んだ": { + "w_type": "conjugated godan verb", + "romaji": "sukkoronda" + }, + "すっ転んで": { + "w_type": "conjugated godan verb", + "romaji": "sukkoronde" + }, + "古さ": { + "w_type": "godan verb stem", + "romaji": "furusa" + }, + "古し": { + "w_type": "godan verb stem", + "romaji": "furushi" + }, + "古せ": { + "w_type": "conjugated godan verb", + "romaji": "furuse" + }, + "古そ": { + "w_type": "godan verb stem", + "romaji": "furuso" + }, + "古した": { + "w_type": "conjugated godan verb", + "romaji": "furushita" + }, + "古して": { + "w_type": "conjugated godan verb", + "romaji": "furushite" + }, + "踊り明かさ": { + "w_type": "godan verb stem", + "romaji": "odoriakasa" + }, + "踊り明かし": { + "w_type": "godan verb stem", + "romaji": "odoriakashi" + }, + "踊り明かせ": { + "w_type": "conjugated godan verb", + "romaji": "odoriakase" + }, + "踊り明かそ": { + "w_type": "godan verb stem", + "romaji": "odoriakaso" + }, + "踊り明かした": { + "w_type": "conjugated godan verb", + "romaji": "odoriakashita" + }, + "踊り明かして": { + "w_type": "conjugated godan verb", + "romaji": "odoriakashite" + }, + "造り出さ": { + "w_type": "godan verb stem", + "romaji": "tsukuridasa" + }, + "造り出し": { + "w_type": "godan verb stem", + "romaji": "tsukuridashi" + }, + "造り出せ": { + "w_type": "conjugated godan verb", + "romaji": "tsukuridase" + }, + "造り出そ": { + "w_type": "godan verb stem", + "romaji": "tsukuridaso" + }, + "造り出した": { + "w_type": "conjugated godan verb", + "romaji": "tsukuridashita" + }, + "造り出して": { + "w_type": "conjugated godan verb", + "romaji": "tsukuridashite" + }, + "ごった返えさ": { + "w_type": "godan verb stem", + "romaji": "gottagaesa" + }, + "ごった返えし": { + "w_type": "godan verb stem", + "romaji": "gottagaeshi" + }, + "ごった返えせ": { + "w_type": "conjugated godan verb", + "romaji": "gottagaese" + }, + "ごった返えそ": { + "w_type": "godan verb stem", + "romaji": "gottagaeso" + }, + "ごった返えした": { + "w_type": "conjugated godan verb", + "romaji": "gottagaeshita" + }, + "ごった返えして": { + "w_type": "conjugated godan verb", + "romaji": "gottagaeshite" + }, + "引絞ら": { + "w_type": "godan verb stem", + "romaji": "hikishibora" + }, + "引絞り": { + "w_type": "godan verb stem", + "romaji": "hikishibori" + }, + "引絞れ": { + "w_type": "conjugated godan verb", + "romaji": "hikishibore" + }, + "引絞ろ": { + "w_type": "godan verb stem", + "romaji": "hikishiboro" + }, + "引絞った": { + "w_type": "conjugated godan verb", + "romaji": "hikishibotta" + }, + "引絞って": { + "w_type": "conjugated godan verb", + "romaji": "hikishibotte" + }, + "填め込ま": { + "w_type": "godan verb stem", + "romaji": "hamekoma" + }, + "填め込み": { + "w_type": "godan verb stem", + "romaji": "hamekomi" + }, + "填め込め": { + "w_type": "conjugated godan verb", + "romaji": "hamekome" + }, + "填め込も": { + "w_type": "godan verb stem", + "romaji": "hamekomo" + }, + "填め込んだ": { + "w_type": "conjugated godan verb", + "romaji": "hamekonda" + }, + "填め込んで": { + "w_type": "conjugated godan verb", + "romaji": "hamekonde" + }, + "飛びつか": { + "w_type": "godan verb stem", + "romaji": "tobitsuka" + }, + "飛びつき": { + "w_type": "godan verb stem", + "romaji": "tobitsuki" + }, + "飛びつけ": { + "w_type": "conjugated godan verb", + "romaji": "tobitsuke" + }, + "飛びつこ": { + "w_type": "godan verb stem", + "romaji": "tobitsuko" + }, + "飛びついた": { + "w_type": "conjugated godan verb", + "romaji": "tobitsuita" + }, + "飛びついて": { + "w_type": "conjugated godan verb", + "romaji": "tobitsuite" + }, + "書き出さ": { + "w_type": "godan verb stem", + "romaji": "kakidasa" + }, + "書き出し": { + "w_type": "godan verb stem", + "romaji": "kakidashi" + }, + "書き出せ": { + "w_type": "conjugated godan verb", + "romaji": "kakidase" + }, + "書き出そ": { + "w_type": "godan verb stem", + "romaji": "kakidaso" + }, + "書き出した": { + "w_type": "conjugated godan verb", + "romaji": "kakidashita" + }, + "書き出して": { + "w_type": "conjugated godan verb", + "romaji": "kakidashite" + }, + "受け戻さ": { + "w_type": "godan verb stem", + "romaji": "ukemodosa" + }, + "受け戻し": { + "w_type": "godan verb stem", + "romaji": "ukemodoshi" + }, + "受け戻せ": { + "w_type": "conjugated godan verb", + "romaji": "ukemodose" + }, + "受け戻そ": { + "w_type": "godan verb stem", + "romaji": "ukemodoso" + }, + "受け戻した": { + "w_type": "conjugated godan verb", + "romaji": "ukemodoshita" + }, + "受け戻して": { + "w_type": "conjugated godan verb", + "romaji": "ukemodoshite" + }, + "話し合わ": { + "w_type": "godan verb stem", + "romaji": "hanashiawa" + }, + "話し合い": { + "w_type": "godan verb stem", + "romaji": "hanashiai" + }, + "話し合え": { + "w_type": "conjugated godan verb", + "romaji": "hanashiae" + }, + "話し合お": { + "w_type": "godan verb stem", + "romaji": "hanashiao" + }, + "話し合った": { + "w_type": "conjugated godan verb", + "romaji": "hanashiatta" + }, + "話し合って": { + "w_type": "conjugated godan verb", + "romaji": "hanashiatte" + }, + "斎わ": { + "w_type": "godan verb stem", + "romaji": "iwawa" + }, + "斎い": { + "w_type": "godan verb stem", + "romaji": "iwai" + }, + "斎え": { + "w_type": "conjugated godan verb", + "romaji": "iwae" + }, + "斎お": { + "w_type": "godan verb stem", + "romaji": "iwao" + }, + "斎った": { + "w_type": "conjugated godan verb", + "romaji": "iwatta" + }, + "斎って": { + "w_type": "conjugated godan verb", + "romaji": "iwatte" + }, + "溜込ま": { + "w_type": "godan verb stem", + "romaji": "tamekoma" + }, + "溜込み": { + "w_type": "godan verb stem", + "romaji": "tamekomi" + }, + "溜込め": { + "w_type": "conjugated godan verb", + "romaji": "tamekome" + }, + "溜込も": { + "w_type": "godan verb stem", + "romaji": "tamekomo" + }, + "溜込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tamekonda" + }, + "溜込んで": { + "w_type": "conjugated godan verb", + "romaji": "tamekonde" + }, + "責付か": { + "w_type": "godan verb stem", + "romaji": "settsuka" + }, + "責付き": { + "w_type": "godan verb stem", + "romaji": "settsuki" + }, + "責付け": { + "w_type": "conjugated godan verb", + "romaji": "settsuke" + }, + "責付こ": { + "w_type": "godan verb stem", + "romaji": "settsuko" + }, + "責付いた": { + "w_type": "conjugated godan verb", + "romaji": "settsuita" + }, + "責付いて": { + "w_type": "conjugated godan verb", + "romaji": "settsuite" + }, + "捩込ま": { + "w_type": "godan verb stem", + "romaji": "nejikoma" + }, + "捩込み": { + "w_type": "godan verb stem", + "romaji": "nejikomi" + }, + "捩込め": { + "w_type": "conjugated godan verb", + "romaji": "nejikome" + }, + "捩込も": { + "w_type": "godan verb stem", + "romaji": "nejikomo" + }, + "捩込んだ": { + "w_type": "conjugated godan verb", + "romaji": "nejikonda" + }, + "捩込んで": { + "w_type": "conjugated godan verb", + "romaji": "nejikonde" + }, + "書きなおさ": { + "w_type": "godan verb stem", + "romaji": "kakinaosa" + }, + "書きなおし": { + "w_type": "godan verb stem", + "romaji": "kakinaoshi" + }, + "書きなおせ": { + "w_type": "conjugated godan verb", + "romaji": "kakinaose" + }, + "書きなおそ": { + "w_type": "godan verb stem", + "romaji": "kakinaoso" + }, + "書きなおした": { + "w_type": "conjugated godan verb", + "romaji": "kakinaoshita" + }, + "書きなおして": { + "w_type": "conjugated godan verb", + "romaji": "kakinaoshite" + }, + "かけ合わ": { + "w_type": "godan verb stem", + "romaji": "kakeawa" + }, + "かけ合い": { + "w_type": "godan verb stem", + "romaji": "kakeai" + }, + "かけ合え": { + "w_type": "conjugated godan verb", + "romaji": "kakeae" + }, + "かけ合お": { + "w_type": "godan verb stem", + "romaji": "kakeao" + }, + "かけ合った": { + "w_type": "conjugated godan verb", + "romaji": "kakeatta" + }, + "かけ合って": { + "w_type": "conjugated godan verb", + "romaji": "kakeatte" + }, + "買足さ": { + "w_type": "godan verb stem", + "romaji": "kaitasa" + }, + "買足し": { + "w_type": "godan verb stem", + "romaji": "kaitashi" + }, + "買足せ": { + "w_type": "conjugated godan verb", + "romaji": "kaitase" + }, + "買足そ": { + "w_type": "godan verb stem", + "romaji": "kaitaso" + }, + "買足した": { + "w_type": "conjugated godan verb", + "romaji": "kaitashita" + }, + "買足して": { + "w_type": "conjugated godan verb", + "romaji": "kaitashite" + }, + "囲わ": { + "w_type": "godan verb stem", + "romaji": "kakowa" + }, + "囲い": { + "w_type": "godan verb stem", + "romaji": "kakoi" + }, + "囲え": { + "w_type": "conjugated godan verb", + "romaji": "kakoe" + }, + "囲お": { + "w_type": "godan verb stem", + "romaji": "kakoo" + }, + "囲った": { + "w_type": "conjugated godan verb", + "romaji": "kakotta" + }, + "囲って": { + "w_type": "conjugated godan verb", + "romaji": "kakotte" + }, + "呶鳴り出さ": { + "w_type": "godan verb stem", + "romaji": "donaridasa" + }, + "呶鳴り出し": { + "w_type": "godan verb stem", + "romaji": "donaridashi" + }, + "呶鳴り出せ": { + "w_type": "conjugated godan verb", + "romaji": "donaridase" + }, + "呶鳴り出そ": { + "w_type": "godan verb stem", + "romaji": "donaridaso" + }, + "呶鳴り出した": { + "w_type": "conjugated godan verb", + "romaji": "donaridashita" + }, + "呶鳴り出して": { + "w_type": "conjugated godan verb", + "romaji": "donaridashite" + }, + "説き及ば": { + "w_type": "godan verb stem", + "romaji": "tokioyoba" + }, + "説き及び": { + "w_type": "godan verb stem", + "romaji": "tokioyobi" + }, + "説き及べ": { + "w_type": "conjugated godan verb", + "romaji": "tokioyobe" + }, + "説き及ぼ": { + "w_type": "godan verb stem", + "romaji": "tokioyobo" + }, + "説き及んだ": { + "w_type": "conjugated godan verb", + "romaji": "tokioyonda" + }, + "説き及んで": { + "w_type": "conjugated godan verb", + "romaji": "tokioyonde" + }, + "篭もら": { + "w_type": "godan verb stem", + "romaji": "komora" + }, + "篭もり": { + "w_type": "godan verb stem", + "romaji": "komori" + }, + "篭もれ": { + "w_type": "conjugated godan verb", + "romaji": "komore" + }, + "篭もろ": { + "w_type": "godan verb stem", + "romaji": "komoro" + }, + "篭もった": { + "w_type": "conjugated godan verb", + "romaji": "komotta" + }, + "篭もって": { + "w_type": "conjugated godan verb", + "romaji": "komotte" + }, + "躍り掛から": { + "w_type": "godan verb stem", + "romaji": "odorikakara" + }, + "躍り掛かり": { + "w_type": "godan verb stem", + "romaji": "odorikakari" + }, + "躍り掛かれ": { + "w_type": "conjugated godan verb", + "romaji": "odorikakare" + }, + "躍り掛かろ": { + "w_type": "godan verb stem", + "romaji": "odorikakaro" + }, + "躍り掛かった": { + "w_type": "conjugated godan verb", + "romaji": "odorikakatta" + }, + "躍り掛かって": { + "w_type": "conjugated godan verb", + "romaji": "odorikakatte" + }, + "刮が": { + "w_type": "godan verb stem", + "romaji": "kosoga" + }, + "刮ぎ": { + "w_type": "godan verb stem", + "romaji": "kosogi" + }, + "刮げ": { + "w_type": "conjugated godan verb", + "romaji": "kosoge" + }, + "刮ご": { + "w_type": "godan verb stem", + "romaji": "kosogo" + }, + "刮いだ": { + "w_type": "conjugated godan verb", + "romaji": "kosoida" + }, + "刮いで": { + "w_type": "conjugated godan verb", + "romaji": "kosoide" + }, + "下り立た": { + "w_type": "godan verb stem", + "romaji": "oritata" + }, + "下り立ち": { + "w_type": "godan verb stem", + "romaji": "oritachi" + }, + "下り立て": { + "w_type": "conjugated godan verb", + "romaji": "oritate" + }, + "下り立と": { + "w_type": "godan verb stem", + "romaji": "oritato" + }, + "下り立った": { + "w_type": "conjugated godan verb", + "romaji": "oritatta" + }, + "下り立って": { + "w_type": "conjugated godan verb", + "romaji": "oritatte" + }, + "絞込ま": { + "w_type": "godan verb stem", + "romaji": "shiborikoma" + }, + "絞込み": { + "w_type": "godan verb stem", + "romaji": "shiborikomi" + }, + "絞込め": { + "w_type": "conjugated godan verb", + "romaji": "shiborikome" + }, + "絞込も": { + "w_type": "godan verb stem", + "romaji": "shiborikomo" + }, + "絞込んだ": { + "w_type": "conjugated godan verb", + "romaji": "shiborikonda" + }, + "絞込んで": { + "w_type": "conjugated godan verb", + "romaji": "shiborikonde" + }, + "ずり下がら": { + "w_type": "godan verb stem", + "romaji": "zurisagara" + }, + "ずり下がり": { + "w_type": "godan verb stem", + "romaji": "zurisagari" + }, + "ずり下がれ": { + "w_type": "conjugated godan verb", + "romaji": "zurisagare" + }, + "ずり下がろ": { + "w_type": "godan verb stem", + "romaji": "zurisagaro" + }, + "ずり下がった": { + "w_type": "conjugated godan verb", + "romaji": "zurisagatta" + }, + "ずり下がって": { + "w_type": "conjugated godan verb", + "romaji": "zurisagatte" + }, + "殴り飛ばさ": { + "w_type": "godan verb stem", + "romaji": "naguritobasa" + }, + "殴り飛ばし": { + "w_type": "godan verb stem", + "romaji": "naguritobashi" + }, + "殴り飛ばせ": { + "w_type": "conjugated godan verb", + "romaji": "naguritobase" + }, + "殴り飛ばそ": { + "w_type": "godan verb stem", + "romaji": "naguritobaso" + }, + "殴り飛ばした": { + "w_type": "conjugated godan verb", + "romaji": "naguritobashita" + }, + "殴り飛ばして": { + "w_type": "conjugated godan verb", + "romaji": "naguritobashite" + }, + "読み返さ": { + "w_type": "godan verb stem", + "romaji": "yomikaesa" + }, + "読み返し": { + "w_type": "godan verb stem", + "romaji": "yomikaeshi" + }, + "読み返せ": { + "w_type": "conjugated godan verb", + "romaji": "yomikaese" + }, + "読み返そ": { + "w_type": "godan verb stem", + "romaji": "yomikaeso" + }, + "読み返した": { + "w_type": "conjugated godan verb", + "romaji": "yomikaeshita" + }, + "読み返して": { + "w_type": "conjugated godan verb", + "romaji": "yomikaeshite" + }, + "悖ら": { + "w_type": "godan verb stem", + "romaji": "motora" + }, + "悖り": { + "w_type": "godan verb stem", + "romaji": "motori" + }, + "悖れ": { + "w_type": "conjugated godan verb", + "romaji": "motore" + }, + "悖ろ": { + "w_type": "godan verb stem", + "romaji": "motoro" + }, + "悖った": { + "w_type": "conjugated godan verb", + "romaji": "mototta" + }, + "悖って": { + "w_type": "conjugated godan verb", + "romaji": "mototte" + }, + "度重なら": { + "w_type": "godan verb stem", + "romaji": "tabikasanara" + }, + "度重なり": { + "w_type": "godan verb stem", + "romaji": "tabikasanari" + }, + "度重なれ": { + "w_type": "conjugated godan verb", + "romaji": "tabikasanare" + }, + "度重なろ": { + "w_type": "godan verb stem", + "romaji": "tabikasanaro" + }, + "度重なった": { + "w_type": "conjugated godan verb", + "romaji": "tabikasanatta" + }, + "度重なって": { + "w_type": "conjugated godan verb", + "romaji": "tabikasanatte" + }, + "終ら": { + "w_type": "godan verb stem", + "romaji": "owara" + }, + "終り": { + "w_type": "godan verb stem", + "romaji": "owari" + }, + "終れ": { + "w_type": "conjugated godan verb", + "romaji": "oware" + }, + "終ろ": { + "w_type": "godan verb stem", + "romaji": "owaro" + }, + "終った": { + "w_type": "conjugated godan verb", + "romaji": "owatta" + }, + "終って": { + "w_type": "conjugated godan verb", + "romaji": "owatte" + }, + "叩きなおさ": { + "w_type": "godan verb stem", + "romaji": "tatakinaosa" + }, + "叩きなおし": { + "w_type": "godan verb stem", + "romaji": "tatakinaoshi" + }, + "叩きなおせ": { + "w_type": "conjugated godan verb", + "romaji": "tatakinaose" + }, + "叩きなおそ": { + "w_type": "godan verb stem", + "romaji": "tatakinaoso" + }, + "叩きなおした": { + "w_type": "conjugated godan verb", + "romaji": "tatakinaoshita" + }, + "叩きなおして": { + "w_type": "conjugated godan verb", + "romaji": "tatakinaoshite" + }, + "折り返さ": { + "w_type": "godan verb stem", + "romaji": "orikaesa" + }, + "折り返し": { + "w_type": "godan verb stem", + "romaji": "orikaeshi" + }, + "折り返せ": { + "w_type": "conjugated godan verb", + "romaji": "orikaese" + }, + "折り返そ": { + "w_type": "godan verb stem", + "romaji": "orikaeso" + }, + "折り返した": { + "w_type": "conjugated godan verb", + "romaji": "orikaeshita" + }, + "折り返して": { + "w_type": "conjugated godan verb", + "romaji": "orikaeshite" + }, + "洗いざらさ": { + "w_type": "godan verb stem", + "romaji": "araizarasa" + }, + "洗いざらし": { + "w_type": "godan verb stem", + "romaji": "araizarashi" + }, + "洗いざらせ": { + "w_type": "conjugated godan verb", + "romaji": "araizarase" + }, + "洗いざらそ": { + "w_type": "godan verb stem", + "romaji": "araizaraso" + }, + "洗いざらした": { + "w_type": "conjugated godan verb", + "romaji": "araizarashita" + }, + "洗いざらして": { + "w_type": "conjugated godan verb", + "romaji": "araizarashite" + }, + "打ち殺さ": { + "w_type": "godan verb stem", + "romaji": "uchikorosa" + }, + "打ち殺し": { + "w_type": "godan verb stem", + "romaji": "uchikoroshi" + }, + "打ち殺せ": { + "w_type": "conjugated godan verb", + "romaji": "uchikorose" + }, + "打ち殺そ": { + "w_type": "godan verb stem", + "romaji": "uchikoroso" + }, + "打ち殺した": { + "w_type": "conjugated godan verb", + "romaji": "uchikoroshita" + }, + "打ち殺して": { + "w_type": "conjugated godan verb", + "romaji": "uchikoroshite" + }, + "発か": { + "w_type": "godan verb stem", + "romaji": "abaka" + }, + "発き": { + "w_type": "godan verb stem", + "romaji": "abaki" + }, + "発け": { + "w_type": "conjugated godan verb", + "romaji": "abake" + }, + "発こ": { + "w_type": "godan verb stem", + "romaji": "abako" + }, + "発いた": { + "w_type": "conjugated godan verb", + "romaji": "abaita" + }, + "発いて": { + "w_type": "conjugated godan verb", + "romaji": "abaite" + }, + "刷り込ま": { + "w_type": "godan verb stem", + "romaji": "surikoma" + }, + "刷り込み": { + "w_type": "godan verb stem", + "romaji": "surikomi" + }, + "刷り込め": { + "w_type": "conjugated godan verb", + "romaji": "surikome" + }, + "刷り込も": { + "w_type": "godan verb stem", + "romaji": "surikomo" + }, + "刷り込んだ": { + "w_type": "conjugated godan verb", + "romaji": "surikonda" + }, + "刷り込んで": { + "w_type": "conjugated godan verb", + "romaji": "surikonde" + }, + "荒ま": { + "w_type": "godan verb stem", + "romaji": "susama" + }, + "荒み": { + "w_type": "godan verb stem", + "romaji": "susami" + }, + "荒め": { + "w_type": "conjugated godan verb", + "romaji": "susame" + }, + "荒も": { + "w_type": "godan verb stem", + "romaji": "susamo" + }, + "荒んだ": { + "w_type": "conjugated godan verb", + "romaji": "susanda" + }, + "荒んで": { + "w_type": "conjugated godan verb", + "romaji": "susande" + }, + "起さ": { + "w_type": "godan verb stem", + "romaji": "okosa" + }, + "起し": { + "w_type": "godan verb stem", + "romaji": "okoshi" + }, + "起せ": { + "w_type": "conjugated godan verb", + "romaji": "okose" + }, + "起そ": { + "w_type": "godan verb stem", + "romaji": "okoso" + }, + "起した": { + "w_type": "conjugated godan verb", + "romaji": "okoshita" + }, + "起して": { + "w_type": "conjugated godan verb", + "romaji": "okoshite" + }, + "踊りださ": { + "w_type": "godan verb stem", + "romaji": "odoridasa" + }, + "踊りだし": { + "w_type": "godan verb stem", + "romaji": "odoridashi" + }, + "踊りだせ": { + "w_type": "conjugated godan verb", + "romaji": "odoridase" + }, + "踊りだそ": { + "w_type": "godan verb stem", + "romaji": "odoridaso" + }, + "踊りだした": { + "w_type": "conjugated godan verb", + "romaji": "odoridashita" + }, + "踊りだして": { + "w_type": "conjugated godan verb", + "romaji": "odoridashite" + }, + "為ら": { + "w_type": "godan verb stem", + "romaji": "nara" + }, + "為り": { + "w_type": "godan verb stem", + "romaji": "nari" + }, + "為れ": { + "w_type": "conjugated godan verb", + "romaji": "nare" + }, + "為ろ": { + "w_type": "godan verb stem", + "romaji": "naro" + }, + "為った": { + "w_type": "conjugated godan verb", + "romaji": "natta" + }, + "為って": { + "w_type": "conjugated godan verb", + "romaji": "natte" + }, + "囓ら": { + "w_type": "godan verb stem", + "romaji": "kajira" + }, + "囓り": { + "w_type": "godan verb stem", + "romaji": "kajiri" + }, + "囓れ": { + "w_type": "conjugated godan verb", + "romaji": "kajire" + }, + "囓ろ": { + "w_type": "godan verb stem", + "romaji": "kajiro" + }, + "囓った": { + "w_type": "conjugated godan verb", + "romaji": "kajitta" + }, + "囓って": { + "w_type": "conjugated godan verb", + "romaji": "kajitte" + }, + "跳びつか": { + "w_type": "godan verb stem", + "romaji": "tobitsuka" + }, + "跳びつき": { + "w_type": "godan verb stem", + "romaji": "tobitsuki" + }, + "跳びつけ": { + "w_type": "conjugated godan verb", + "romaji": "tobitsuke" + }, + "跳びつこ": { + "w_type": "godan verb stem", + "romaji": "tobitsuko" + }, + "跳びついた": { + "w_type": "conjugated godan verb", + "romaji": "tobitsuita" + }, + "跳びついて": { + "w_type": "conjugated godan verb", + "romaji": "tobitsuite" + }, + "誘わ": { + "w_type": "godan verb stem", + "romaji": "sasowa" + }, + "誘い": { + "w_type": "godan verb stem", + "romaji": "sasoi" + }, + "誘え": { + "w_type": "conjugated godan verb", + "romaji": "sasoe" + }, + "誘お": { + "w_type": "godan verb stem", + "romaji": "sasoo" + }, + "誘った": { + "w_type": "conjugated godan verb", + "romaji": "sasotta" + }, + "誘って": { + "w_type": "conjugated godan verb", + "romaji": "sasotte" + }, + "滑り落とさ": { + "w_type": "godan verb stem", + "romaji": "suberiotosa" + }, + "滑り落とし": { + "w_type": "godan verb stem", + "romaji": "suberiotoshi" + }, + "滑り落とせ": { + "w_type": "conjugated godan verb", + "romaji": "suberiotose" + }, + "滑り落とそ": { + "w_type": "godan verb stem", + "romaji": "suberiotoso" + }, + "滑り落とした": { + "w_type": "conjugated godan verb", + "romaji": "suberiotoshita" + }, + "滑り落として": { + "w_type": "conjugated godan verb", + "romaji": "suberiotoshite" + }, + "咲き出さ": { + "w_type": "godan verb stem", + "romaji": "sakidasa" + }, + "咲き出し": { + "w_type": "godan verb stem", + "romaji": "sakidashi" + }, + "咲き出せ": { + "w_type": "conjugated godan verb", + "romaji": "sakidase" + }, + "咲き出そ": { + "w_type": "godan verb stem", + "romaji": "sakidaso" + }, + "咲き出した": { + "w_type": "conjugated godan verb", + "romaji": "sakidashita" + }, + "咲き出して": { + "w_type": "conjugated godan verb", + "romaji": "sakidashite" + }, + "下ろさ": { + "w_type": "godan verb stem", + "romaji": "orosa" + }, + "下ろし": { + "w_type": "godan verb stem", + "romaji": "oroshi" + }, + "下ろせ": { + "w_type": "conjugated godan verb", + "romaji": "orose" + }, + "下ろそ": { + "w_type": "godan verb stem", + "romaji": "oroso" + }, + "下ろした": { + "w_type": "conjugated godan verb", + "romaji": "oroshita" + }, + "下ろして": { + "w_type": "conjugated godan verb", + "romaji": "oroshite" + }, + "移り変わら": { + "w_type": "godan verb stem", + "romaji": "utsurikawara" + }, + "移り変わり": { + "w_type": "godan verb stem", + "romaji": "utsurikawari" + }, + "移り変われ": { + "w_type": "conjugated godan verb", + "romaji": "utsurikaware" + }, + "移り変わろ": { + "w_type": "godan verb stem", + "romaji": "utsurikawaro" + }, + "移り変わった": { + "w_type": "conjugated godan verb", + "romaji": "utsurikawatta" + }, + "移り変わって": { + "w_type": "conjugated godan verb", + "romaji": "utsurikawatte" + }, + "為さ": { + "w_type": "godan verb stem", + "romaji": "nasa" + }, + "為し": { + "w_type": "godan verb stem", + "romaji": "nashi" + }, + "為せ": { + "w_type": "conjugated godan verb", + "romaji": "nase" + }, + "為そ": { + "w_type": "godan verb stem", + "romaji": "naso" + }, + "為した": { + "w_type": "conjugated godan verb", + "romaji": "nashita" + }, + "為して": { + "w_type": "conjugated godan verb", + "romaji": "nashite" + }, + "割切ら": { + "w_type": "godan verb stem", + "romaji": "warikira" + }, + "割切り": { + "w_type": "godan verb stem", + "romaji": "warikiri" + }, + "割切れ": { + "w_type": "conjugated godan verb", + "romaji": "warikire" + }, + "割切ろ": { + "w_type": "godan verb stem", + "romaji": "warikiro" + }, + "割切った": { + "w_type": "conjugated godan verb", + "romaji": "warikitta" + }, + "割切って": { + "w_type": "conjugated godan verb", + "romaji": "warikitte" + }, + "奮い起さ": { + "w_type": "godan verb stem", + "romaji": "furuiokosa" + }, + "奮い起し": { + "w_type": "godan verb stem", + "romaji": "furuiokoshi" + }, + "奮い起せ": { + "w_type": "conjugated godan verb", + "romaji": "furuiokose" + }, + "奮い起そ": { + "w_type": "godan verb stem", + "romaji": "furuiokoso" + }, + "奮い起した": { + "w_type": "conjugated godan verb", + "romaji": "furuiokoshita" + }, + "奮い起して": { + "w_type": "conjugated godan verb", + "romaji": "furuiokoshite" + }, + "出てゆか": { + "w_type": "godan verb stem", + "romaji": "deteika" + }, + "出てゆき": { + "w_type": "godan verb stem", + "romaji": "deteiki" + }, + "出てゆけ": { + "w_type": "conjugated godan verb", + "romaji": "deteike" + }, + "出てゆこ": { + "w_type": "godan verb stem", + "romaji": "deteiko" + }, + "出てゆいた": { + "w_type": "conjugated godan verb", + "romaji": "deteiita" + }, + "出てゆいて": { + "w_type": "conjugated godan verb", + "romaji": "deteiite" + }, + "反っくり返ら": { + "w_type": "godan verb stem", + "romaji": "sokkurikaera" + }, + "反っくり返り": { + "w_type": "godan verb stem", + "romaji": "sokkurikaeri" + }, + "反っくり返れ": { + "w_type": "conjugated godan verb", + "romaji": "sokkurikaere" + }, + "反っくり返ろ": { + "w_type": "godan verb stem", + "romaji": "sokkurikaero" + }, + "反っくり返った": { + "w_type": "conjugated godan verb", + "romaji": "sokkurikaetta" + }, + "反っくり返って": { + "w_type": "conjugated godan verb", + "romaji": "sokkurikaette" + }, + "啜り込ま": { + "w_type": "godan verb stem", + "romaji": "susurikoma" + }, + "啜り込み": { + "w_type": "godan verb stem", + "romaji": "susurikomi" + }, + "啜り込め": { + "w_type": "conjugated godan verb", + "romaji": "susurikome" + }, + "啜り込も": { + "w_type": "godan verb stem", + "romaji": "susurikomo" + }, + "啜り込んだ": { + "w_type": "conjugated godan verb", + "romaji": "susurikonda" + }, + "啜り込んで": { + "w_type": "conjugated godan verb", + "romaji": "susurikonde" + }, + "趣か": { + "w_type": "godan verb stem", + "romaji": "omomuka" + }, + "趣き": { + "w_type": "godan verb stem", + "romaji": "omomuki" + }, + "趣け": { + "w_type": "conjugated godan verb", + "romaji": "omomuke" + }, + "趣こ": { + "w_type": "godan verb stem", + "romaji": "omomuko" + }, + "趣いた": { + "w_type": "conjugated godan verb", + "romaji": "omomuita" + }, + "趣いて": { + "w_type": "conjugated godan verb", + "romaji": "omomuite" + }, + "次が": { + "w_type": "godan verb stem", + "romaji": "tsuga" + }, + "次ぎ": { + "w_type": "godan verb stem", + "romaji": "tsugi" + }, + "次げ": { + "w_type": "conjugated godan verb", + "romaji": "tsuge" + }, + "次ご": { + "w_type": "godan verb stem", + "romaji": "tsugo" + }, + "次いだ": { + "w_type": "conjugated godan verb", + "romaji": "tsuida" + }, + "次いで": { + "w_type": "conjugated godan verb", + "romaji": "tsuide" + }, + "壊さ": { + "w_type": "godan verb stem", + "romaji": "kowasa" + }, + "壊し": { + "w_type": "godan verb stem", + "romaji": "kowashi" + }, + "壊せ": { + "w_type": "conjugated godan verb", + "romaji": "kowase" + }, + "壊そ": { + "w_type": "godan verb stem", + "romaji": "kowaso" + }, + "壊した": { + "w_type": "conjugated godan verb", + "romaji": "kowashita" + }, + "壊して": { + "w_type": "conjugated godan verb", + "romaji": "kowashite" + }, + "掘り起さ": { + "w_type": "godan verb stem", + "romaji": "horiokosa" + }, + "掘り起し": { + "w_type": "godan verb stem", + "romaji": "horiokoshi" + }, + "掘り起せ": { + "w_type": "conjugated godan verb", + "romaji": "horiokose" + }, + "掘り起そ": { + "w_type": "godan verb stem", + "romaji": "horiokoso" + }, + "掘り起した": { + "w_type": "conjugated godan verb", + "romaji": "horiokoshita" + }, + "掘り起して": { + "w_type": "conjugated godan verb", + "romaji": "horiokoshite" + }, + "貪りつくさ": { + "w_type": "godan verb stem", + "romaji": "musaboritsukusa" + }, + "貪りつくし": { + "w_type": "godan verb stem", + "romaji": "musaboritsukushi" + }, + "貪りつくせ": { + "w_type": "conjugated godan verb", + "romaji": "musaboritsukuse" + }, + "貪りつくそ": { + "w_type": "godan verb stem", + "romaji": "musaboritsukuso" + }, + "貪りつくした": { + "w_type": "conjugated godan verb", + "romaji": "musaboritsukushita" + }, + "貪りつくして": { + "w_type": "conjugated godan verb", + "romaji": "musaboritsukushite" + }, + "ちぎり取ら": { + "w_type": "godan verb stem", + "romaji": "chigiritora" + }, + "ちぎり取り": { + "w_type": "godan verb stem", + "romaji": "chigiritori" + }, + "ちぎり取れ": { + "w_type": "conjugated godan verb", + "romaji": "chigiritore" + }, + "ちぎり取ろ": { + "w_type": "godan verb stem", + "romaji": "chigiritoro" + }, + "ちぎり取った": { + "w_type": "conjugated godan verb", + "romaji": "chigiritotta" + }, + "ちぎり取って": { + "w_type": "conjugated godan verb", + "romaji": "chigiritotte" + }, + "使い慣らさ": { + "w_type": "godan verb stem", + "romaji": "tsukainarasa" + }, + "使い慣らし": { + "w_type": "godan verb stem", + "romaji": "tsukainarashi" + }, + "使い慣らせ": { + "w_type": "conjugated godan verb", + "romaji": "tsukainarase" + }, + "使い慣らそ": { + "w_type": "godan verb stem", + "romaji": "tsukainaraso" + }, + "使い慣らした": { + "w_type": "conjugated godan verb", + "romaji": "tsukainarashita" + }, + "使い慣らして": { + "w_type": "conjugated godan verb", + "romaji": "tsukainarashite" + }, + "切り捲ら": { + "w_type": "godan verb stem", + "romaji": "kirimakura" + }, + "切り捲り": { + "w_type": "godan verb stem", + "romaji": "kirimakuri" + }, + "切り捲れ": { + "w_type": "conjugated godan verb", + "romaji": "kirimakure" + }, + "切り捲ろ": { + "w_type": "godan verb stem", + "romaji": "kirimakuro" + }, + "切り捲った": { + "w_type": "conjugated godan verb", + "romaji": "kirimakutta" + }, + "切り捲って": { + "w_type": "conjugated godan verb", + "romaji": "kirimakutte" + }, + "先だた": { + "w_type": "godan verb stem", + "romaji": "sakidata" + }, + "先だち": { + "w_type": "godan verb stem", + "romaji": "sakidachi" + }, + "先だて": { + "w_type": "conjugated godan verb", + "romaji": "sakidate" + }, + "先だと": { + "w_type": "godan verb stem", + "romaji": "sakidato" + }, + "先だった": { + "w_type": "conjugated godan verb", + "romaji": "sakidatta" + }, + "先だって": { + "w_type": "conjugated godan verb", + "romaji": "sakidatte" + }, + "追払わ": { + "w_type": "godan verb stem", + "romaji": "oiharawa" + }, + "追払い": { + "w_type": "godan verb stem", + "romaji": "oiharai" + }, + "追払え": { + "w_type": "conjugated godan verb", + "romaji": "oiharae" + }, + "追払お": { + "w_type": "godan verb stem", + "romaji": "oiharao" + }, + "追払った": { + "w_type": "conjugated godan verb", + "romaji": "oiharatta" + }, + "追払って": { + "w_type": "conjugated godan verb", + "romaji": "oiharatte" + }, + "稼ぎ取ら": { + "w_type": "godan verb stem", + "romaji": "kasegitora" + }, + "稼ぎ取り": { + "w_type": "godan verb stem", + "romaji": "kasegitori" + }, + "稼ぎ取れ": { + "w_type": "conjugated godan verb", + "romaji": "kasegitore" + }, + "稼ぎ取ろ": { + "w_type": "godan verb stem", + "romaji": "kasegitoro" + }, + "稼ぎ取った": { + "w_type": "conjugated godan verb", + "romaji": "kasegitotta" + }, + "稼ぎ取って": { + "w_type": "conjugated godan verb", + "romaji": "kasegitotte" + }, + "打切ら": { + "w_type": "godan verb stem", + "romaji": "uchikira" + }, + "打切り": { + "w_type": "godan verb stem", + "romaji": "uchikiri" + }, + "打切れ": { + "w_type": "conjugated godan verb", + "romaji": "uchikire" + }, + "打切ろ": { + "w_type": "godan verb stem", + "romaji": "uchikiro" + }, + "打切った": { + "w_type": "conjugated godan verb", + "romaji": "uchikitta" + }, + "打切って": { + "w_type": "conjugated godan verb", + "romaji": "uchikitte" + }, + "渋ら": { + "w_type": "godan verb stem", + "romaji": "shibura" + }, + "渋り": { + "w_type": "godan verb stem", + "romaji": "shiburi" + }, + "渋れ": { + "w_type": "conjugated godan verb", + "romaji": "shibure" + }, + "渋ろ": { + "w_type": "godan verb stem", + "romaji": "shiburo" + }, + "渋った": { + "w_type": "conjugated godan verb", + "romaji": "shibutta" + }, + "渋って": { + "w_type": "conjugated godan verb", + "romaji": "shibutte" + }, + "引き越さ": { + "w_type": "godan verb stem", + "romaji": "hikkosa" + }, + "引き越し": { + "w_type": "godan verb stem", + "romaji": "hikkoshi" + }, + "引き越せ": { + "w_type": "conjugated godan verb", + "romaji": "hikkose" + }, + "引き越そ": { + "w_type": "godan verb stem", + "romaji": "hikkoso" + }, + "引き越した": { + "w_type": "conjugated godan verb", + "romaji": "hikkoshita" + }, + "引き越して": { + "w_type": "conjugated godan verb", + "romaji": "hikkoshite" + }, + "からめ取ら": { + "w_type": "godan verb stem", + "romaji": "karametora" + }, + "からめ取り": { + "w_type": "godan verb stem", + "romaji": "karametori" + }, + "からめ取れ": { + "w_type": "conjugated godan verb", + "romaji": "karametore" + }, + "からめ取ろ": { + "w_type": "godan verb stem", + "romaji": "karametoro" + }, + "からめ取った": { + "w_type": "conjugated godan verb", + "romaji": "karametotta" + }, + "からめ取って": { + "w_type": "conjugated godan verb", + "romaji": "karametotte" + }, + "打た": { + "w_type": "godan verb stem", + "romaji": "uta" + }, + "打ち": { + "w_type": "godan verb stem", + "romaji": "uchi" + }, + "打て": { + "w_type": "conjugated godan verb", + "romaji": "ute" + }, + "打と": { + "w_type": "godan verb stem", + "romaji": "uto" + }, + "打った": { + "w_type": "conjugated godan verb", + "romaji": "utta" + }, + "打って": { + "w_type": "conjugated godan verb", + "romaji": "utte" + }, + "醂さ": { + "w_type": "godan verb stem", + "romaji": "sawasa" + }, + "醂し": { + "w_type": "godan verb stem", + "romaji": "sawashi" + }, + "醂せ": { + "w_type": "conjugated godan verb", + "romaji": "sawase" + }, + "醂そ": { + "w_type": "godan verb stem", + "romaji": "sawaso" + }, + "醂した": { + "w_type": "conjugated godan verb", + "romaji": "sawashita" + }, + "醂して": { + "w_type": "conjugated godan verb", + "romaji": "sawashite" + }, + "受け合わ": { + "w_type": "godan verb stem", + "romaji": "ukeawa" + }, + "受け合い": { + "w_type": "godan verb stem", + "romaji": "ukeai" + }, + "受け合え": { + "w_type": "conjugated godan verb", + "romaji": "ukeae" + }, + "受け合お": { + "w_type": "godan verb stem", + "romaji": "ukeao" + }, + "受け合った": { + "w_type": "conjugated godan verb", + "romaji": "ukeatta" + }, + "受け合って": { + "w_type": "conjugated godan verb", + "romaji": "ukeatte" + }, + "誓わ": { + "w_type": "godan verb stem", + "romaji": "chikawa" + }, + "誓い": { + "w_type": "godan verb stem", + "romaji": "chikai" + }, + "誓え": { + "w_type": "conjugated godan verb", + "romaji": "chikae" + }, + "誓お": { + "w_type": "godan verb stem", + "romaji": "chikao" + }, + "誓った": { + "w_type": "conjugated godan verb", + "romaji": "chikatta" + }, + "誓って": { + "w_type": "conjugated godan verb", + "romaji": "chikatte" + }, + "さて置か": { + "w_type": "godan verb stem", + "romaji": "sateoka" + }, + "さて置き": { + "w_type": "godan verb stem", + "romaji": "sateoki" + }, + "さて置け": { + "w_type": "conjugated godan verb", + "romaji": "sateoke" + }, + "さて置こ": { + "w_type": "godan verb stem", + "romaji": "sateoko" + }, + "さて置いた": { + "w_type": "conjugated godan verb", + "romaji": "sateoita" + }, + "さて置いて": { + "w_type": "conjugated godan verb", + "romaji": "sateoite" + }, + "扨措か": { + "w_type": "godan verb stem", + "romaji": "sateoka" + }, + "扨措き": { + "w_type": "godan verb stem", + "romaji": "sateoki" + }, + "扨措け": { + "w_type": "conjugated godan verb", + "romaji": "sateoke" + }, + "扨措こ": { + "w_type": "godan verb stem", + "romaji": "sateoko" + }, + "扨措いた": { + "w_type": "conjugated godan verb", + "romaji": "sateoita" + }, + "扨措いて": { + "w_type": "conjugated godan verb", + "romaji": "sateoite" + }, + "話し出さ": { + "w_type": "godan verb stem", + "romaji": "hanashidasa" + }, + "話し出し": { + "w_type": "godan verb stem", + "romaji": "hanashidashi" + }, + "話し出せ": { + "w_type": "conjugated godan verb", + "romaji": "hanashidase" + }, + "話し出そ": { + "w_type": "godan verb stem", + "romaji": "hanashidaso" + }, + "話し出した": { + "w_type": "conjugated godan verb", + "romaji": "hanashidashita" + }, + "話し出して": { + "w_type": "conjugated godan verb", + "romaji": "hanashidashite" + }, + "吹雪か": { + "w_type": "godan verb stem", + "romaji": "fubuka" + }, + "吹雪き": { + "w_type": "godan verb stem", + "romaji": "fubuki" + }, + "吹雪け": { + "w_type": "conjugated godan verb", + "romaji": "fubuke" + }, + "吹雪こ": { + "w_type": "godan verb stem", + "romaji": "fubuko" + }, + "吹雪いた": { + "w_type": "conjugated godan verb", + "romaji": "fubuita" + }, + "吹雪いて": { + "w_type": "conjugated godan verb", + "romaji": "fubuite" + }, + "照り上がら": { + "w_type": "godan verb stem", + "romaji": "teriagara" + }, + "照り上がり": { + "w_type": "godan verb stem", + "romaji": "teriagari" + }, + "照り上がれ": { + "w_type": "conjugated godan verb", + "romaji": "teriagare" + }, + "照り上がろ": { + "w_type": "godan verb stem", + "romaji": "teriagaro" + }, + "照り上がった": { + "w_type": "conjugated godan verb", + "romaji": "teriagatta" + }, + "照り上がって": { + "w_type": "conjugated godan verb", + "romaji": "teriagatte" + }, + "仕込ま": { + "w_type": "godan verb stem", + "romaji": "shikoma" + }, + "仕込み": { + "w_type": "godan verb stem", + "romaji": "shikomi" + }, + "仕込め": { + "w_type": "conjugated godan verb", + "romaji": "shikome" + }, + "仕込も": { + "w_type": "godan verb stem", + "romaji": "shikomo" + }, + "仕込んだ": { + "w_type": "conjugated godan verb", + "romaji": "shikonda" + }, + "仕込んで": { + "w_type": "conjugated godan verb", + "romaji": "shikonde" + }, + "立合わ": { + "w_type": "godan verb stem", + "romaji": "tachiawa" + }, + "立合い": { + "w_type": "godan verb stem", + "romaji": "tachiai" + }, + "立合え": { + "w_type": "conjugated godan verb", + "romaji": "tachiae" + }, + "立合お": { + "w_type": "godan verb stem", + "romaji": "tachiao" + }, + "立合った": { + "w_type": "conjugated godan verb", + "romaji": "tachiatta" + }, + "立合って": { + "w_type": "conjugated godan verb", + "romaji": "tachiatte" + }, + "好き好ま": { + "w_type": "godan verb stem", + "romaji": "sukikonoma" + }, + "好き好み": { + "w_type": "godan verb stem", + "romaji": "sukikonomi" + }, + "好き好め": { + "w_type": "conjugated godan verb", + "romaji": "sukikonome" + }, + "好き好も": { + "w_type": "godan verb stem", + "romaji": "sukikonomo" + }, + "好き好んだ": { + "w_type": "conjugated godan verb", + "romaji": "sukikononda" + }, + "好き好んで": { + "w_type": "conjugated godan verb", + "romaji": "sukikononde" + }, + "搔込ま": { + "w_type": "godan verb stem", + "romaji": "kakkoma" + }, + "搔込み": { + "w_type": "godan verb stem", + "romaji": "kakkomi" + }, + "搔込め": { + "w_type": "conjugated godan verb", + "romaji": "kakkome" + }, + "搔込も": { + "w_type": "godan verb stem", + "romaji": "kakkomo" + }, + "搔込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kakkonda" + }, + "搔込んで": { + "w_type": "conjugated godan verb", + "romaji": "kakkonde" + }, + "刮げ取ら": { + "w_type": "godan verb stem", + "romaji": "kosogetora" + }, + "刮げ取り": { + "w_type": "godan verb stem", + "romaji": "kosogetori" + }, + "刮げ取れ": { + "w_type": "conjugated godan verb", + "romaji": "kosogetore" + }, + "刮げ取ろ": { + "w_type": "godan verb stem", + "romaji": "kosogetoro" + }, + "刮げ取った": { + "w_type": "conjugated godan verb", + "romaji": "kosogetotta" + }, + "刮げ取って": { + "w_type": "conjugated godan verb", + "romaji": "kosogetotte" + }, + "貼り出さ": { + "w_type": "godan verb stem", + "romaji": "haridasa" + }, + "貼り出し": { + "w_type": "godan verb stem", + "romaji": "haridashi" + }, + "貼り出せ": { + "w_type": "conjugated godan verb", + "romaji": "haridase" + }, + "貼り出そ": { + "w_type": "godan verb stem", + "romaji": "haridaso" + }, + "貼り出した": { + "w_type": "conjugated godan verb", + "romaji": "haridashita" + }, + "貼り出して": { + "w_type": "conjugated godan verb", + "romaji": "haridashite" + }, + "突っ突か": { + "w_type": "godan verb stem", + "romaji": "tsuttsuka" + }, + "突っ突き": { + "w_type": "godan verb stem", + "romaji": "tsuttsuki" + }, + "突っ突け": { + "w_type": "conjugated godan verb", + "romaji": "tsuttsuke" + }, + "突っ突こ": { + "w_type": "godan verb stem", + "romaji": "tsuttsuko" + }, + "突っ突いた": { + "w_type": "conjugated godan verb", + "romaji": "tsuttsuita" + }, + "突っ突いて": { + "w_type": "conjugated godan verb", + "romaji": "tsuttsuite" + }, + "行き当ら": { + "w_type": "godan verb stem", + "romaji": "yukiatara" + }, + "行き当り": { + "w_type": "godan verb stem", + "romaji": "yukiatari" + }, + "行き当れ": { + "w_type": "conjugated godan verb", + "romaji": "yukiatare" + }, + "行き当ろ": { + "w_type": "godan verb stem", + "romaji": "yukiataro" + }, + "行き当った": { + "w_type": "conjugated godan verb", + "romaji": "yukiatatta" + }, + "行き当って": { + "w_type": "conjugated godan verb", + "romaji": "yukiatatte" + }, + "喰らいつか": { + "w_type": "godan verb stem", + "romaji": "kuraitsuka" + }, + "喰らいつき": { + "w_type": "godan verb stem", + "romaji": "kuraitsuki" + }, + "喰らいつけ": { + "w_type": "conjugated godan verb", + "romaji": "kuraitsuke" + }, + "喰らいつこ": { + "w_type": "godan verb stem", + "romaji": "kuraitsuko" + }, + "喰らいついた": { + "w_type": "conjugated godan verb", + "romaji": "kuraitsuita" + }, + "喰らいついて": { + "w_type": "conjugated godan verb", + "romaji": "kuraitsuite" + }, + "覗きこま": { + "w_type": "godan verb stem", + "romaji": "nozokikoma" + }, + "覗きこみ": { + "w_type": "godan verb stem", + "romaji": "nozokikomi" + }, + "覗きこめ": { + "w_type": "conjugated godan verb", + "romaji": "nozokikome" + }, + "覗きこも": { + "w_type": "godan verb stem", + "romaji": "nozokikomo" + }, + "覗きこんだ": { + "w_type": "conjugated godan verb", + "romaji": "nozokikonda" + }, + "覗きこんで": { + "w_type": "conjugated godan verb", + "romaji": "nozokikonde" + }, + "切りまくら": { + "w_type": "godan verb stem", + "romaji": "kirimakura" + }, + "切りまくり": { + "w_type": "godan verb stem", + "romaji": "kirimakuri" + }, + "切りまくれ": { + "w_type": "conjugated godan verb", + "romaji": "kirimakure" + }, + "切りまくろ": { + "w_type": "godan verb stem", + "romaji": "kirimakuro" + }, + "切りまくった": { + "w_type": "conjugated godan verb", + "romaji": "kirimakutta" + }, + "切りまくって": { + "w_type": "conjugated godan verb", + "romaji": "kirimakutte" + }, + "打ち克た": { + "w_type": "godan verb stem", + "romaji": "uchikata" + }, + "打ち克ち": { + "w_type": "godan verb stem", + "romaji": "uchikachi" + }, + "打ち克て": { + "w_type": "conjugated godan verb", + "romaji": "uchikate" + }, + "打ち克と": { + "w_type": "godan verb stem", + "romaji": "uchikato" + }, + "打ち克った": { + "w_type": "conjugated godan verb", + "romaji": "uchikatta" + }, + "打ち克って": { + "w_type": "conjugated godan verb", + "romaji": "uchikatte" + }, + "塗り潰さ": { + "w_type": "godan verb stem", + "romaji": "nuritsubusa" + }, + "塗り潰し": { + "w_type": "godan verb stem", + "romaji": "nuritsubushi" + }, + "塗り潰せ": { + "w_type": "conjugated godan verb", + "romaji": "nuritsubuse" + }, + "塗り潰そ": { + "w_type": "godan verb stem", + "romaji": "nuritsubuso" + }, + "塗り潰した": { + "w_type": "conjugated godan verb", + "romaji": "nuritsubushita" + }, + "塗り潰して": { + "w_type": "conjugated godan verb", + "romaji": "nuritsubushite" + }, + "目付から": { + "w_type": "godan verb stem", + "romaji": "mekkara" + }, + "目付かり": { + "w_type": "godan verb stem", + "romaji": "mekkari" + }, + "目付かれ": { + "w_type": "conjugated godan verb", + "romaji": "mekkare" + }, + "目付かろ": { + "w_type": "godan verb stem", + "romaji": "mekkaro" + }, + "目付かった": { + "w_type": "conjugated godan verb", + "romaji": "mekkatta" + }, + "目付かって": { + "w_type": "conjugated godan verb", + "romaji": "mekkatte" + }, + "飛び乗ら": { + "w_type": "godan verb stem", + "romaji": "tobinora" + }, + "飛び乗り": { + "w_type": "godan verb stem", + "romaji": "tobinori" + }, + "飛び乗れ": { + "w_type": "conjugated godan verb", + "romaji": "tobinore" + }, + "飛び乗ろ": { + "w_type": "godan verb stem", + "romaji": "tobinoro" + }, + "飛び乗った": { + "w_type": "conjugated godan verb", + "romaji": "tobinotta" + }, + "飛び乗って": { + "w_type": "conjugated godan verb", + "romaji": "tobinotte" + }, + "垂れ流さ": { + "w_type": "godan verb stem", + "romaji": "tarenagasa" + }, + "垂れ流し": { + "w_type": "godan verb stem", + "romaji": "tarenagashi" + }, + "垂れ流せ": { + "w_type": "conjugated godan verb", + "romaji": "tarenagase" + }, + "垂れ流そ": { + "w_type": "godan verb stem", + "romaji": "tarenagaso" + }, + "垂れ流した": { + "w_type": "conjugated godan verb", + "romaji": "tarenagashita" + }, + "垂れ流して": { + "w_type": "conjugated godan verb", + "romaji": "tarenagashite" + }, + "偉ぶら": { + "w_type": "godan verb stem", + "romaji": "erabura" + }, + "偉ぶり": { + "w_type": "godan verb stem", + "romaji": "eraburi" + }, + "偉ぶれ": { + "w_type": "conjugated godan verb", + "romaji": "erabure" + }, + "偉ぶろ": { + "w_type": "godan verb stem", + "romaji": "eraburo" + }, + "偉ぶった": { + "w_type": "conjugated godan verb", + "romaji": "erabutta" + }, + "偉ぶって": { + "w_type": "conjugated godan verb", + "romaji": "erabutte" + }, + "遣って行か": { + "w_type": "godan verb stem", + "romaji": "yatteika" + }, + "遣って行き": { + "w_type": "godan verb stem", + "romaji": "yatteiki" + }, + "遣って行け": { + "w_type": "conjugated godan verb", + "romaji": "yatteike" + }, + "遣って行こ": { + "w_type": "godan verb stem", + "romaji": "yatteiko" + }, + "遣って行いた": { + "w_type": "conjugated godan verb", + "romaji": "yatteiita" + }, + "遣って行いて": { + "w_type": "conjugated godan verb", + "romaji": "yatteiite" + }, + "茹であがら": { + "w_type": "godan verb stem", + "romaji": "yudeagara" + }, + "茹であがり": { + "w_type": "godan verb stem", + "romaji": "yudeagari" + }, + "茹であがれ": { + "w_type": "conjugated godan verb", + "romaji": "yudeagare" + }, + "茹であがろ": { + "w_type": "godan verb stem", + "romaji": "yudeagaro" + }, + "茹であがった": { + "w_type": "conjugated godan verb", + "romaji": "yudeagatta" + }, + "茹であがって": { + "w_type": "conjugated godan verb", + "romaji": "yudeagatte" + }, + "痒がら": { + "w_type": "godan verb stem", + "romaji": "kayugara" + }, + "痒がり": { + "w_type": "godan verb stem", + "romaji": "kayugari" + }, + "痒がれ": { + "w_type": "conjugated godan verb", + "romaji": "kayugare" + }, + "痒がろ": { + "w_type": "godan verb stem", + "romaji": "kayugaro" + }, + "痒がった": { + "w_type": "conjugated godan verb", + "romaji": "kayugatta" + }, + "痒がって": { + "w_type": "conjugated godan verb", + "romaji": "kayugatte" + }, + "滑りこま": { + "w_type": "godan verb stem", + "romaji": "suberikoma" + }, + "滑りこみ": { + "w_type": "godan verb stem", + "romaji": "suberikomi" + }, + "滑りこめ": { + "w_type": "conjugated godan verb", + "romaji": "suberikome" + }, + "滑りこも": { + "w_type": "godan verb stem", + "romaji": "suberikomo" + }, + "滑りこんだ": { + "w_type": "conjugated godan verb", + "romaji": "suberikonda" + }, + "滑りこんで": { + "w_type": "conjugated godan verb", + "romaji": "suberikonde" + }, + "黄ばま": { + "w_type": "godan verb stem", + "romaji": "kibama" + }, + "黄ばみ": { + "w_type": "godan verb stem", + "romaji": "kibami" + }, + "黄ばめ": { + "w_type": "conjugated godan verb", + "romaji": "kibame" + }, + "黄ばも": { + "w_type": "godan verb stem", + "romaji": "kibamo" + }, + "黄ばんだ": { + "w_type": "conjugated godan verb", + "romaji": "kibanda" + }, + "黄ばんで": { + "w_type": "conjugated godan verb", + "romaji": "kibande" + }, + "鶏肌になら": { + "w_type": "godan verb stem", + "romaji": "torihadaninara" + }, + "鶏肌になり": { + "w_type": "godan verb stem", + "romaji": "torihadaninari" + }, + "鶏肌になれ": { + "w_type": "conjugated godan verb", + "romaji": "torihadaninare" + }, + "鶏肌になろ": { + "w_type": "godan verb stem", + "romaji": "torihadaninaro" + }, + "鶏肌になった": { + "w_type": "conjugated godan verb", + "romaji": "torihadaninatta" + }, + "鶏肌になって": { + "w_type": "conjugated godan verb", + "romaji": "torihadaninatte" + }, + "ど突か": { + "w_type": "godan verb stem", + "romaji": "dotsuka" + }, + "ど突き": { + "w_type": "godan verb stem", + "romaji": "dotsuki" + }, + "ど突け": { + "w_type": "conjugated godan verb", + "romaji": "dotsuke" + }, + "ど突こ": { + "w_type": "godan verb stem", + "romaji": "dotsuko" + }, + "ど突いた": { + "w_type": "conjugated godan verb", + "romaji": "dotsuita" + }, + "ど突いて": { + "w_type": "conjugated godan verb", + "romaji": "dotsuite" + }, + "唸ら": { + "w_type": "godan verb stem", + "romaji": "unara" + }, + "唸り": { + "w_type": "godan verb stem", + "romaji": "unari" + }, + "唸れ": { + "w_type": "conjugated godan verb", + "romaji": "unare" + }, + "唸ろ": { + "w_type": "godan verb stem", + "romaji": "unaro" + }, + "唸った": { + "w_type": "conjugated godan verb", + "romaji": "unatta" + }, + "唸って": { + "w_type": "conjugated godan verb", + "romaji": "unatte" + }, + "染付か": { + "w_type": "godan verb stem", + "romaji": "shimitsuka" + }, + "染付き": { + "w_type": "godan verb stem", + "romaji": "shimitsuki" + }, + "染付け": { + "w_type": "conjugated godan verb", + "romaji": "shimitsuke" + }, + "染付こ": { + "w_type": "godan verb stem", + "romaji": "shimitsuko" + }, + "染付いた": { + "w_type": "conjugated godan verb", + "romaji": "shimitsuita" + }, + "染付いて": { + "w_type": "conjugated godan verb", + "romaji": "shimitsuite" + }, + "咳込ま": { + "w_type": "godan verb stem", + "romaji": "sekikoma" + }, + "咳込み": { + "w_type": "godan verb stem", + "romaji": "sekikomi" + }, + "咳込め": { + "w_type": "conjugated godan verb", + "romaji": "sekikome" + }, + "咳込も": { + "w_type": "godan verb stem", + "romaji": "sekikomo" + }, + "咳込んだ": { + "w_type": "conjugated godan verb", + "romaji": "sekikonda" + }, + "咳込んで": { + "w_type": "conjugated godan verb", + "romaji": "sekikonde" + }, + "磨が": { + "w_type": "godan verb stem", + "romaji": "toga" + }, + "磨ぎ": { + "w_type": "godan verb stem", + "romaji": "togi" + }, + "磨げ": { + "w_type": "conjugated godan verb", + "romaji": "toge" + }, + "磨ご": { + "w_type": "godan verb stem", + "romaji": "togo" + }, + "磨いだ": { + "w_type": "conjugated godan verb", + "romaji": "toida" + }, + "磨いで": { + "w_type": "conjugated godan verb", + "romaji": "toide" + }, + "降り止ま": { + "w_type": "godan verb stem", + "romaji": "furiyama" + }, + "降り止み": { + "w_type": "godan verb stem", + "romaji": "furiyami" + }, + "降り止め": { + "w_type": "conjugated godan verb", + "romaji": "furiyame" + }, + "降り止も": { + "w_type": "godan verb stem", + "romaji": "furiyamo" + }, + "降り止んだ": { + "w_type": "conjugated godan verb", + "romaji": "furiyanda" + }, + "降り止んで": { + "w_type": "conjugated godan verb", + "romaji": "furiyande" + }, + "受けつが": { + "w_type": "godan verb stem", + "romaji": "uketsuga" + }, + "受けつぎ": { + "w_type": "godan verb stem", + "romaji": "uketsugi" + }, + "受けつげ": { + "w_type": "conjugated godan verb", + "romaji": "uketsuge" + }, + "受けつご": { + "w_type": "godan verb stem", + "romaji": "uketsugo" + }, + "受けついだ": { + "w_type": "conjugated godan verb", + "romaji": "uketsuida" + }, + "受けついで": { + "w_type": "conjugated godan verb", + "romaji": "uketsuide" + }, + "舞散ら": { + "w_type": "godan verb stem", + "romaji": "maichira" + }, + "舞散り": { + "w_type": "godan verb stem", + "romaji": "maichiri" + }, + "舞散れ": { + "w_type": "conjugated godan verb", + "romaji": "maichire" + }, + "舞散ろ": { + "w_type": "godan verb stem", + "romaji": "maichiro" + }, + "舞散った": { + "w_type": "conjugated godan verb", + "romaji": "maichitta" + }, + "舞散って": { + "w_type": "conjugated godan verb", + "romaji": "maichitte" + }, + "推測ら": { + "w_type": "godan verb stem", + "romaji": "oshihakara" + }, + "推測り": { + "w_type": "godan verb stem", + "romaji": "oshihakari" + }, + "推測れ": { + "w_type": "conjugated godan verb", + "romaji": "oshihakare" + }, + "推測ろ": { + "w_type": "godan verb stem", + "romaji": "oshihakaro" + }, + "推測った": { + "w_type": "conjugated godan verb", + "romaji": "oshihakatta" + }, + "推測って": { + "w_type": "conjugated godan verb", + "romaji": "oshihakatte" + }, + "裁ち出さ": { + "w_type": "godan verb stem", + "romaji": "tachidasa" + }, + "裁ち出し": { + "w_type": "godan verb stem", + "romaji": "tachidashi" + }, + "裁ち出せ": { + "w_type": "conjugated godan verb", + "romaji": "tachidase" + }, + "裁ち出そ": { + "w_type": "godan verb stem", + "romaji": "tachidaso" + }, + "裁ち出した": { + "w_type": "conjugated godan verb", + "romaji": "tachidashita" + }, + "裁ち出して": { + "w_type": "conjugated godan verb", + "romaji": "tachidashite" + }, + "曳か": { + "w_type": "godan verb stem", + "romaji": "hika" + }, + "曳き": { + "w_type": "godan verb stem", + "romaji": "hiki" + }, + "曳け": { + "w_type": "conjugated godan verb", + "romaji": "hike" + }, + "曳こ": { + "w_type": "godan verb stem", + "romaji": "hiko" + }, + "曳いた": { + "w_type": "conjugated godan verb", + "romaji": "hiita" + }, + "曳いて": { + "w_type": "conjugated godan verb", + "romaji": "hiite" + }, + "すれ合わ": { + "w_type": "godan verb stem", + "romaji": "sureawa" + }, + "すれ合い": { + "w_type": "godan verb stem", + "romaji": "sureai" + }, + "すれ合え": { + "w_type": "conjugated godan verb", + "romaji": "sureae" + }, + "すれ合お": { + "w_type": "godan verb stem", + "romaji": "sureao" + }, + "すれ合った": { + "w_type": "conjugated godan verb", + "romaji": "sureatta" + }, + "すれ合って": { + "w_type": "conjugated godan verb", + "romaji": "sureatte" + }, + "釣り込ま": { + "w_type": "godan verb stem", + "romaji": "tsurikoma" + }, + "釣り込み": { + "w_type": "godan verb stem", + "romaji": "tsurikomi" + }, + "釣り込め": { + "w_type": "conjugated godan verb", + "romaji": "tsurikome" + }, + "釣り込も": { + "w_type": "godan verb stem", + "romaji": "tsurikomo" + }, + "釣り込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tsurikonda" + }, + "釣り込んで": { + "w_type": "conjugated godan verb", + "romaji": "tsurikonde" + }, + "躍り上がら": { + "w_type": "godan verb stem", + "romaji": "odoriagara" + }, + "躍り上がり": { + "w_type": "godan verb stem", + "romaji": "odoriagari" + }, + "躍り上がれ": { + "w_type": "conjugated godan verb", + "romaji": "odoriagare" + }, + "躍り上がろ": { + "w_type": "godan verb stem", + "romaji": "odoriagaro" + }, + "躍り上がった": { + "w_type": "conjugated godan verb", + "romaji": "odoriagatta" + }, + "躍り上がって": { + "w_type": "conjugated godan verb", + "romaji": "odoriagatte" + }, + "浮付か": { + "w_type": "godan verb stem", + "romaji": "uwatsuka" + }, + "浮付き": { + "w_type": "godan verb stem", + "romaji": "uwatsuki" + }, + "浮付け": { + "w_type": "conjugated godan verb", + "romaji": "uwatsuke" + }, + "浮付こ": { + "w_type": "godan verb stem", + "romaji": "uwatsuko" + }, + "浮付いた": { + "w_type": "conjugated godan verb", + "romaji": "uwatsuita" + }, + "浮付いて": { + "w_type": "conjugated godan verb", + "romaji": "uwatsuite" + }, + "劈か": { + "w_type": "godan verb stem", + "romaji": "tsunzaka" + }, + "劈き": { + "w_type": "godan verb stem", + "romaji": "tsunzaki" + }, + "劈け": { + "w_type": "conjugated godan verb", + "romaji": "tsunzake" + }, + "劈こ": { + "w_type": "godan verb stem", + "romaji": "tsunzako" + }, + "劈いた": { + "w_type": "conjugated godan verb", + "romaji": "tsunzaita" + }, + "劈いて": { + "w_type": "conjugated godan verb", + "romaji": "tsunzaite" + }, + "考え込ま": { + "w_type": "godan verb stem", + "romaji": "kangaekoma" + }, + "考え込み": { + "w_type": "godan verb stem", + "romaji": "kangaekomi" + }, + "考え込め": { + "w_type": "conjugated godan verb", + "romaji": "kangaekome" + }, + "考え込も": { + "w_type": "godan verb stem", + "romaji": "kangaekomo" + }, + "考え込んだ": { + "w_type": "conjugated godan verb", + "romaji": "kangaekonda" + }, + "考え込んで": { + "w_type": "conjugated godan verb", + "romaji": "kangaekonde" + }, + "立ち去ら": { + "w_type": "godan verb stem", + "romaji": "tachisara" + }, + "立ち去り": { + "w_type": "godan verb stem", + "romaji": "tachisari" + }, + "立ち去れ": { + "w_type": "conjugated godan verb", + "romaji": "tachisare" + }, + "立ち去ろ": { + "w_type": "godan verb stem", + "romaji": "tachisaro" + }, + "立ち去った": { + "w_type": "conjugated godan verb", + "romaji": "tachisatta" + }, + "立ち去って": { + "w_type": "conjugated godan verb", + "romaji": "tachisatte" + }, + "売渡さ": { + "w_type": "godan verb stem", + "romaji": "uriwatasa" + }, + "売渡し": { + "w_type": "godan verb stem", + "romaji": "uriwatashi" + }, + "売渡せ": { + "w_type": "conjugated godan verb", + "romaji": "uriwatase" + }, + "売渡そ": { + "w_type": "godan verb stem", + "romaji": "uriwataso" + }, + "売渡した": { + "w_type": "conjugated godan verb", + "romaji": "uriwatashita" + }, + "売渡して": { + "w_type": "conjugated godan verb", + "romaji": "uriwatashite" + }, + "白ま": { + "w_type": "godan verb stem", + "romaji": "shirama" + }, + "白み": { + "w_type": "godan verb stem", + "romaji": "shirami" + }, + "白め": { + "w_type": "conjugated godan verb", + "romaji": "shirame" + }, + "白も": { + "w_type": "godan verb stem", + "romaji": "shiramo" + }, + "白んだ": { + "w_type": "conjugated godan verb", + "romaji": "shiranda" + }, + "白んで": { + "w_type": "conjugated godan verb", + "romaji": "shirande" + }, + "舞い立た": { + "w_type": "godan verb stem", + "romaji": "maitata" + }, + "舞い立ち": { + "w_type": "godan verb stem", + "romaji": "maitachi" + }, + "舞い立て": { + "w_type": "conjugated godan verb", + "romaji": "maitate" + }, + "舞い立と": { + "w_type": "godan verb stem", + "romaji": "maitato" + }, + "舞い立った": { + "w_type": "conjugated godan verb", + "romaji": "maitatta" + }, + "舞い立って": { + "w_type": "conjugated godan verb", + "romaji": "maitatte" + }, + "骨肉相食ま": { + "w_type": "godan verb stem", + "romaji": "kotsunikuaihama" + }, + "骨肉相食み": { + "w_type": "godan verb stem", + "romaji": "kotsunikuaihami" + }, + "骨肉相食め": { + "w_type": "conjugated godan verb", + "romaji": "kotsunikuaihame" + }, + "骨肉相食も": { + "w_type": "godan verb stem", + "romaji": "kotsunikuaihamo" + }, + "骨肉相食んだ": { + "w_type": "conjugated godan verb", + "romaji": "kotsunikuaihanda" + }, + "骨肉相食んで": { + "w_type": "conjugated godan verb", + "romaji": "kotsunikuaihande" + }, + "塗込ま": { + "w_type": "godan verb stem", + "romaji": "nurikoma" + }, + "塗込み": { + "w_type": "godan verb stem", + "romaji": "nurikomi" + }, + "塗込め": { + "w_type": "conjugated godan verb", + "romaji": "nurikome" + }, + "塗込も": { + "w_type": "godan verb stem", + "romaji": "nurikomo" + }, + "塗込んだ": { + "w_type": "conjugated godan verb", + "romaji": "nurikonda" + }, + "塗込んで": { + "w_type": "conjugated godan verb", + "romaji": "nurikonde" + }, + "持扱わ": { + "w_type": "godan verb stem", + "romaji": "mochiatsukawa" + }, + "持扱い": { + "w_type": "godan verb stem", + "romaji": "mochiatsukai" + }, + "持扱え": { + "w_type": "conjugated godan verb", + "romaji": "mochiatsukae" + }, + "持扱お": { + "w_type": "godan verb stem", + "romaji": "mochiatsukao" + }, + "持扱った": { + "w_type": "conjugated godan verb", + "romaji": "mochiatsukatta" + }, + "持扱って": { + "w_type": "conjugated godan verb", + "romaji": "mochiatsukatte" + }, + "吹込ま": { + "w_type": "godan verb stem", + "romaji": "fukikoma" + }, + "吹込み": { + "w_type": "godan verb stem", + "romaji": "fukikomi" + }, + "吹込め": { + "w_type": "conjugated godan verb", + "romaji": "fukikome" + }, + "吹込も": { + "w_type": "godan verb stem", + "romaji": "fukikomo" + }, + "吹込んだ": { + "w_type": "conjugated godan verb", + "romaji": "fukikonda" + }, + "吹込んで": { + "w_type": "conjugated godan verb", + "romaji": "fukikonde" + }, + "間に合わ": { + "w_type": "godan verb stem", + "romaji": "maniawa" + }, + "間に合い": { + "w_type": "godan verb stem", + "romaji": "maniai" + }, + "間に合え": { + "w_type": "conjugated godan verb", + "romaji": "maniae" + }, + "間に合お": { + "w_type": "godan verb stem", + "romaji": "maniao" + }, + "間に合った": { + "w_type": "conjugated godan verb", + "romaji": "maniatta" + }, + "間に合って": { + "w_type": "conjugated godan verb", + "romaji": "maniatte" + }, + "一本取ら": { + "w_type": "godan verb stem", + "romaji": "ippontora" + }, + "一本取り": { + "w_type": "godan verb stem", + "romaji": "ippontori" + }, + "一本取れ": { + "w_type": "conjugated godan verb", + "romaji": "ippontore" + }, + "一本取ろ": { + "w_type": "godan verb stem", + "romaji": "ippontoro" + }, + "一本取った": { + "w_type": "conjugated godan verb", + "romaji": "ippontotta" + }, + "一本取って": { + "w_type": "conjugated godan verb", + "romaji": "ippontotte" + }, + "引きあわ": { + "w_type": "godan verb stem", + "romaji": "hikiawa" + }, + "引きあい": { + "w_type": "godan verb stem", + "romaji": "hikiai" + }, + "引きあえ": { + "w_type": "conjugated godan verb", + "romaji": "hikiae" + }, + "引きあお": { + "w_type": "godan verb stem", + "romaji": "hikiao" + }, + "引きあった": { + "w_type": "conjugated godan verb", + "romaji": "hikiatta" + }, + "引きあって": { + "w_type": "conjugated godan verb", + "romaji": "hikiatte" + }, + "拱ねか": { + "w_type": "godan verb stem", + "romaji": "komanuka" + }, + "拱ねき": { + "w_type": "godan verb stem", + "romaji": "komanuki" + }, + "拱ねけ": { + "w_type": "conjugated godan verb", + "romaji": "komanuke" + }, + "拱ねこ": { + "w_type": "godan verb stem", + "romaji": "komanuko" + }, + "拱ねいた": { + "w_type": "conjugated godan verb", + "romaji": "komanuita" + }, + "拱ねいて": { + "w_type": "conjugated godan verb", + "romaji": "komanuite" + }, + "思い残さ": { + "w_type": "godan verb stem", + "romaji": "omoinokosa" + }, + "思い残し": { + "w_type": "godan verb stem", + "romaji": "omoinokoshi" + }, + "思い残せ": { + "w_type": "conjugated godan verb", + "romaji": "omoinokose" + }, + "思い残そ": { + "w_type": "godan verb stem", + "romaji": "omoinokoso" + }, + "思い残した": { + "w_type": "conjugated godan verb", + "romaji": "omoinokoshita" + }, + "思い残して": { + "w_type": "conjugated godan verb", + "romaji": "omoinokoshite" + }, + "命じ終わら": { + "w_type": "godan verb stem", + "romaji": "meijiowara" + }, + "命じ終わり": { + "w_type": "godan verb stem", + "romaji": "meijiowari" + }, + "命じ終われ": { + "w_type": "conjugated godan verb", + "romaji": "meijioware" + }, + "命じ終わろ": { + "w_type": "godan verb stem", + "romaji": "meijiowaro" + }, + "命じ終わった": { + "w_type": "conjugated godan verb", + "romaji": "meijiowatta" + }, + "命じ終わって": { + "w_type": "conjugated godan verb", + "romaji": "meijiowatte" + }, + "立ち退か": { + "w_type": "godan verb stem", + "romaji": "tachinoka" + }, + "立ち退き": { + "w_type": "godan verb stem", + "romaji": "tachinoki" + }, + "立ち退け": { + "w_type": "conjugated godan verb", + "romaji": "tachinoke" + }, + "立ち退こ": { + "w_type": "godan verb stem", + "romaji": "tachinoko" + }, + "立ち退いた": { + "w_type": "conjugated godan verb", + "romaji": "tachinoita" + }, + "立ち退いて": { + "w_type": "conjugated godan verb", + "romaji": "tachinoite" + }, + "押黙ら": { + "w_type": "godan verb stem", + "romaji": "oshidamara" + }, + "押黙り": { + "w_type": "godan verb stem", + "romaji": "oshidamari" + }, + "押黙れ": { + "w_type": "conjugated godan verb", + "romaji": "oshidamare" + }, + "押黙ろ": { + "w_type": "godan verb stem", + "romaji": "oshidamaro" + }, + "押黙った": { + "w_type": "conjugated godan verb", + "romaji": "oshidamatta" + }, + "押黙って": { + "w_type": "conjugated godan verb", + "romaji": "oshidamatte" + }, + "行き損なわ": { + "w_type": "godan verb stem", + "romaji": "ikisokonawa" + }, + "行き損ない": { + "w_type": "godan verb stem", + "romaji": "ikisokonai" + }, + "行き損なえ": { + "w_type": "conjugated godan verb", + "romaji": "ikisokonae" + }, + "行き損なお": { + "w_type": "godan verb stem", + "romaji": "ikisokonao" + }, + "行き損なった": { + "w_type": "conjugated godan verb", + "romaji": "ikisokonatta" + }, + "行き損なって": { + "w_type": "conjugated godan verb", + "romaji": "ikisokonatte" + }, + "降りそそが": { + "w_type": "godan verb stem", + "romaji": "furisosoga" + }, + "降りそそぎ": { + "w_type": "godan verb stem", + "romaji": "furisosogi" + }, + "降りそそげ": { + "w_type": "conjugated godan verb", + "romaji": "furisosoge" + }, + "降りそそご": { + "w_type": "godan verb stem", + "romaji": "furisosogo" + }, + "降りそそいだ": { + "w_type": "conjugated godan verb", + "romaji": "furisosoida" + }, + "降りそそいで": { + "w_type": "conjugated godan verb", + "romaji": "furisosoide" + }, + "盗ま": { + "w_type": "godan verb stem", + "romaji": "nusuma" + }, + "盗み": { + "w_type": "godan verb stem", + "romaji": "nusumi" + }, + "盗め": { + "w_type": "conjugated godan verb", + "romaji": "nusume" + }, + "盗も": { + "w_type": "godan verb stem", + "romaji": "nusumo" + }, + "盗んだ": { + "w_type": "conjugated godan verb", + "romaji": "nusunda" + }, + "盗んで": { + "w_type": "conjugated godan verb", + "romaji": "nusunde" + }, + "言い諭さ": { + "w_type": "godan verb stem", + "romaji": "iisatosa" + }, + "言い諭し": { + "w_type": "godan verb stem", + "romaji": "iisatoshi" + }, + "言い諭せ": { + "w_type": "conjugated godan verb", + "romaji": "iisatose" + }, + "言い諭そ": { + "w_type": "godan verb stem", + "romaji": "iisatoso" + }, + "言い諭した": { + "w_type": "conjugated godan verb", + "romaji": "iisatoshita" + }, + "言い諭して": { + "w_type": "conjugated godan verb", + "romaji": "iisatoshite" + }, + "消し飛ば": { + "w_type": "godan verb stem", + "romaji": "keshitoba" + }, + "消し飛び": { + "w_type": "godan verb stem", + "romaji": "keshitobi" + }, + "消し飛べ": { + "w_type": "conjugated godan verb", + "romaji": "keshitobe" + }, + "消し飛ぼ": { + "w_type": "godan verb stem", + "romaji": "keshitobo" + }, + "消し飛んだ": { + "w_type": "conjugated godan verb", + "romaji": "keshitonda" + }, + "消し飛んで": { + "w_type": "conjugated godan verb", + "romaji": "keshitonde" + }, + "摩り切ら": { + "w_type": "godan verb stem", + "romaji": "surikira" + }, + "摩り切り": { + "w_type": "godan verb stem", + "romaji": "surikiri" + }, + "摩り切れ": { + "w_type": "conjugated godan verb", + "romaji": "surikire" + }, + "摩り切ろ": { + "w_type": "godan verb stem", + "romaji": "surikiro" + }, + "摩り切った": { + "w_type": "conjugated godan verb", + "romaji": "surikitta" + }, + "摩り切って": { + "w_type": "conjugated godan verb", + "romaji": "surikitte" + }, + "移り行か": { + "w_type": "godan verb stem", + "romaji": "utsuriyuka" + }, + "移り行き": { + "w_type": "godan verb stem", + "romaji": "utsuriyuki" + }, + "移り行け": { + "w_type": "conjugated godan verb", + "romaji": "utsuriyuke" + }, + "移り行こ": { + "w_type": "godan verb stem", + "romaji": "utsuriyuko" + }, + "移り行いた": { + "w_type": "conjugated godan verb", + "romaji": "utsuriyuita" + }, + "移り行いて": { + "w_type": "conjugated godan verb", + "romaji": "utsuriyuite" + }, + "振り返さ": { + "w_type": "godan verb stem", + "romaji": "furikaesa" + }, + "振り返し": { + "w_type": "godan verb stem", + "romaji": "furikaeshi" + }, + "振り返せ": { + "w_type": "conjugated godan verb", + "romaji": "furikaese" + }, + "振り返そ": { + "w_type": "godan verb stem", + "romaji": "furikaeso" + }, + "振り返した": { + "w_type": "conjugated godan verb", + "romaji": "furikaeshita" + }, + "振り返して": { + "w_type": "conjugated godan verb", + "romaji": "furikaeshite" + }, + "取急が": { + "w_type": "godan verb stem", + "romaji": "toriisoga" + }, + "取急ぎ": { + "w_type": "godan verb stem", + "romaji": "toriisogi" + }, + "取急げ": { + "w_type": "conjugated godan verb", + "romaji": "toriisoge" + }, + "取急ご": { + "w_type": "godan verb stem", + "romaji": "toriisogo" + }, + "取急いだ": { + "w_type": "conjugated godan verb", + "romaji": "toriisoida" + }, + "取急いで": { + "w_type": "conjugated godan verb", + "romaji": "toriisoide" + }, + "話しあわ": { + "w_type": "godan verb stem", + "romaji": "hanashiawa" + }, + "話しあい": { + "w_type": "godan verb stem", + "romaji": "hanashiai" + }, + "話しあえ": { + "w_type": "conjugated godan verb", + "romaji": "hanashiae" + }, + "話しあお": { + "w_type": "godan verb stem", + "romaji": "hanashiao" + }, + "話しあった": { + "w_type": "conjugated godan verb", + "romaji": "hanashiatta" + }, + "話しあって": { + "w_type": "conjugated godan verb", + "romaji": "hanashiatte" + }, + "履ま": { + "w_type": "godan verb stem", + "romaji": "fuma" + }, + "履み": { + "w_type": "godan verb stem", + "romaji": "fumi" + }, + "履め": { + "w_type": "conjugated godan verb", + "romaji": "fume" + }, + "履も": { + "w_type": "godan verb stem", + "romaji": "fumo" + }, + "履んだ": { + "w_type": "conjugated godan verb", + "romaji": "funda" + }, + "履んで": { + "w_type": "conjugated godan verb", + "romaji": "funde" + }, + "押しつまら": { + "w_type": "godan verb stem", + "romaji": "oshitsumara" + }, + "押しつまり": { + "w_type": "godan verb stem", + "romaji": "oshitsumari" + }, + "押しつまれ": { + "w_type": "conjugated godan verb", + "romaji": "oshitsumare" + }, + "押しつまろ": { + "w_type": "godan verb stem", + "romaji": "oshitsumaro" + }, + "押しつまった": { + "w_type": "conjugated godan verb", + "romaji": "oshitsumatta" + }, + "押しつまって": { + "w_type": "conjugated godan verb", + "romaji": "oshitsumatte" + }, + "振り返ら": { + "w_type": "godan verb stem", + "romaji": "furikaera" + }, + "振り返り": { + "w_type": "godan verb stem", + "romaji": "furikaeri" + }, + "振り返れ": { + "w_type": "conjugated godan verb", + "romaji": "furikaere" + }, + "振り返ろ": { + "w_type": "godan verb stem", + "romaji": "furikaero" + }, + "振り返った": { + "w_type": "conjugated godan verb", + "romaji": "furikaetta" + }, + "振り返って": { + "w_type": "conjugated godan verb", + "romaji": "furikaette" + }, + "燃えあがら": { + "w_type": "godan verb stem", + "romaji": "moeagara" + }, + "燃えあがり": { + "w_type": "godan verb stem", + "romaji": "moeagari" + }, + "燃えあがれ": { + "w_type": "conjugated godan verb", + "romaji": "moeagare" + }, + "燃えあがろ": { + "w_type": "godan verb stem", + "romaji": "moeagaro" + }, + "燃えあがった": { + "w_type": "conjugated godan verb", + "romaji": "moeagatta" + }, + "燃えあがって": { + "w_type": "conjugated godan verb", + "romaji": "moeagatte" + }, + "切取ら": { + "w_type": "godan verb stem", + "romaji": "kiritora" + }, + "切取り": { + "w_type": "godan verb stem", + "romaji": "kiritori" + }, + "切取れ": { + "w_type": "conjugated godan verb", + "romaji": "kiritore" + }, + "切取ろ": { + "w_type": "godan verb stem", + "romaji": "kiritoro" + }, + "切取った": { + "w_type": "conjugated godan verb", + "romaji": "kiritotta" + }, + "切取って": { + "w_type": "conjugated godan verb", + "romaji": "kiritotte" + }, + "相分ら": { + "w_type": "godan verb stem", + "romaji": "aiwakara" + }, + "相分り": { + "w_type": "godan verb stem", + "romaji": "aiwakari" + }, + "相分れ": { + "w_type": "conjugated godan verb", + "romaji": "aiwakare" + }, + "相分ろ": { + "w_type": "godan verb stem", + "romaji": "aiwakaro" + }, + "相分った": { + "w_type": "conjugated godan verb", + "romaji": "aiwakatta" + }, + "相分って": { + "w_type": "conjugated godan verb", + "romaji": "aiwakatte" + }, + "舐めずら": { + "w_type": "godan verb stem", + "romaji": "namezura" + }, + "舐めずり": { + "w_type": "godan verb stem", + "romaji": "namezuri" + }, + "舐めずれ": { + "w_type": "conjugated godan verb", + "romaji": "namezure" + }, + "舐めずろ": { + "w_type": "godan verb stem", + "romaji": "namezuro" + }, + "舐めずった": { + "w_type": "conjugated godan verb", + "romaji": "namezutta" + }, + "舐めずって": { + "w_type": "conjugated godan verb", + "romaji": "namezutte" + }, + "相食ま": { + "w_type": "godan verb stem", + "romaji": "aihama" + }, + "相食み": { + "w_type": "godan verb stem", + "romaji": "aihami" + }, + "相食め": { + "w_type": "conjugated godan verb", + "romaji": "aihame" + }, + "相食も": { + "w_type": "godan verb stem", + "romaji": "aihamo" + }, + "相食んだ": { + "w_type": "conjugated godan verb", + "romaji": "aihanda" + }, + "相食んで": { + "w_type": "conjugated godan verb", + "romaji": "aihande" + }, + "為腐ら": { + "w_type": "godan verb stem", + "romaji": "shikusara" + }, + "為腐り": { + "w_type": "godan verb stem", + "romaji": "shikusari" + }, + "為腐れ": { + "w_type": "conjugated godan verb", + "romaji": "shikusare" + }, + "為腐ろ": { + "w_type": "godan verb stem", + "romaji": "shikusaro" + }, + "為腐った": { + "w_type": "conjugated godan verb", + "romaji": "shikusatta" + }, + "為腐って": { + "w_type": "conjugated godan verb", + "romaji": "shikusatte" + }, + "押倒さ": { + "w_type": "godan verb stem", + "romaji": "oshitaosa" + }, + "押倒し": { + "w_type": "godan verb stem", + "romaji": "oshitaoshi" + }, + "押倒せ": { + "w_type": "conjugated godan verb", + "romaji": "oshitaose" + }, + "押倒そ": { + "w_type": "godan verb stem", + "romaji": "oshitaoso" + }, + "押倒した": { + "w_type": "conjugated godan verb", + "romaji": "oshitaoshita" + }, + "押倒して": { + "w_type": "conjugated godan verb", + "romaji": "oshitaoshite" + }, + "惜しがら": { + "w_type": "godan verb stem", + "romaji": "oshigara" + }, + "惜しがり": { + "w_type": "godan verb stem", + "romaji": "oshigari" + }, + "惜しがれ": { + "w_type": "conjugated godan verb", + "romaji": "oshigare" + }, + "惜しがろ": { + "w_type": "godan verb stem", + "romaji": "oshigaro" + }, + "惜しがった": { + "w_type": "conjugated godan verb", + "romaji": "oshigatta" + }, + "惜しがって": { + "w_type": "conjugated godan verb", + "romaji": "oshigatte" + }, + "ねじ切ら": { + "w_type": "godan verb stem", + "romaji": "nejikira" + }, + "ねじ切り": { + "w_type": "godan verb stem", + "romaji": "nejikiri" + }, + "ねじ切れ": { + "w_type": "conjugated godan verb", + "romaji": "nejikire" + }, + "ねじ切ろ": { + "w_type": "godan verb stem", + "romaji": "nejikiro" + }, + "ねじ切った": { + "w_type": "conjugated godan verb", + "romaji": "nejikitta" + }, + "ねじ切って": { + "w_type": "conjugated godan verb", + "romaji": "nejikitte" + }, + "呑み込ま": { + "w_type": "godan verb stem", + "romaji": "nomikoma" + }, + "呑み込み": { + "w_type": "godan verb stem", + "romaji": "nomikomi" + }, + "呑み込め": { + "w_type": "conjugated godan verb", + "romaji": "nomikome" + }, + "呑み込も": { + "w_type": "godan verb stem", + "romaji": "nomikomo" + }, + "呑み込んだ": { + "w_type": "conjugated godan verb", + "romaji": "nomikonda" + }, + "呑み込んで": { + "w_type": "conjugated godan verb", + "romaji": "nomikonde" + }, + "沸かさ": { + "w_type": "godan verb stem", + "romaji": "wakasa" + }, + "沸かし": { + "w_type": "godan verb stem", + "romaji": "wakashi" + }, + "沸かせ": { + "w_type": "conjugated godan verb", + "romaji": "wakase" + }, + "沸かそ": { + "w_type": "godan verb stem", + "romaji": "wakaso" + }, + "沸かした": { + "w_type": "conjugated godan verb", + "romaji": "wakashita" + }, + "沸かして": { + "w_type": "conjugated godan verb", + "romaji": "wakashite" + }, + "振回さ": { + "w_type": "godan verb stem", + "romaji": "furimawasa" + }, + "振回し": { + "w_type": "godan verb stem", + "romaji": "furimawashi" + }, + "振回せ": { + "w_type": "conjugated godan verb", + "romaji": "furimawase" + }, + "振回そ": { + "w_type": "godan verb stem", + "romaji": "furimawaso" + }, + "振回した": { + "w_type": "conjugated godan verb", + "romaji": "furimawashita" + }, + "振回して": { + "w_type": "conjugated godan verb", + "romaji": "furimawashite" + }, + "くり抜か": { + "w_type": "godan verb stem", + "romaji": "kurinuka" + }, + "くり抜き": { + "w_type": "godan verb stem", + "romaji": "kurinuki" + }, + "くり抜け": { + "w_type": "conjugated godan verb", + "romaji": "kurinuke" + }, + "くり抜こ": { + "w_type": "godan verb stem", + "romaji": "kurinuko" + }, + "くり抜いた": { + "w_type": "conjugated godan verb", + "romaji": "kurinuita" + }, + "くり抜いて": { + "w_type": "conjugated godan verb", + "romaji": "kurinuite" + }, + "擂潰さ": { + "w_type": "godan verb stem", + "romaji": "suritsubusa" + }, + "擂潰し": { + "w_type": "godan verb stem", + "romaji": "suritsubushi" + }, + "擂潰せ": { + "w_type": "conjugated godan verb", + "romaji": "suritsubuse" + }, + "擂潰そ": { + "w_type": "godan verb stem", + "romaji": "suritsubuso" + }, + "擂潰した": { + "w_type": "conjugated godan verb", + "romaji": "suritsubushita" + }, + "擂潰して": { + "w_type": "conjugated godan verb", + "romaji": "suritsubushite" + }, + "溶込ま": { + "w_type": "godan verb stem", + "romaji": "tokekoma" + }, + "溶込み": { + "w_type": "godan verb stem", + "romaji": "tokekomi" + }, + "溶込め": { + "w_type": "conjugated godan verb", + "romaji": "tokekome" + }, + "溶込も": { + "w_type": "godan verb stem", + "romaji": "tokekomo" + }, + "溶込んだ": { + "w_type": "conjugated godan verb", + "romaji": "tokekonda" + }, + "溶込んで": { + "w_type": "conjugated godan verb", + "romaji": "tokekonde" + }, + "煌めか": { + "w_type": "godan verb stem", + "romaji": "kirameka" + }, + "煌めき": { + "w_type": "godan verb stem", + "romaji": "kirameki" + }, + "煌めけ": { + "w_type": "conjugated godan verb", + "romaji": "kirameke" + }, + "煌めこ": { + "w_type": "godan verb stem", + "romaji": "kirameko" + }, + "煌めいた": { + "w_type": "conjugated godan verb", + "romaji": "kirameita" + }, + "煌めいて": { + "w_type": "conjugated godan verb", + "romaji": "kirameite" + }, + "くり貫か": { + "w_type": "godan verb stem", + "romaji": "kurinuka" + }, + "くり貫き": { + "w_type": "godan verb stem", + "romaji": "kurinuki" + }, + "くり貫け": { + "w_type": "conjugated godan verb", + "romaji": "kurinuke" + }, + "くり貫こ": { + "w_type": "godan verb stem", + "romaji": "kurinuko" + }, + "くり貫いた": { + "w_type": "conjugated godan verb", + "romaji": "kurinuita" + }, + "くり貫いて": { + "w_type": "conjugated godan verb", + "romaji": "kurinuite" + }, + "俯か": { + "w_type": "godan verb stem", + "romaji": "utsumuka" + }, + "俯き": { + "w_type": "godan verb stem", + "romaji": "utsumuki" + }, + "俯け": { + "w_type": "conjugated godan verb", + "romaji": "utsumuke" + }, + "俯こ": { + "w_type": "godan verb stem", + "romaji": "utsumuko" + }, + "俯いた": { + "w_type": "conjugated godan verb", + "romaji": "utsumuita" + }, + "俯いて": { + "w_type": "conjugated godan verb", + "romaji": "utsumuite" + }, + "立ち回ら": { + "w_type": "godan verb stem", + "romaji": "tachimawara" + }, + "立ち回り": { + "w_type": "godan verb stem", + "romaji": "tachimawari" + }, + "立ち回れ": { + "w_type": "conjugated godan verb", + "romaji": "tachimaware" + }, + "立ち回ろ": { + "w_type": "godan verb stem", + "romaji": "tachimawaro" + }, + "立ち回った": { + "w_type": "conjugated godan verb", + "romaji": "tachimawatta" + }, + "立ち回って": { + "w_type": "conjugated godan verb", + "romaji": "tachimawatte" + }, + "いたみ悲しま": { + "w_type": "godan verb stem", + "romaji": "itamikanashima" + }, + "いたみ悲しみ": { + "w_type": "godan verb stem", + "romaji": "itamikanashimi" + }, + "いたみ悲しめ": { + "w_type": "conjugated godan verb", + "romaji": "itamikanashime" + }, + "いたみ悲しも": { + "w_type": "godan verb stem", + "romaji": "itamikanashimo" + }, + "いたみ悲しんだ": { + "w_type": "conjugated godan verb", + "romaji": "itamikanashinda" + }, + "いたみ悲しんで": { + "w_type": "conjugated godan verb", + "romaji": "itamikanashinde" + }, + "彫ら": { + "w_type": "godan verb stem", + "romaji": "hora" + }, + "彫り": { + "w_type": "godan verb stem", + "romaji": "hori" + }, + "彫れ": { + "w_type": "conjugated godan verb", + "romaji": "hore" + }, + "彫ろ": { + "w_type": "godan verb stem", + "romaji": "horo" + }, + "彫った": { + "w_type": "conjugated godan verb", + "romaji": "hotta" + }, + "彫って": { + "w_type": "conjugated godan verb", + "romaji": "hotte" + }, + "満たさ": { + "w_type": "godan verb stem", + "romaji": "mitasa" + }, + "満たし": { + "w_type": "godan verb stem", + "romaji": "mitashi" + }, + "満たせ": { + "w_type": "conjugated godan verb", + "romaji": "mitase" + }, + "満たそ": { + "w_type": "godan verb stem", + "romaji": "mitaso" + }, + "満たした": { + "w_type": "conjugated godan verb", + "romaji": "mitashita" + }, + "満たして": { + "w_type": "conjugated godan verb", + "romaji": "mitashite" + }, + "聞き置か": { + "w_type": "godan verb stem", + "romaji": "kikioka" + }, + "聞き置き": { + "w_type": "godan verb stem", + "romaji": "kikioki" + }, + "聞き置け": { + "w_type": "conjugated godan verb", + "romaji": "kikioke" + }, + "聞き置こ": { + "w_type": "godan verb stem", + "romaji": "kikioko" + }, + "聞き置いた": { + "w_type": "conjugated godan verb", + "romaji": "kikioita" + }, + "聞き置いて": { + "w_type": "conjugated godan verb", + "romaji": "kikioite" + }, + "紛らわさ": { + "w_type": "godan verb stem", + "romaji": "magirawasa" + }, + "紛らわし": { + "w_type": "godan verb stem", + "romaji": "magirawashi" + }, + "紛らわせ": { + "w_type": "conjugated godan verb", + "romaji": "magirawase" + }, + "紛らわそ": { + "w_type": "godan verb stem", + "romaji": "magirawaso" + }, + "紛らわした": { + "w_type": "conjugated godan verb", + "romaji": "magirawashita" + }, + "紛らわして": { + "w_type": "conjugated godan verb", + "romaji": "magirawashite" + }, + "上げ離さ": { + "w_type": "godan verb stem", + "romaji": "agehanasa" + }, + "上げ離し": { + "w_type": "godan verb stem", + "romaji": "agehanashi" + }, + "上げ離せ": { + "w_type": "conjugated godan verb", + "romaji": "agehanase" + }, + "上げ離そ": { + "w_type": "godan verb stem", + "romaji": "agehanaso" + }, + "上げ離した": { + "w_type": "conjugated godan verb", + "romaji": "agehanashita" + }, + "上げ離して": { + "w_type": "conjugated godan verb", + "romaji": "agehanashite" + }, + "黒ま": { + "w_type": "godan verb stem", + "romaji": "kuroma" + }, + "黒み": { + "w_type": "godan verb stem", + "romaji": "kuromi" + }, + "黒め": { + "w_type": "conjugated godan verb", + "romaji": "kurome" + }, + "黒も": { + "w_type": "godan verb stem", + "romaji": "kuromo" + }, + "黒んだ": { + "w_type": "conjugated godan verb", + "romaji": "kuronda" + }, + "黒んで": { + "w_type": "conjugated godan verb", + "romaji": "kuronde" + }, + "躍り懸から": { + "w_type": "godan verb stem", + "romaji": "odorikakara" + }, + "躍り懸かり": { + "w_type": "godan verb stem", + "romaji": "odorikakari" + }, + "躍り懸かれ": { + "w_type": "conjugated godan verb", + "romaji": "odorikakare" + }, + "躍り懸かろ": { + "w_type": "godan verb stem", + "romaji": "odorikakaro" + }, + "躍り懸かった": { + "w_type": "conjugated godan verb", + "romaji": "odorikakatta" + }, + "躍り懸かって": { + "w_type": "conjugated godan verb", + "romaji": "odorikakatte" + }, + "思い到ら": { + "w_type": "godan verb stem", + "romaji": "omoiitara" + }, + "思い到り": { + "w_type": "godan verb stem", + "romaji": "omoiitari" + }, + "思い到れ": { + "w_type": "conjugated godan verb", + "romaji": "omoiitare" + }, + "思い到ろ": { + "w_type": "godan verb stem", + "romaji": "omoiitaro" + }, + "思い到った": { + "w_type": "conjugated godan verb", + "romaji": "omoiitatta" + }, + "思い到って": { + "w_type": "conjugated godan verb", + "romaji": "omoiitatte" + }, + "瞬が": { + "w_type": "godan verb stem", + "romaji": "majiroga" + }, + "瞬ぎ": { + "w_type": "godan verb stem", + "romaji": "majirogi" + }, + "瞬げ": { + "w_type": "conjugated godan verb", + "romaji": "majiroge" + }, + "瞬ご": { + "w_type": "godan verb stem", + "romaji": "majirogo" + }, + "瞬いだ": { + "w_type": "conjugated godan verb", + "romaji": "majiroida" + }, + "瞬いで": { + "w_type": "conjugated godan verb", + "romaji": "majiroide" + }, + "歎か": { + "w_type": "godan verb stem", + "romaji": "nageka" + }, + "歎き": { + "w_type": "godan verb stem", + "romaji": "nageki" + }, + "歎け": { + "w_type": "conjugated godan verb", + "romaji": "nageke" + }, + "歎こ": { + "w_type": "godan verb stem", + "romaji": "nageko" + }, + "歎いた": { + "w_type": "conjugated godan verb", + "romaji": "nageita" + }, + "歎いて": { + "w_type": "conjugated godan verb", + "romaji": "nageite" + }, + "感付か": { + "w_type": "godan verb stem", + "romaji": "kanzuka" + }, + "感付き": { + "w_type": "godan verb stem", + "romaji": "kanzuki" + }, + "感付け": { + "w_type": "conjugated godan verb", + "romaji": "kanzuke" + }, + "感付こ": { + "w_type": "godan verb stem", + "romaji": "kanzuko" + }, + "感付いた": { + "w_type": "conjugated godan verb", + "romaji": "kanzuita" + }, + "感付いて": { + "w_type": "conjugated godan verb", + "romaji": "kanzuite" + }, + "生き急が": { + "w_type": "godan verb stem", + "romaji": "ikiisoga" + }, + "生き急ぎ": { + "w_type": "godan verb stem", + "romaji": "ikiisogi" + }, + "生き急げ": { + "w_type": "conjugated godan verb", + "romaji": "ikiisoge" + }, + "生き急ご": { + "w_type": "godan verb stem", + "romaji": "ikiisogo" + }, + "生き急いだ": { + "w_type": "conjugated godan verb", + "romaji": "ikiisoida" + }, + "生き急いで": { + "w_type": "conjugated godan verb", + "romaji": "ikiisoide" + }, + "差し挟ま": { + "w_type": "godan verb stem", + "romaji": "sashihasama" + }, + "差し挟み": { + "w_type": "godan verb stem", + "romaji": "sashihasami" + }, + "差し挟め": { + "w_type": "conjugated godan verb", + "romaji": "sashihasame" + }, + "差し挟も": { + "w_type": "godan verb stem", + "romaji": "sashihasamo" + }, + "差し挟んだ": { + "w_type": "conjugated godan verb", + "romaji": "sashihasanda" + }, + "差し挟んで": { + "w_type": "conjugated godan verb", + "romaji": "sashihasande" + }, + "照らさ": { + "w_type": "godan verb stem", + "romaji": "terasa" + }, + "照らし": { + "w_type": "godan verb stem", + "romaji": "terashi" + }, + "照らせ": { + "w_type": "conjugated godan verb", + "romaji": "terase" + }, + "照らそ": { + "w_type