From 85f87c57bba1dba82c6e6e90aee282002aefa076 Mon Sep 17 00:00:00 2001 From: Maschell Date: Wed, 2 Mar 2016 19:48:04 +0100 Subject: [PATCH] Added download of encrypted content - Decryption from files - Decryption to new folder structures - updates csv with version numbers - download and decrypt different versions (gui only) --- .gitignore | 4 +- jar/JNUSTool.jar | Bin 70923 -> 77818 bytes jar/updatetitles.csv | 649 +++++++++--------- src/de/mas/jnustool/Content.java | 41 +- src/de/mas/jnustool/ContentDownloader.java | 32 + src/de/mas/jnustool/FEntry.java | 50 +- src/de/mas/jnustool/FEntryDownloader.java | 5 +- src/de/mas/jnustool/FST.java | 34 +- src/de/mas/jnustool/Logger.java | 2 +- src/de/mas/jnustool/NUSTitle.java | 166 ++++- src/de/mas/jnustool/Progress.java | 94 ++- src/de/mas/jnustool/Starter.java | 87 ++- src/de/mas/jnustool/TIK.java | 30 +- src/de/mas/jnustool/TitleMetaData.java | 52 +- src/de/mas/jnustool/gui/NUSGUI.java | 3 +- src/de/mas/jnustool/gui/UpdateChooser.java | 205 +++++- src/de/mas/jnustool/util/Decryption.java | 4 +- src/de/mas/jnustool/util/Downloader.java | 80 ++- .../jnustool/util/NUSTitleInformation.java | 59 +- src/de/mas/jnustool/util/Settings.java | 2 +- src/de/mas/jnustool/util/Util.java | 24 + 21 files changed, 1070 insertions(+), 553 deletions(-) create mode 100644 src/de/mas/jnustool/ContentDownloader.java diff --git a/.gitignore b/.gitignore index 820ffc1..5cadfda 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,6 @@ bin /tmp* UpdateGrabber.java updatetitles.csv -src/de/mas/jnustool/StarterPRIATE.java \ No newline at end of file +src/de/mas/jnustool/StarterPRIATE.java +jar/tmp* +src/de/mas/jnustool/XMLGEN.java \ No newline at end of file diff --git a/jar/JNUSTool.jar b/jar/JNUSTool.jar index 8e4d0dacc5f5c19dfe6d8d7759fcaa1907f417a8..501a33d05f2b9ea3cf9ca466f2197407dfcbef8a 100644 GIT binary patch delta 64976 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 DPf1@9 delta 58266 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 S2oMAW!LDnb7_e(C;Qs;7w=7`* diff --git a/jar/updatetitles.csv b/jar/updatetitles.csv index 5a6a2c7..eabacd7 100644 --- a/jar/updatetitles.csv +++ b/jar/updatetitles.csv @@ -1,322 +1,327 @@ -0005000E-10100600;1;WUP;00AF;WUP-U-AKNJ;AKNJAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION -0005000E-10101B00;4;WUP;0001;WUP-U-APLP;APLP01;LEGO® CITY UNDERCOVER -0005000E-10101C00;1;WUP;0001;WUP-U-ARPJ;ARPJ01;New SUPER MARIO BROS. U -0005000E-10101D00;2;WUP;0001;WUP-U-ARPE;ARPE01;New SUPER MARIO BROS. U -0005000E-10101E00;4;WUP;0001;WUP-U-ARPP;ARPP01;New SUPER MARIO BROS. U -0005000E-10101F00;1;WUP;0001;WUP-U-ALCJ;ALCJ01;Nintendo Land -0005000E-10102000;2;WUP;0001;WUP-U-ALCE;ALCE01;Nintendo Land -0005000E-10102100;4;WUP;0001;WUP-U-ALCP;ALCP01;Nintendo Land -0005000E-10102200;1;WUP;0001;WUP-U-ASTJ;ASTJ01;Wii Fit U -0005000E-10102300;2;WUP;0001;WUP-U-ASTE;ASTE01;Wii Fit U -0005000E-10102400;4;WUP;0001;WUP-U-ASTP;ASTP01;Wii Fit U -0005000E-10104D00;1;WUP;0008;WUP-U-AHDJ;AHDJ08;MONSTER HUNTER 3(tri-)G HD Ver. -0005000E-10106900;1;WUP;0001;WUP-U-AURJ;AURJ01;Mario & Sonic at the Sochi 2014 Olympic Winter Games -0005000E-10106B00;2;WUP;0041;WUP-U-ASSE;ASSE41;Assassin's Creed® III -0005000E-1010AE00;2;WUP;0041;WUP-U-AJDE;AJDE41;JUST DANCE 4 -0005000E-1010AF00;2;WUP;0041;WUP-U-AMVE;AMVE41;Marvel Avengers™: Battle for Earth -0005000E-1010B000;2;WUP;0041;WUP-U-ARBE;ARBE41;Rabbids Land -0005000E-1010B300;2;WUP;008P;WUP-U-AS2E;AS2E8P;Sonic & All-Stars Racing Transformed -0005000E-1010B400;2;WUP;0041;WUP-U-ASPE;ASPE41;ESPN Sports Connection -0005000E-1010B600;2;WUP;0041;WUP-U-AYSE;AYSE41;Your Shape® Fitness Evolved 2013 -0005000E-1010C700;2;WUP;0001;WUP-U-AURE;AURE01;Mario & Sonic at the Sochi 2014 Olympic Winter Games -0005000E-1010C800;4;WUP;0001;WUP-U-AURP;AURP01;Mario & Sonic at the Sochi 2014 Olympic Winter Games -0005000E-1010CF00;2;WUP;0052;WUP-U-AECE;AECE52;Call of Duty: Black Ops II -0005000E-1010DA00;2;WUP;0054;WUP-U-ANBE;ANBE54;NBA 2K13 -0005000E-1010DC00;2;WUP;0069;WUP-U-AMEE;AMEE69;Mass Effect™ 3 Special Edition -0005000E-1010DD00;2;WUP;0041;WUP-U-AZUE;AZUE41;ZombiU -0005000E-1010E300;2;WUP;0041;WUP-U-AS9E;AS9E41;Splinter Cell Blacklist -0005000E-1010EA00;1;WUP;00C8;WUP-U-AHBJ;AHBJC8;WARRIORS OROCHI 3 Hyper -0005000E-1010EB00;1;WUP;0001;WUP-P-AMKJ;AMKJ01;MARIO KART 8 -0005000E-1010EC00;2;WUP;0001;WUP-P-AMKE;AMKE01;MARIO KART 8 -0005000E-1010ED00;4;WUP;0001;WUP-P-AMKP;AMKP01;MARIO KART 8 -0005000E-1010EE00;4;WUP;0069;WUP-U-AF3P;AF3P69;FIFA 13 -0005000E-1010EF00;4;WUP;0041;WUP-U-AZUP;AZUP41;ZombiU -0005000E-1010F000;4;WUP;0041;WUP-U-AJDP;AJDP41;JUST DANCE 4 -0005000E-1010F500;4;WUP;0069;WUP-U-AMEP;AMEP69;Mass Effect™ 3 Special Edition -0005000E-1010F600;4;WUP;0041;WUP-U-ASSP;ASSP41;Assassin's Creed® III -0005000E-1010F700;4;WUP;0041;WUP-U-AYSP;AYSP41;Your Shape® Fitness Evolved 2013 -0005000E-1010F800;4;WUP;00AF;WUP-U-AKNP;AKNPAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION -0005000E-1010FB00;4;WUP;00NK;WUP-U-WDLP;WDLPNK;Puddle -0005000E-1010FC00;4;WUP;0041;WUP-U-ARBP;ARBP41;Rabbids Land -0005000E-1010FF00;4;WUP;00WR;WUP-U-AGPP;AGPPWR;Game Party Champions -0005000E-10110000;2;WUP;00AF;WUP-U-AKNE;AKNEAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION -0005000E-10110100;2;WUP;00JX;WUP-U-WASE;WASEJX;Nano Assault Neo -0005000E-10110200;2;WUP;00C8;WUP-U-AHBE;AHBEC8;WARRIORS OROCHI 3 Hyper(NA) -0005000E-10110600;4;WUP;00JX;WUP-U-WASP;WASPJX;Nano Assault Neo -0005000E-10110800;4;WUP;0041;WUP-U-AMVP;AMVP41;Marvel Avengers™: Battle for Earth -0005000E-10110900;1;WUP;00C8;WUP-U-ANGJ;ANGJC8;NINJA GAIDEN 3: Razor's Edge -0005000E-10110A00;2;WUP;0001;WUP-U-ANGE;ANGE01;NINJA GAIDEN 3: Razor's Edge -0005000E-10110B00;4;WUP;0001;WUP-U-ANGP;ANGP01;NINJA GAIDEN 3: Razor's Edge -0005000E-10110E00;1;WUP;0001;WUP-P-AXFJ;AXFJ01;Super Smash Bros. for Wii U -0005000E-10111700;2;WUP;00WR;WUP-U-AJSE;AJSEWR;Injustice: Gods Among Us -0005000E-10111A00;4;WUP;00WR;WUP-U-AJSP;AJSPWR;Injustice: Gods Among Us -0005000E-10111C00;1;WUP;00C8;WUP-U-AG9J;AG9JC8;Romance of the Three Kingdoms 12 -0005000E-10111D00;4;WUP;0041;WUP-U-ASPP;ASPP41;Sports Connection -0005000E-10111F00;4;WUP;008P;WUP-U-AS2P;AS2P8P;Sonic & All-Stars Racing Transformed -0005000E-10112000;2;WUP;00G9;WUP-U-ACRE;ACREG9;THE CROODS -0005000E-10112100;4;WUP;0041;WUP-U-AKFP;AKFP41;Know Your Friends -0005000E-10112200;4;WUP;00FZ;WUP-U-WBDP;WBDPFZ;Trine 2 Director's Cut -0005000E-10112300;1;WUP;0041;WUP-U-AZUJ;AZUJ41;ZombiU -0005000E-10112400;1;WUP;0041;WUP-U-ASSJ;ASSJ41;Assassin's Creed® III -0005000E-10112500;1;WUP;0041;WUP-U-ASPJ;ASPJ41;Sports Connection -0005000E-10112800;1;WUP;0041;WUP-U-AS9J;AS9J41;Splinter Cell Blacklist -0005000E-10112B00;4;WUP;00C8;WUP-U-AHBP;AHBPC8;WARRIORS OROCHI 3 Hyper(EU) -0005000E-10112F00;4;WUP;0054;WUP-U-ANBP;ANBP54;NBA 2K13 -0005000E-10113000;1;WUP;0013;WUP-U-AMEJ;AMEJ13;Mass Effect™ 3 Special Edition -0005000E-10113100;1;WUP;0008;WUP-U-ABHJ;ABHJ08;BIOHAZARD REVELATIONS Unveiled Edition -0005000E-10113400;4;WUP;0052;WUP-U-AECP;AECP52;Call of Duty: Black Ops II -0005000E-10113500;4;WUP;0052;WUP-U-AECI;AECI52;Call of Duty: Black Ops II -0005000E-10113700;4;WUP;0052;WUP-U-AECD;AECD52;Call of Duty: Black Ops II -0005000E-10113800;4;WUP;00Y4;WUP-U-WBAP;WBAPY4;Zen Pinball 2 -0005000E-10113C00;2;WUP;00GT;WUP-U-AFBE;AFBEGT;Funky Barn -0005000E-10115E00;1;WUP;00GD;WUP-U-ADQJ;ADQJGD;Dragon Quest X -0005000E-10115F00;2;WUP;00Y4;WUP-U-WBAE;WBAEY4;Zen Pinball 2 -0005000E-10116100;1;WUP;0001;WUP-P-AX5J;AX5J01;XenobladeX -0005000E-10116300;1;WUP;0001;WUP-U-ACMJ;ACMJ01;The Wonderful 101 -0005000E-10116500;4;WUP;00TW;WUP-U-WAAP;WAAPTW;Toki Tori 2+ -0005000E-10116600;1;WUP;00C8;WUP-U-AH9J;AH9JC8;Fist of the North Star: Ken's Rage 2 -0005000E-10117200;4;WUP;0008;WUP-U-AHDP;AHDP08;MONSTER HUNTER 3 ULTIMATE -0005000E-10117700;4;WUP;00TJ;WUP-U-WCAP;WCAPTJ;Chasing Aurora -0005000E-10118300;2;WUP;0008;WUP-U-AHDE;AHDE08;MONSTER HUNTER 3 ULTIMATE -0005000E-10118400;4;WUP;00GT;WUP-U-AFBP;AFBPGT;Funky Barn -0005000E-1011A700;4;WUP;0041;WUP-U-AZUD;AZUD41;ZombiU -0005000E-1011AF00;2;WUP;00XY;WUP-U-WBTE;WBTEXY;BIT.TRIP Presents... Runner2: Future Legend of Rhythm Alien -0005000E-1011B300;4;WUP;00TZ;WUP-U-AFBZ;AFBZTZ;Funky Barn (Download Version) -0005000E-1011B400;1;WUP;00GD;WUP-U-AECJ;AECJGD;Call of Duty: Black Ops II -0005000E-1011B600;1;WUP;00GD;WUP-U-AQDJ;AQDJGD;Dragon Quest X Beta test -0005000E-1011B700;4;WUP;0041;WUP-U-WLAP;WLAP41;Uplay -0005000E-1011BA00;2;WUP;0041;WUP-U-WLAE;WLAE41;Uplay -0005000E-1011C000;2;WUP;00TJ;WUP-U-WCAE;WCAETJ;Chasing Aurora -0005000E-10128400;4;WUP;0069;WUP-U-ANSP;ANSP69;Need for Speed™ Most Wanted U -0005000E-10128700;2;WUP;00TW;WUP-U-WAAE;WAAETW;Toki Tori 2+ -0005000E-10128800;2;WUP;0069;WUP-U-ANSE;ANSE69;Need for Speed™ Most Wanted U -0005000E-10128A00;2;WUP;00FZ;WUP-U-WBDE;WBDEFZ;Trine 2 Director's Cut -0005000E-10128F00;2;WUP;008P;WUP-U-ASNE;ASNE8P;SONIC LOST WORLD -0005000E-10129000;2;WUP;0008;WUP-U-WDKE;WDKE08;DuckTales: Remastered -0005000E-10129200;4;WUP;0008;WUP-U-WDKP;WDKP08;DuckTales: Remastered -0005000E-1012AC00;4;WUP;0041;WUP-U-AS9P;AS9P41;Splinter Cell Blacklist -0005000E-1012B100;4;WUP;008P;WUP-U-ASNP;ASNP8P;SONIC LOST WORLD -0005000E-1012B400;4;WUP;0008;WUP-U-ABHP;ABHP08;RESIDENT EVIL REVELATIONS -0005000E-1012B700;1;WUP;0013;WUP-U-ANSJ;ANSJ13;Need for Speed™ Most Wanted U -0005000E-1012BC00;1;WUP;0001;WUP-U-AC3J;AC3J01;PIKMIN 3 -0005000E-1012BD00;2;WUP;0001;WUP-U-AC3E;AC3E01;PIKMIN 3 -0005000E-1012BE00;4;WUP;0001;WUP-U-AC3P;AC3P01;PIKMIN 3 -0005000E-1012C500;4;WUP;00AF;WUP-U-ACRP;ACRPAF;THE CROODS -0005000E-1012CF00;2;WUP;0008;WUP-U-ABHE;ABHE08;RESIDENT EVIL REVELATIONS -0005000E-1012DC00;2;WUP;0001;WUP-U-ACME;ACME01;The Wonderful 101 -0005000E-1012F100;1;WUP;0001;WUP-U-AWSJ;AWSJ01;Wii Sports Club -0005000E-10131D00;1;WUP;0001;WUP-U-ASEJ;ASEJ01;???????? -0005000E-10131F00;1;WUP;0001;WUP-U-AYCJ;AYCJ01;yoshi's woolly world -0005000E-10132400;4;WUP;00WR;WUP-U-ALMP;ALMPWR;LEGO® MARVEL Super Heroes -0005000E-10132500;1;WUP;0001;WUP-U-WB9J;WB9J01;Wii Fit U Quick Check -0005000E-10132600;2;WUP;0001;WUP-U-WB9E;WB9E01;Wii Fit U Quick Check -0005000E-10132700;4;WUP;0001;WUP-U-WB9P;WB9P01;Wii Fit U Quick Check -0005000E-10132800;2;WUP;00UP;WUP-U-WEPE;WEPEUP;Unepic EnjoyUp Games -0005000E-10132900;2;WUP;004Q;WUP-U-ADSE;ADSE4Q;Disney INFINITY -0005000E-10132A00;4;WUP;00Y4;WUP-U-WA2P;WA2PY4;Star Wars Pinball -0005000E-10132B00;2;WUP;00WR;WUP-P-ALME;ALMEWR;LEGO® MARVEL Super Heroes -0005000E-10135200;2;WUP;00Y4;WUP-U-WA2E;WA2EY4;Star Wars Pinball -0005000E-10135300;4;WUP;0001;WUP-U-ACMP;ACMP01;The Wonderful 101 -0005000E-10135700;1;WUP;008P;WUP-U-ASNJ;ASNJ8P;SONIC LOST WORLD -0005000E-10136300;4;WUP;00XY;WUP-U-WBTP;WBTPXY;BIT.TRIP Presents... Runner2: Future Legend of Rhythm Alien -0005000E-10136C00;4;WUP;00WR;WUP-U-AZEP;AZEPWR;Batman™: Arkham Origins -0005000E-10136F00;4;WUP;004Q;WUP-U-ADSP;ADSP4Q;Disney Infinity -0005000E-10137000;4;WUP;004Q;WUP-U-ADSZ;ADSZ4Q;Disney Infinity -0005000E-10137C00;2;WUP;00WR;WUP-U-AZEE;AZEEWR;Batman™: Arkham Origins -0005000E-10137F00;2;WUP;0001;WUP-P-ARKE;ARKE01;Donkey Kong Country Tropical Freeze -0005000E-10138300;4;WUP;0001;WUP-P-ARKP;ARKP01;Donkey Kong Country Tropical Freeze -0005000E-10138700;4;WUP;00YV;WUP-P-WB6P;WB6PYV;Spin the Bottle: Bumpie's Party -0005000E-10138800;4;WUP;0041;WUP-U-ASBP;ASBP41;Assassin's Creed® IV Black Flag -0005000E-10138B00;2;WUP;0041;WUP-U-ASBE;ASBE41;Assassin's Creed® IV Black Flag -0005000E-10138E00;4;WUP;0041;WUP-U-WB7P;WB7P41;Rayman Legends Challenges App -0005000E-10138F00;1;WUP;0001;WUP-U-ADNJ;ADNJ01;Devil's Third -0005000E-10139200;2;WUP;0052;WUP-U-ASFE;ASFE52;Skylanders SWAP Force -0005000E-10139500;2;WUP;0041;WUP-U-WB7E;WB7E41;Rayman Legends Challenges App -0005000E-10139900;2;WUP;0041;WUP-P-AJ5E;AJ5E41;JUST DANCE® 2014 -0005000E-10140400;4;WUP;0052;WUP-U-ASFP;ASFP52;Skylanders SWAP Force -0005000E-10140700;1;WUP;00WR;WUP-U-AJSJ;AJSJWR;Injustice: Gods Among Us -0005000E-10142700;4;WUP;0001;WUP-P-AA9P;AA9P01;Art Academy: SketchPad -0005000E-10142A00;2;WUP;005G;WUP-U-AZBE;AZBE5G;Zumba Fitness World Party -0005000E-10142B00;1;WUP;0001;WUP-P-AA9J;AA9J01;Art Academy: SketchPad -0005000E-10142C00;2;WUP;0001;WUP-P-AA9E;AA9E01;Art Academy: SketchPad -0005000E-10143F00;4;WUP;0041;WUP-P-AJ5P;AJ5P41;JUST DANCE® 2014 -0005000E-10144000;2;WUP;00G9;WUP-U-ADVE;ADVEG9;Adventure Time: Explore the Dungeon Because I Don't Know! -0005000E-10144800;1;WUP;0001;WUP-P-ARKJ;ARKJ01;Donkey Kong Country Tropical Freeze -0005000E-10144D00;2;WUP;0001;WUP-U-AWSE;AWSE01;Wii Sports Club -0005000E-10144E00;4;WUP;0001;WUP-U-AWSP;AWSP01;Wii Sports Club -0005000E-10144F00;2;WUP;0001;WUP-P-AXFE;AXFE01;Super Smash Bros. for Wii U -0005000E-10145000;4;WUP;0001;WUP-P-AXFP;AXFP01;Super Smash Bros. for Wii U -0005000E-10145600;7;WUP;0001;WUP-U-ADBA;ADBA01;Animal Crossing Plaza -0005000E-10145800;4;WUP;00UP;WUP-U-WEPP;WEPPUP;Unepic EnjoyUp Games -0005000E-10145900;4;WUP;00HL;WUP-U-WCDP;WCDPHL;Coaster Crazy Deluxe -0005000E-10145F00;1;WUP;0001;WUP-P-WMGJ;WMGJ01;NES REMIX -0005000E-10146000;2;WUP;0001;WUP-P-WMGE;WMGE01;NES REMIX -0005000E-10146100;4;WUP;0001;WUP-P-WMGP;WMGP01;NES REMIX -0005000E-10146800;2;WUP;0052;WUP-P-ACPE;ACPE52;Call of Duty: Ghosts -0005000E-10147600;4;WUP;00DZ;WUP-P-WEVP;WEVPDZ;EvoFish -0005000E-10147F00;2;WUP;00YV;WUP-P-WB6E;WB6EYV;Spin the Bottle: Bumpie's Party -0005000E-10148000;1;WUP;00AF;WUP-P-AUNJ;AUNJAF;ONE PIECE UNLIMITED WORLD R -0005000E-10148200;2;WUP;00UP;WUP-U-WAEE;WAEEUP;Rock 'N Racing Off Road -0005000E-10148F00;1;WUP;0041;WUP-U-WLAJ;WLAJ41;Uplay -0005000E-10149200;4;WUP;00SS;WUP-U-WDFP;WDFPSS;Spot The Differences: Party! -0005000E-10149500;2;WUP;00CS;WUP-P-WKTE;WKTECS;Scram Kitty and his Buddy on Rails -0005000E-10149700;1;WUP;0001;WUP-P-WAUJ;WAUJ01;?? ?? -0005000E-1014C600;4;WUP;00CX;WUP-U-WGSP;WGSPCX;Giana Sisters Twisted Dreams -0005000E-1014C800;1;WUP;0041;WUP-U-ASBJ;ASBJ41;Assassin's Creed® IV Black Flag -0005000E-1014CB00;2;WUP;00CX;WUP-P-WGSE;WGSECX;Giana Sisters Twisted Dreams -0005000E-1014CF00;2;WUP;00HL;WUP-U-WCDE;WCDEHL;Coaster Crazy Deluxe -0005000E-1014D100;4;WUP;00CS;WUP-U-WKTP;WKTPCS;Scram Kitty and his Buddy on Rails -0005000E-1014D900;1;WUP;008P;WUP-P-APTJ;APTJ8P;PUYOPUYOTETRIS -0005000E-1014DA00;1;WUP;0008;WUP-U-AMFJ;AMFJ08;Monster Hunter Frontier G -0005000E-1014DE00;2;WUP;00WR;WUP-U-ALAE;ALAEWR;The LEGO® Movie Videogame -0005000E-1014E000;4;WUP;00WR;WUP-U-ALAP;ALAPWR;The LEGO® Movie Videogame -0005000E-1014E100;4;WUP;00AF;WUP-U-ADVP;ADVPAF;Adventure Time: Explore the Dungeon Because I Don't Know! -0005000E-1014E300;4;WUP;00GT;WUP-U-AZBP;AZBPGT;Zumba Fitness World Party -0005000E-10154600;1;WUP;00WR;WUP-U-AZEJ;AZEJWR;Batman™: Arkham Origins -0005000E-10154D00;4;WUP;00BU;WUP-U-WC3P;WC3PBU;The Mysterious Cities of Gold: Secret Paths -0005000E-10156100;4;WUP;0052;WUP-P-ACPP;ACPP52;Call of Duty: Ghosts -0005000E-10156500;2;WUP;00BU;WUP-U-WC3E;WC3EBU;The Mysterious Cities of Gold: Secret Paths -0005000E-10157600;4;WUP;0052;WUP-P-ACPI;ACPI52;Call of Duty: Ghosts -0005000E-10157900;1;WUP;00GD;WUP-P-ACPJ;ACPJGD;Call of Duty: Ghosts -0005000E-10159800;1;WUP;0001;WUP-U-AFCJ;AFCJ01;Wii Fit U (Free) -0005000E-10159900;2;WUP;0001;WUP-U-AFCE;AFCE01;Wii Fit U (Free) -0005000E-10159A00;4;WUP;0001;WUP-U-AFCP;AFCP01;Wii Fit U (promo) -0005000E-1015A300;1;WUP;00AF;WUP-U-ADSJ;ADSJAF;Disney INFINITY -0005000E-1015B200;2;WUP;0041;WUP-P-ACLE;ACLE41;CHILD of LIGHT -0005000E-1015D300;2;WUP;00AS;WUP-P-WLCE;WLCEAS;Lucadian Chronicles -0005000E-1015EB00;1;WUP;00R7;WUP-U-WHYJ;WHYJR7;Mighty Switch Force!™ Hyper Drive Edition -0005000E-10161F00;1;WUP;0001;WUP-U-ABAJ;ABAJ01;Mario Party 10 -0005000E-10162300;4;WUP;00YR;WUP-U-WCZP;WCZPYR;Color Zen -0005000E-10162B00;1;WUP;0001;WUP-P-AGMJ;AGMJ01;Splatoon -0005000E-10162D00;2;WUP;0001;WUP-U-ABAE;ABAE01;Mario Party 10 -0005000E-10169600;4;WUP;00UP;WUP-U-WEPS;WEPSUP;Unepic EnjoyUp Games -0005000E-1016A200;4;WUP;00SS;WUP-U-WBXP;WBXPSS;Bombing Bastards -0005000E-1016A400;4;WUP;00WR;WUP-P-BTMP;BTMPWR;LEGO® Batman™ 3 Beyond Gotham -0005000E-1016A600;1;WUP;00TF;WUP-P-WB6J;WB6JTF;?????????????? -0005000E-1016AB00;2;WUP;00SS;WUP-U-WBXE;WBXESS;Bombing Bastards -0005000E-1016AC00;2;WUP;009T;WUP-U-WMLE;WMLE9T;Armillo -0005000E-1016AD00;2;WUP;00WR;WUP-P-BTME;BTMEWR;LEGO® Batman™ 3 Beyond Gotham -0005000E-1016B200;2;WUP;009V;WUP-U-WMRE;WMRE9V;Master Reboot -0005000E-1016C700;4;WUP;009T;WUP-U-WMLP;WMLP9T;Armillo -0005000E-1016CE00;2;WUP;00YR;WUP-U-WCZE;WCZEYR;Color Zen -0005000E-1016D500;4;WUP;009Y;WUP-P-WCTP;WCTP9Y;Super Toy Cars -0005000E-1016D800;1;WUP;0041;WUP-P-ACLJ;ACLJ41;CHILD of LIGHT -0005000E-1016DC00;2;WUP;004Q;WUP-P-ADRE;ADRE4Q;Disney Infinity [2.0] -0005000E-1016DE00;2;WUP;009Y;WUP-P-WCTE;WCTE9Y;Super Toy Cars -0005000E-1016E100;2;WUP;00AY;WUP-P-WKNE;WKNEAY;Shovel Knight -0005000E-1016E300;2;WUP;008S;WUP-P-WGRE;WGRE8S;GravBlocks+ From Nothing Game Studios -0005000E-1016E800;4;WUP;009V;WUP-U-WMRP;WMRP9V;Master Reboot -0005000E-1016EA00;4;WUP;0041;WUP-P-ACLP;ACLP41;CHILD of LIGHT -0005000E-1016FF00;2;WUP;00NT;WUP-P-WFWE;WFWENT;Flowerworks HD Follie's Adventure -0005000E-10170200;2;WUP;007Z;WUP-U-WGAE;WGAE7Z;Pier Solar and the Great Architects -0005000E-10170600;1;WUP;00AF;WUP-U-APWJ;APWJAF;KAMEN RIDER BATTRIDE WAR ? PREMIUM TV&MOVIE SOUND ED. -0005000E-10170700;1;WUP;00AF;WUP-U-ABWJ;ABWJAF;KAMEN RIDER BATTRIDE WAR ? -0005000E-10172A00;2;WUP;009Z;WUP-N-HRLE;HRLE9Z;Crunchyroll -0005000E-10172B00;4;WUP;009Z;WUP-N-HRLP;HRLP9Z;Crunchyroll -0005000E-10173300;4;WUP;00UB;WUP-U-WCGP;WCGPUB;Stealth Inc 2 A Game of Clones -0005000E-10175B00;2;WUP;008P;WUP-P-BSSE;BSSE8P;Sonic Boom: Rise of Lyric -0005000E-10175D00;4;WUP;00AF;WUP-P-AUNP;AUNPAF;ONE PIECE Unlimited World Red -0005000E-10176500;2;WUP;00UB;WUP-U-WCGE;WCGEUB;Stealth Inc 2 A Game of Clones -0005000E-10176900;2;WUP;0001;WUP-P-AGME;AGME01;Splatoon -0005000E-10176A00;4;WUP;0001;WUP-P-AGMP;AGMP01;Splatoon -0005000E-10176F00;4;WUP;0041;WUP-P-BJDP;BJDP41;JUST DANCE® 2015 -0005000E-10177600;2;WUP;0001;WUP-U-ADNE;ADNE01;Devil's Third -0005000E-10177800;4;WUP;008P;WUP-P-BSSP;BSSP8P;Sonic Boom: Rise of Lyric -0005000E-10178F00;4;WUP;00AY;WUP-P-WKNP;WKNPAY;Shovel Knight -0005000E-10179100;2;WUP;0041;WUP-P-BJDE;BJDE41;JUST DANCE® 2015 -0005000E-1017BE00;1;WUP;0001;WUP-U-BXAJ;BXAJ01;Art Academy: Home Studio -0005000E-1017BF00;2;WUP;0001;WUP-U-BXAE;BXAE01;Art Academy: Home Studio -0005000E-1017C600;2;WUP;0052;WUP-P-BK7E;BK7E52;Skylanders Trap Team -0005000E-1017CD00;1;WUP;00C8;WUP-U-BWPJ;BWPJC8;Hyrule Warriors -0005000E-1017D800;2;WUP;0001;WUP-U-BWPE;BWPE01;Hyrule Warriors -0005000E-1017D900;4;WUP;0001;WUP-U-BWPP;BWPP01;Hyrule Warriors -0005000E-1017DA00;2;WUP;011S;WUP-P-ACQE;ACQE1S;Costume Quest 2 -0005000E-1017E000;4;WUP;00XQ;WUP-P-WK8P;WK8PXQ;Turtle Tale -0005000E-10180500;1;WUP;0001;WUP-P-AKBJ;AKBJ01;Captain Toad: Treasure Tracker -0005000E-10180600;2;WUP;0001;WUP-P-AKBE;AKBE01;Captain Toad: Treasure Tracker -0005000E-10180700;4;WUP;0001;WUP-P-AKBP;AKBP01;Captain Toad: Treasure Tracker -0005000E-10181F00;4;WUP;0052;WUP-P-BK7P;BK7P52;Skylanders Trap Team -0005000E-10182C00;4;WUP;00XT;WUP-U-AJTP;AJTPXT;Jett Tailfin -0005000E-10183000;2;WUP;010P;WUP-P-ARNE;ARNE0P;Runbow -0005000E-10183900;2;WUP;00UP;WUP-U-BMVE;BMVEUP;99Moves -0005000E-10184D00;2;WUP;0001;WUP-U-AYCE;AYCE01;Yoshi's Woolly World -0005000E-10187100;4;WUP;00LW;WUP-U-BUGP;BUGPLW;Underground -0005000E-10188B00;1;WUP;0001;WUP-U-AXYJ;AXYJ01;Kirby and the Rainbow Curse -0005000E-10188C00;4;WUP;004Q;WUP-P-ADRP;ADRP4Q;Disney Infinity [2.0] -0005000E-10188D00;4;WUP;004Q;WUP-P-ADRZ;ADRZ4Q;Disney Infinity [2.0] -0005000E-10189200;2;WUP;011C;WUP-P-BSPE;BSPE1C;Sportsball -0005000E-1018C400;1;WUP;00AF;WUP-P-BSFJ;BSFJAF;???F??????????? ????SF??????????? -0005000E-1018DB00;1;WUP;0001;WUP-U-AMAJ;AMAJ01;Super Mario Maker -0005000E-1018DC00;2;WUP;0001;WUP-U-AMAE;AMAE01;Super Mario Maker -0005000E-1018DD00;4;WUP;0001;WUP-U-AMAP;AMAP01;Super Mario Maker -0005000E-1018DE00;4;WUP;00NK;WUP-U-ATCP;ATCPNK;Tetrobot and Co. -0005000E-1018ED00;2;WUP;00NK;WUP-U-ATCE;ATCENK;Tetrobot and Co. -0005000E-10191700;4;WUP;00UP;WUP-U-BMVP;BMVPUP;99Moves -0005000E-10191800;4;WUP;00UP;WUP-U-WAEP;WAEPUP;Rock 'N Racing Off Road -0005000E-10192200;1;WUP;00AF;WUP-P-BRSJ;BRSJAF;KAMEN RIDER SUMMON RIDE! -0005000E-10194200;2;WUP;00WR;WUP-U-APZE;APZEWR;LEGO® DIMENSIONS™ -0005000E-10195D00;4;WUP;00WR;WUP-U-APZP;APZPWR;LEGO® DIMENSIONS™ -0005000E-10197800;4;WUP;011S;WUP-P-ACQP;ACQP1S;Costume Quest 2 -0005000E-10199000;1;WUP;0001;WUP-P-AVXJ;AVXJ01;Mario Tennis: Ultra Smash -0005000E-1019AD00;2;WUP;011A;WUP-P-BEQE;BEQE1A;Elliot Quest -0005000E-101A1B00;2;WUP;00RG;WUP-U-BS2E;BS2ERG;Swords & Soldiers II -0005000E-101A2600;1;WUP;00W4;WUP-U-WKFJ;WKFJW4;Kung Fu Rabbit -0005000E-101A2E00;1;WUP;00TF;WUP-P-WEXJ;WEXJTF;XType+ -0005000E-101A3500;2;WUP;0001;WUP-P-AVXE;AVXE01;Mario Tennis: Ultra Smash -0005000E-101A3600;4;WUP;0001;WUP-P-AVXP;AVXP01;Mario Tennis: Ultra Smash -0005000E-101A3B00;2;WUP;00LY;WUP-P-BLPE;BLPELY;Life of Pixel -0005000E-101A4900;4;WUP;00LY;WUP-U-BLPP;BLPPLY;Life of Pixel -0005000E-101A5C00;4;WUP;00WR;WUP-U-ALJP;ALJPWR;LEGO® Jurassic World™ -0005000E-101A5E00;4;WUP;00UB;WUP-U-ALLP;ALLPUB;OlliOlli -0005000E-101A5F00;2;WUP;00WY;WUP-U-BSXE;BSXEWY;Shantae and the Pirate's Curse -0005000E-101A6200;2;WUP;00WR;WUP-U-ALJE;ALJEWR;LEGO® Jurassic World™ -0005000E-101A6300;4;WUP;00YR;WUP-U-ACUP;ACUPYR;Cube Life: Island Survival -0005000E-101A6400;2;WUP;00YR;WUP-U-ACUE;ACUEYR;Cube Life: Island Survival -0005000E-101A6500;2;WUP;00VZ;WUP-P-BKFE;BKFEVZ;Kung Fu Panda Showdown of Legendary Legends -0005000E-101A6900;2;WUP;00UB;WUP-P-ALLE;ALLEUB;OlliOlli -0005000E-101A9500;4;WUP;00WY;WUP-U-BSXP;BSXPWY;Shantae and the Pirate's Curse -0005000E-101A9F00;2;WUP;0147;WUP-P-BDAE;BDAE47;Dot Arcade -0005000E-101AA500;4;WUP;00VZ;WUP-P-BKFP;BKFPVZ;Kung Fu Panda Showdown of Legendary Legends -0005000E-101ABC00;2;WUP;0001;WUP-U-AXYE;AXYE01;Kirby and the Rainbow Curse -0005000E-101AC700;2;WUP;00VZ;WUP-P-BFNE;BFNEVZ;Adventure Time Finn and Jake Investigations -0005000E-101AC900;2;WUP;004Q;WUP-P-BD3E;BD3E4Q;DISNEY INFINITY 3.0 EDITION -0005000E-101AFE00;4;WUP;00VZ;WUP-P-BFNP;BFNPVZ;Adventure Time Finn and Jake Investigations -0005000E-101B3D00;4;WUP;004Q;WUP-P-BD3P;BD3P4Q;DISNEY INFINITY 3.0: PLAY WITHOUT LIMITS -0005000E-101B3E00;4;WUP;004Q;WUP-P-BD3Z;BD3Z4Q;DISNEY INFINITY 3.0: PLAY WITHOUT LIMITS -0005000E-101B8500;2;WUP;0052;WUP-P-BS5E;BS5E52;Skylanders SuperChargers -0005000E-101B9000;2;WUP;0041;WUP-P-AJ6E;AJ6E41;JUST DANCE® 2016 -0005000E-101B9800;4;WUP;0041;WUP-P-AJ6P;AJ6P41;JUST DANCE® 2016 -0005000E-101BA400;2;WUP;0052;WUP-P-AGNE;AGNE52;Guitar Hero Live -0005000E-101BAA00;2;WUP;010C;WUP-U-ATTE;ATTE0C;Totem Topple -0005000E-101BB300;4;WUP;008V;WUP-P-WLSP;WLSP8V;ZaciSa: Defense of the Crayon Dimension! -0005000E-101BB800;4;WUP;011A;WUP-P-BEQP;BEQP1A;Elliot Quest -0005000E-101BC600;4;WUP;0052;WUP-P-AGNP;AGNP52;Guitar Hero Live -0005000E-101BE900;4;WUP;00WR;WUP-P-ALRP;ALRPWR;LEGO® MARVEL's Avengers -0005000E-101BEF00;2;WUP;00WR;WUP-P-ALRE;ALREWR;LEGO® MARVEL's Avengers -0005000E-101BFC00;4;WUP;0052;WUP-P-BS5P;BS5P52;Skylanders SuperChargers -0005000E-101C0700;4;WUP;00UB;WUP-U-AN3P;AN3PUB;Nova-111 -0005000E-101C0A00;2;WUP;00UB;WUP-U-AN3E;AN3EUB;Nova-111 -0005000E-101C0B00;2;WUP;00UB;WUP-P-BS7E;BS7EUB;The Swindle -0005000E-101C0C00;4;WUP;00UB;WUP-P-BS7P;BS7PUB;The Swindle -0005000E-101C3100;2;WUP;0167;WUP-U-AFEE;AFEE67;Freedom Planet -0005000E-101C3900;4;WUP;015G;WUP-P-AWBP;AWBP5G;Word Search by POWGI -0005000E-101C4C00;4;WUP;0001;WUP-P-AX5D;AX5D01;Xenoblade Chronicles X -0005000E-101C4D00;2;WUP;0001;WUP-P-AX5E;AX5E01;Xenoblade Chronicles X -0005000E-101C6A00;2;WUP;016E;WUP-P-AD5E;AD5E6E;Octodad: Dadliest Catch -0005000E-101C6E00;4;WUP;00RG;WUP-U-BS2P;BS2PRG;Swords & Soldiers II -0005000E-101C8B00;4;WUP;00YT;WUP-P-AWMP;AWMPYT;WICKED MONSTERS BLAST! HD PLUS -0005000E-101CC900;4;WUP;0167;WUP-U-AFEP;AFEP67;Freedom Planet -0005000E-101CE100;2;WUP;0175;WUP-U-ACHE;ACHE75;Canvaleon -0005000E-101D0700;4;WUP;0175;WUP-U-ACHP;ACHP75;Canvaleon -0005000E-101D0900;2;WUP;00FV;WUP-U-AGWE;AGWEFV;Gunman Clive HD Collection -0005000E-101D2C00;1;WUP;00SA;WUP-P-ATXJ;ATXJSA;Bike Rider UltraDX WORLD TOUR -0005000E-101D3900;4;WUP;017D;WUP-P-AQCP;AQCP7D;The Quiet Collection -0005000E-101D4200;2;WUP;00DV;WUP-P-ABPE;ABPEDV;Brunswick Pro Bowling -0005000E-101D6100;4;WUP;00FV;WUP-U-AGWP;AGWPFV;Gunman Clive HD Collection -0005000E-101D6D00;4;WUP;010P;WUP-P-ARNP;ARNP0P;Runbow -0005000E-101D7400;4;WUP;010C;WUP-U-ATTP;ATTP0C;Totem Topple -0005000E-101D7500;4;WUP;00DU;WUP-P-AUMP;AUMPDU;Minecraft: Wii U Edition -0005000E-101D9D00;2;WUP;00DU;WUP-P-AUME;AUMEDU;Minecraft: Wii U Edition -0005000E-101DBE00;1;WUP;0188;WUP-P-AUMJ;AUMJ88;Minecraft: Wii U Edition -0005000E-101DC100;4;WUP;016E;WUP-P-AD5P;AD5P6E;Octodad: Dadliest Catch -0005000E-101DDC00;1;WUP;00AF;WUP-P-BD3J;BD3JAF;????????????3.0 +0005000E-10100600;1;WUP;00AF;WUP-U-AKNJ;AKNJAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION;16 +0005000E-10101B00;4;WUP;0001;WUP-U-APLP;APLP01;LEGO® CITY UNDERCOVER;16 +0005000E-10101C00;1;WUP;0001;WUP-U-ARPJ;ARPJ01;New SUPER MARIO BROS. U;32,48,65 +0005000E-10101D00;2;WUP;0001;WUP-U-ARPE;ARPE01;New SUPER MARIO BROS. U;32,48,64 +0005000E-10101E00;4;WUP;0001;WUP-U-ARPP;ARPP01;New SUPER MARIO BROS. U;32,48,64,80 +0005000E-10101F00;1;WUP;0001;WUP-U-ALCJ;ALCJ01;Nintendo Land;32 +0005000E-10102000;2;WUP;0001;WUP-U-ALCE;ALCE01;Nintendo Land;32 +0005000E-10102100;4;WUP;0001;WUP-U-ALCP;ALCP01;Nintendo Land;32 +0005000E-10102200;1;WUP;0001;WUP-U-ASTJ;ASTJ01;Wii Fit U;32,48,64,81 +0005000E-10102300;2;WUP;0001;WUP-U-ASTE;ASTE01;Wii Fit U;16,48,64,81 +0005000E-10102400;4;WUP;0001;WUP-U-ASTP;ASTP01;Wii Fit U;16,48,64,81 +0005000E-10104D00;1;WUP;0008;WUP-U-AHDJ;AHDJ08;MONSTER HUNTER 3(tri-)G HD Ver.;16,32,48,65,80,96 +0005000E-10106900;1;WUP;0001;WUP-U-AURJ;AURJ01;Mario & Sonic at the Sochi 2014 Olympic Winter Games;16,32 +0005000E-10106B00;2;WUP;0041;WUP-U-ASSE;ASSE41;Assassin's Creed® III;16,32,48,64,80 +0005000E-1010AE00;2;WUP;0041;WUP-U-AJDE;AJDE41;JUST DANCE 4;16,32 +0005000E-1010AF00;2;WUP;0041;WUP-U-AMVE;AMVE41;Marvel Avengers™: Battle for Earth;16 +0005000E-1010B000;2;WUP;0041;WUP-U-ARBE;ARBE41;Rabbids Land;16 +0005000E-1010B300;2;WUP;008P;WUP-U-AS2E;AS2E8P;Sonic & All-Stars Racing Transformed;16,32,48 +0005000E-1010B400;2;WUP;0041;WUP-U-ASPE;ASPE41;ESPN Sports Connection;16,33 +0005000E-1010B600;2;WUP;0041;WUP-U-AYSE;AYSE41;Your Shape® Fitness Evolved 2013;16,32 +0005000E-1010C700;2;WUP;0001;WUP-U-AURE;AURE01;Mario & Sonic at the Sochi 2014 Olympic Winter Games;16,32 +0005000E-1010C800;4;WUP;0001;WUP-U-AURP;AURP01;Mario & Sonic at the Sochi 2014 Olympic Winter Games;16,32 +0005000E-1010CF00;2;WUP;0052;WUP-U-AECE;AECE52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,128 +0005000E-1010DA00;2;WUP;0054;WUP-U-ANBE;ANBE54;NBA 2K13;16,32 +0005000E-1010DC00;2;WUP;0069;WUP-U-AMEE;AMEE69;Mass Effect™ 3 Special Edition;16 +0005000E-1010DD00;2;WUP;0041;WUP-U-AZUE;AZUE41;ZombiU;16,32 +0005000E-1010E300;2;WUP;0041;WUP-U-AS9E;AS9E41;Splinter Cell Blacklist;16,32,48 +0005000E-1010EA00;1;WUP;00C8;WUP-U-AHBJ;AHBJC8;WARRIORS OROCHI 3 Hyper;16,32,48,64 +0005000E-1010EB00;1;WUP;0001;WUP-P-AMKJ;AMKJ01;MARIO KART 8;17,33,48,64 +0005000E-1010EC00;2;WUP;0001;WUP-P-AMKE;AMKE01;MARIO KART 8;16,32,48,64 +0005000E-1010ED00;4;WUP;0001;WUP-P-AMKP;AMKP01;MARIO KART 8;16,32,48,64 +0005000E-1010EE00;4;WUP;0069;WUP-U-AF3P;AF3P69;FIFA 13 ;16 +0005000E-1010EF00;4;WUP;0041;WUP-U-AZUP;AZUP41;ZombiU;16,32 +0005000E-1010F000;4;WUP;0041;WUP-U-AJDP;AJDP41;JUST DANCE 4;16,32 +0005000E-1010F500;4;WUP;0069;WUP-U-AMEP;AMEP69;Mass Effect™ 3 Special Edition;16 +0005000E-1010F600;4;WUP;0041;WUP-U-ASSP;ASSP41;Assassin's Creed® III;16,48,64,80 +0005000E-1010F700;4;WUP;0041;WUP-U-AYSP;AYSP41;Your Shape® Fitness Evolved 2013;16,33 +0005000E-1010F800;4;WUP;00AF;WUP-U-AKNP;AKNPAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION;32 +0005000E-1010FB00;4;WUP;00NK;WUP-U-WDLP;WDLPNK;Puddle;16 +0005000E-1010FC00;4;WUP;0041;WUP-U-ARBP;ARBP41;Rabbids Land;16 +0005000E-1010FF00;4;WUP;00WR;WUP-U-AGPP;AGPPWR;Game Party Champions;16 +0005000E-10110000;2;WUP;00AF;WUP-U-AKNE;AKNEAF;TEKKEN TAG TOURNAMENT 2 Wii U EDITION;32 +0005000E-10110100;2;WUP;00JX;WUP-U-WASE;WASEJX;Nano Assault Neo;17 +0005000E-10110200;2;WUP;00C8;WUP-U-AHBE;AHBEC8;WARRIORS OROCHI 3 Hyper(NA);16,32 +0005000E-10110600;4;WUP;00JX;WUP-U-WASP;WASPJX;Nano Assault Neo;17 +0005000E-10110800;4;WUP;0041;WUP-U-AMVP;AMVP41;Marvel Avengers™: Battle for Earth;16 +0005000E-10110900;1;WUP;00C8;WUP-U-ANGJ;ANGJC8;NINJA GAIDEN 3: Razor's Edge;16,32,48,64 +0005000E-10110A00;2;WUP;0001;WUP-U-ANGE;ANGE01;NINJA GAIDEN 3: Razor's Edge;16,32,48,64,80 +0005000E-10110B00;4;WUP;0001;WUP-U-ANGP;ANGP01;NINJA GAIDEN 3: Razor's Edge;17,32,48 +0005000E-10110E00;1;WUP;0001;WUP-P-AXFJ;AXFJ01;Super Smash Bros. for Wii U;16,49,64,80,96,112,128,144,160,176,192,208 +0005000E-10111700;2;WUP;00WR;WUP-U-AJSE;AJSEWR;Injustice: Gods Among Us;16 +0005000E-10111A00;4;WUP;00WR;WUP-U-AJSP;AJSPWR;Injustice: Gods Among Us;16 +0005000E-10111C00;1;WUP;00C8;WUP-U-AG9J;AG9JC8;Romance of the Three Kingdoms 12;16,33 +0005000E-10111D00;4;WUP;0041;WUP-U-ASPP;ASPP41;Sports Connection;16 +0005000E-10111F00;4;WUP;008P;WUP-U-AS2P;AS2P8P;Sonic & All-Stars Racing Transformed;32,48 +0005000E-10112000;2;WUP;00G9;WUP-U-ACRE;ACREG9;THE CROODS;16 +0005000E-10112100;4;WUP;0041;WUP-U-AKFP;AKFP41;Know Your Friends;16 +0005000E-10112200;4;WUP;00FZ;WUP-U-WBDP;WBDPFZ;Trine 2 Director's Cut;16 +0005000E-10112300;1;WUP;0041;WUP-U-AZUJ;AZUJ41;ZombiU;16,32 +0005000E-10112400;1;WUP;0041;WUP-U-ASSJ;ASSJ41;Assassin's Creed® III;16,32,48,64,80 +0005000E-10112500;1;WUP;0041;WUP-U-ASPJ;ASPJ41;Sports Connection;17 +0005000E-10112800;1;WUP;0041;WUP-U-AS9J;AS9J41;Splinter Cell Blacklist;17,32,48 +0005000E-10112B00;4;WUP;00C8;WUP-U-AHBP;AHBPC8;WARRIORS OROCHI 3 Hyper(EU);16,32 +0005000E-10112F00;4;WUP;0054;WUP-U-ANBP;ANBP54;NBA 2K13;32 +0005000E-10113000;1;WUP;0013;WUP-U-AMEJ;AMEJ13;Mass Effect™ 3 Special Edition;16 +0005000E-10113100;1;WUP;0008;WUP-U-ABHJ;ABHJ08;BIOHAZARD REVELATIONS Unveiled Edition;16 +0005000E-10113400;4;WUP;0052;WUP-U-AECP;AECP52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,128 +0005000E-10113500;4;WUP;0052;WUP-U-AECI;AECI52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,144 +0005000E-10113700;4;WUP;0052;WUP-U-AECD;AECD52;Call of Duty: Black Ops II;16,32,48,64,80,96,112,144 +0005000E-10113800;4;WUP;00Y4;WUP-U-WBAP;WBAPY4;Zen Pinball 2;17,32,48,65,80,96 +0005000E-10113C00;2;WUP;00GT;WUP-U-AFBE;AFBEGT;Funky Barn;16 +0005000E-10115E00;1;WUP;00GD;WUP-U-ADQJ;ADQJGD;Dragon Quest X;16,80,128,144,160,192,208,224,240,256,272,288,304,336,368,384,400,416,432,448,464,480,496,512,528,544,560,624,640,656,672,688,704,736,752,784,800,816,832,848,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888,1904,1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,2240,2256,2272,2288,2304,2320 +0005000E-10115F00;2;WUP;00Y4;WUP-U-WBAE;WBAEY4;Zen Pinball 2;16,32,48,65,80,96 +0005000E-10116100;1;WUP;0001;WUP-P-AX5J;AX5J01;XenobladeX;16,32,48 +0005000E-10116300;1;WUP;0001;WUP-U-ACMJ;ACMJ01;The Wonderful 101;16 +0005000E-10116500;4;WUP;00TW;WUP-U-WAAP;WAAPTW;Toki Tori 2+;16,32 +0005000E-10116600;1;WUP;00C8;WUP-U-AH9J;AH9JC8;Fist of the North Star: Ken's Rage 2;17 +0005000E-10117200;4;WUP;0008;WUP-U-AHDP;AHDP08;MONSTER HUNTER 3 ULTIMATE;16,32 +0005000E-10117700;4;WUP;00TJ;WUP-U-WCAP;WCAPTJ;Chasing Aurora;17 +0005000E-10118300;2;WUP;0008;WUP-U-AHDE;AHDE08;MONSTER HUNTER 3 ULTIMATE;16,32 +0005000E-10118400;4;WUP;00GT;WUP-U-AFBP;AFBPGT;Funky Barn;16 +0005000E-1011A700;4;WUP;0041;WUP-U-AZUD;AZUD41;ZombiU;16,32 +0005000E-1011AF00;2;WUP;00XY;WUP-U-WBTE;WBTEXY;BIT.TRIP Presents... Runner2: Future Legend of Rhythm Alien;16,33 +0005000E-1011B300;4;WUP;00TZ;WUP-U-AFBZ;AFBZTZ;Funky Barn (Download Version);16 +0005000E-1011B400;1;WUP;00GD;WUP-U-AECJ;AECJGD;Call of Duty: Black Ops II;16,32,48,64,80,96 +0005000E-1011B600;1;WUP;00GD;WUP-U-AQDJ;AQDJGD;Dragon Quest X Beta test;16,32,48,64,96 +0005000E-1011B700;4;WUP;0041;WUP-U-WLAP;WLAP41;Uplay;16,32,33,48,64 +0005000E-1011BA00;2;WUP;0041;WUP-U-WLAE;WLAE41;Uplay;16,33,48,64 +0005000E-1011C000;2;WUP;00TJ;WUP-U-WCAE;WCAETJ;Chasing Aurora;16 +0005000E-10128400;4;WUP;0069;WUP-U-ANSP;ANSP69;Need for Speed™ Most Wanted U;16,32 +0005000E-10128700;2;WUP;00TW;WUP-U-WAAE;WAAETW;Toki Tori 2+;16,32 +0005000E-10128800;2;WUP;0069;WUP-U-ANSE;ANSE69;Need for Speed™ Most Wanted U;16,32 +0005000E-10128A00;2;WUP;00FZ;WUP-U-WBDE;WBDEFZ;Trine 2 Director's Cut;16 +0005000E-10128F00;2;WUP;008P;WUP-U-ASNE;ASNE8P;SONIC LOST WORLD;16,32,48 +0005000E-10129000;2;WUP;0008;WUP-U-WDKE;WDKE08;DuckTales: Remastered;16,32 +0005000E-10129200;4;WUP;0008;WUP-U-WDKP;WDKP08;DuckTales: Remastered;16,32 +0005000E-1012AC00;4;WUP;0041;WUP-U-AS9P;AS9P41;Splinter Cell Blacklist;16,32,48 +0005000E-1012B100;4;WUP;008P;WUP-U-ASNP;ASNP8P;SONIC LOST WORLD;16,32,48 +0005000E-1012B400;4;WUP;0008;WUP-U-ABHP;ABHP08;RESIDENT EVIL REVELATIONS;16 +0005000E-1012B700;1;WUP;0013;WUP-U-ANSJ;ANSJ13;Need for Speed™ Most Wanted U;16,32 +0005000E-1012BC00;1;WUP;0001;WUP-U-AC3J;AC3J01;PIKMIN 3;17,48,64,80,96 +0005000E-1012BD00;2;WUP;0001;WUP-U-AC3E;AC3E01;PIKMIN 3;33,48,64,80,96 +0005000E-1012BE00;4;WUP;0001;WUP-U-AC3P;AC3P01;PIKMIN 3;17,48,64,80,96 +0005000E-1012C500;4;WUP;00AF;WUP-U-ACRP;ACRPAF;THE CROODS;16 +0005000E-1012CF00;2;WUP;0008;WUP-U-ABHE;ABHE08;RESIDENT EVIL REVELATIONS;16 +0005000E-1012DC00;2;WUP;0001;WUP-U-ACME;ACME01;The Wonderful 101;16 +0005000E-1012F100;1;WUP;0001;WUP-U-AWSJ;AWSJ01;Wii Sports Club;16,32,48,64,80,96,112 +0005000E-10131D00;1;WUP;0001;WUP-P-ASEJ;ASEJ01;????????;17,32 +0005000E-10131F00;1;WUP;0001;WUP-U-AYCJ;AYCJ01;yoshi's woolly world;32 +0005000E-10132400;4;WUP;00WR;WUP-U-ALMP;ALMPWR;LEGO® MARVEL Super Heroes;16,32,48 +0005000E-10132500;1;WUP;0001;WUP-U-WB9J;WB9J01;Wii Fit U Quick Check;16,64,81 +0005000E-10132600;2;WUP;0001;WUP-U-WB9E;WB9E01;Wii Fit U Quick Check;16,64,81 +0005000E-10132700;4;WUP;0001;WUP-U-WB9P;WB9P01;Wii Fit U Quick Check;16,64,81 +0005000E-10132800;2;WUP;00UP;WUP-U-WEPE;WEPEUP;Unepic EnjoyUp Games;16,32 +0005000E-10132900;2;WUP;004Q;WUP-U-ADSE;ADSE4Q;Disney INFINITY;16,32,49 +0005000E-10132A00;4;WUP;00Y4;WUP-U-WA2P;WA2PY4;Star Wars Pinball;17,32,48 +0005000E-10132B00;2;WUP;00WR;WUP-P-ALME;ALMEWR;LEGO® MARVEL Super Heroes;16,32 +0005000E-10135200;2;WUP;00Y4;WUP-U-WA2E;WA2EY4;Star Wars Pinball;16,33,48 +0005000E-10135300;4;WUP;0001;WUP-U-ACMP;ACMP01;The Wonderful 101;16 +0005000E-10135700;1;WUP;008P;WUP-U-ASNJ;ASNJ8P;SONIC LOST WORLD;16,32,48 +0005000E-10136300;4;WUP;00XY;WUP-U-WBTP;WBTPXY;BIT.TRIP Presents... Runner2: Future Legend of Rhythm Alien;17 +0005000E-10136C00;4;WUP;00WR;WUP-U-AZEP;AZEPWR;Batman™: Arkham Origins;16 +0005000E-10136F00;4;WUP;004Q;WUP-U-ADSP;ADSP4Q;Disney Infinity;16,32,49 +0005000E-10137000;4;WUP;004Q;WUP-U-ADSZ;ADSZ4Q;Disney Infinity;16,32,49 +0005000E-10137C00;2;WUP;00WR;WUP-U-AZEE;AZEEWR;Batman™: Arkham Origins;16 +0005000E-10137F00;2;WUP;0001;WUP-P-ARKE;ARKE01;Donkey Kong Country Tropical Freeze;16 +0005000E-10138300;4;WUP;0001;WUP-P-ARKP;ARKP01;Donkey Kong Country Tropical Freeze;17 +0005000E-10138700;4;WUP;00YV;WUP-P-WB6P;WB6PYV;Spin the Bottle: Bumpie's Party;16,33 +0005000E-10138800;4;WUP;0041;WUP-U-ASBP;ASBP41;Assassin's Creed® IV Black Flag;16,32 +0005000E-10138B00;2;WUP;0041;WUP-U-ASBE;ASBE41;Assassin's Creed® IV Black Flag;16,32 +0005000E-10138E00;4;WUP;0041;WUP-U-WB7P;WB7P41;Rayman Legends Challenges App;16 +0005000E-10138F00;1;WUP;0001;WUP-U-ADNJ;ADNJ01;Devil's Third;16 +0005000E-10139200;2;WUP;0052;WUP-U-ASFE;ASFE52;Skylanders SWAP Force;16 +0005000E-10139500;2;WUP;0041;WUP-U-WB7E;WB7E41;Rayman Legends Challenges App;16 +0005000E-10139900;2;WUP;0041;WUP-P-AJ5E;AJ5E41;JUST DANCE® 2014;16 +0005000E-10140400;4;WUP;0052;WUP-U-ASFP;ASFP52;Skylanders SWAP Force;16 +0005000E-10140700;1;WUP;00WR;WUP-U-AJSJ;AJSJWR;Injustice: Gods Among Us;16 +0005000E-10142700;4;WUP;0001;WUP-P-AA9P;AA9P01;Art Academy: SketchPad;16 +0005000E-10142A00;2;WUP;005G;WUP-U-AZBE;AZBE5G;Zumba Fitness World Party;16 +0005000E-10142B00;1;WUP;0001;WUP-P-AA9J;AA9J01;Art Academy: SketchPad;16 +0005000E-10142C00;2;WUP;0001;WUP-P-AA9E;AA9E01;Art Academy: SketchPad;16 +0005000E-10143F00;4;WUP;0041;WUP-P-AJ5P;AJ5P41;JUST DANCE® 2014;16 +0005000E-10144000;2;WUP;00G9;WUP-U-ADVE;ADVEG9;Adventure Time: Explore the Dungeon Because I Don't Know!;16 +0005000E-10144800;1;WUP;0001;WUP-P-ARKJ;ARKJ01;Donkey Kong Country Tropical Freeze;17 +0005000E-10144D00;2;WUP;0001;WUP-U-AWSE;AWSE01;Wii Sports Club;16,33,48,64,80,96,112 +0005000E-10144E00;4;WUP;0001;WUP-U-AWSP;AWSP01;Wii Sports Club;16,33,48,64,80,96,112 +0005000E-10144F00;2;WUP;0001;WUP-P-AXFE;AXFE01;Super Smash Bros. for Wii U;32,48,64,80,96,112,128,144,160,176,192,208 +0005000E-10145000;4;WUP;0001;WUP-P-AXFP;AXFP01;Super Smash Bros. for Wii U;32,48,64,80,96,112,128,144,160,176,192,208 +0005000E-10145600;7;WUP;0001;WUP-U-ADBA;ADBA01;Animal Crossing Plaza;16 +0005000E-10145800;4;WUP;00UP;WUP-U-WEPP;WEPPUP;Unepic EnjoyUp Games;16,32 +0005000E-10145900;4;WUP;00HL;WUP-U-WCDP;WCDPHL;Coaster Crazy Deluxe;16 +0005000E-10145F00;1;WUP;0001;WUP-P-WMGJ;WMGJ01;NES REMIX;16 +0005000E-10146000;2;WUP;0001;WUP-P-WMGE;WMGE01;NES REMIX;16 +0005000E-10146100;4;WUP;0001;WUP-P-WMGP;WMGP01;NES REMIX;16 +0005000E-10146800;2;WUP;0052;WUP-P-ACPE;ACPE52;Call of Duty: Ghosts;16,32,48,64,80,96,112 +0005000E-10147600;4;WUP;00DZ;WUP-P-WEVP;WEVPDZ;EvoFish;17 +0005000E-10147F00;2;WUP;00YV;WUP-P-WB6E;WB6EYV;Spin the Bottle: Bumpie's Party;16,32 +0005000E-10148000;1;WUP;00AF;WUP-P-AUNJ;AUNJAF;ONE PIECE UNLIMITED WORLD R;16 +0005000E-10148200;2;WUP;00UP;WUP-U-WAEE;WAEEUP;Rock 'N Racing Off Road;16 +0005000E-10148F00;1;WUP;0041;WUP-U-WLAJ;WLAJ41;Uplay;16 +0005000E-10149200;4;WUP;00SS;WUP-U-WDFP;WDFPSS;Spot The Differences: Party!;16,32 +0005000E-10149500;2;WUP;00CS;WUP-P-WKTE;WKTECS;Scram Kitty and his Buddy on Rails;16,32 +0005000E-10149700;1;WUP;0001;WUP-P-WAUJ;WAUJ01;?? ??;34,48 +0005000E-1014C600;4;WUP;00CX;WUP-U-WGSP;WGSPCX;Giana Sisters Twisted Dreams;16 +0005000E-1014C800;1;WUP;0041;WUP-U-ASBJ;ASBJ41;Assassin's Creed® IV Black Flag;16 +0005000E-1014CB00;2;WUP;00CX;WUP-P-WGSE;WGSECX;Giana Sisters Twisted Dreams;16 +0005000E-1014CF00;2;WUP;00HL;WUP-U-WCDE;WCDEHL;Coaster Crazy Deluxe;16,32 +0005000E-1014D100;4;WUP;00CS;WUP-U-WKTP;WKTPCS;Scram Kitty and his Buddy on Rails;17,32 +0005000E-1014D900;1;WUP;008P;WUP-P-APTJ;APTJ8P;PUYOPUYOTETRIS;16,32 +0005000E-1014DA00;1;WUP;0008;WUP-U-AMFJ;AMFJ08;Monster Hunter Frontier G;80,96,112,128,144,160,176,192,208,224,240,256,288,304,320,336,352,368,400,432,448,464,480,496,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,1280,1296,1312,1328,1344,1360,1376 +0005000E-1014DE00;2;WUP;00WR;WUP-U-ALAE;ALAEWR;The LEGO® Movie Videogame;16 +0005000E-1014E000;4;WUP;00WR;WUP-U-ALAP;ALAPWR;The LEGO® Movie Videogame;18 +0005000E-1014E100;4;WUP;00AF;WUP-U-ADVP;ADVPAF;Adventure Time: Explore the Dungeon Because I Don't Know!;16 +0005000E-1014E300;4;WUP;00GT;WUP-U-AZBP;AZBPGT;Zumba Fitness World Party;16 +0005000E-10154600;1;WUP;00WR;WUP-U-AZEJ;AZEJWR;Batman™: Arkham Origins;16 +0005000E-10154D00;4;WUP;00BU;WUP-U-WC3P;WC3PBU;The Mysterious Cities of Gold: Secret Paths;16 +0005000E-10156100;4;WUP;0052;WUP-P-ACPP;ACPP52;Call of Duty: Ghosts;16,32,48,64,80,96,112 +0005000E-10156500;2;WUP;00BU;WUP-U-WC3E;WC3EBU;The Mysterious Cities of Gold: Secret Paths;16 +0005000E-10157600;4;WUP;0052;WUP-P-ACPI;ACPI52;Call of Duty: Ghosts;16,32,48,64,80,96,112 +0005000E-10157900;1;WUP;00GD;WUP-P-ACPJ;ACPJGD;Call of Duty: Ghosts;16,32,48,64,80,97,112 +0005000E-10159800;1;WUP;0001;WUP-U-AFCJ;AFCJ01;Wii Fit U (Free);48,64,81 +0005000E-10159900;2;WUP;0001;WUP-U-AFCE;AFCE01;Wii Fit U (Free);48,64,81 +0005000E-10159A00;4;WUP;0001;WUP-U-AFCP;AFCP01;Wii Fit U (promo);48,64,81 +0005000E-1015A300;1;WUP;00AF;WUP-U-ADSJ;ADSJAF;Disney INFINITY;17 +0005000E-1015B200;2;WUP;0041;WUP-P-ACLE;ACLE41;CHILD of LIGHT;16 +0005000E-1015D300;2;WUP;00AS;WUP-P-WLCE;WLCEAS;Lucadian Chronicles;32 +0005000E-1015EB00;1;WUP;00R7;WUP-U-WHYJ;WHYJR7;Mighty Switch Force!™ Hyper Drive Edition;18 +0005000E-10161F00;1;WUP;0001;WUP-U-ABAJ;ABAJ01;Mario Party 10;16 +0005000E-10162300;4;WUP;00YR;WUP-U-WCZP;WCZPYR;Color Zen;17 +0005000E-10162B00;1;WUP;0001;WUP-P-AGMJ;AGMJ01;Splatoon;16,32,48,64,80,96,112,128,144,160 +0005000E-10162D00;2;WUP;0001;WUP-U-ABAE;ABAE01;Mario Party 10;16 +0005000E-10169600;4;WUP;00UP;WUP-U-WEPS;WEPSUP;Unepic EnjoyUp Games;16,32 +0005000E-1016A200;4;WUP;00SS;WUP-U-WBXP;WBXPSS;Bombing Bastards;16 +0005000E-1016A400;4;WUP;00WR;WUP-P-BTMP;BTMPWR;LEGO® Batman™ 3 Beyond Gotham;16,32,48 +0005000E-1016A600;1;WUP;00TF;WUP-P-WB6J;WB6JTF;??????????????;17 +0005000E-1016AB00;2;WUP;00SS;WUP-U-WBXE;WBXESS;Bombing Bastards;16 +0005000E-1016AC00;2;WUP;009T;WUP-U-WMLE;WMLE9T;Armillo;16 +0005000E-1016AD00;2;WUP;00WR;WUP-P-BTME;BTMEWR;LEGO® Batman™ 3 Beyond Gotham;16,32,48 +0005000E-1016B200;2;WUP;009V;WUP-U-WMRE;WMRE9V;Master Reboot;16 +0005000E-1016C700;4;WUP;009T;WUP-U-WMLP;WMLP9T;Armillo;16 +0005000E-1016CE00;2;WUP;00YR;WUP-U-WCZE;WCZEYR;Color Zen;16 +0005000E-1016D500;4;WUP;009Y;WUP-P-WCTP;WCTP9Y;Super Toy Cars;22 +0005000E-1016D800;1;WUP;0041;WUP-P-ACLJ;ACLJ41;CHILD of LIGHT;16 +0005000E-1016DC00;2;WUP;004Q;WUP-P-ADRE;ADRE4Q;Disney Infinity [2.0];16,32,64,80 +0005000E-1016DE00;2;WUP;009Y;WUP-P-WCTE;WCTE9Y;Super Toy Cars;16 +0005000E-1016E100;2;WUP;00AY;WUP-P-WKNE;WKNEAY;Shovel Knight;16,32,48,64,80 +0005000E-1016E300;2;WUP;008S;WUP-P-WGRE;WGRE8S;GravBlocks+ From Nothing Game Studios;16 +0005000E-1016E800;4;WUP;009V;WUP-U-WMRP;WMRP9V;Master Reboot;16 +0005000E-1016EA00;4;WUP;0041;WUP-P-ACLP;ACLP41;CHILD of LIGHT;16 +0005000E-1016FF00;2;WUP;00NT;WUP-P-WFWE;WFWENT;Flowerworks HD Follie's Adventure;16 +0005000E-10170200;2;WUP;007Z;WUP-U-WGAE;WGAE7Z;Pier Solar and the Great Architects;16,33 +0005000E-10170600;1;WUP;00AF;WUP-U-APWJ;APWJAF;KAMEN RIDER BATTRIDE WAR ? PREMIUM TV&MOVIE SOUND ED.;16 +0005000E-10170700;1;WUP;00AF;WUP-U-ABWJ;ABWJAF;KAMEN RIDER BATTRIDE WAR ?;17 +0005000E-10172A00;2;WUP;009Z;WUP-N-HRLE;HRLE9Z;Crunchyroll;16 +0005000E-10172B00;4;WUP;009Z;WUP-N-HRLP;HRLP9Z;Crunchyroll;17 +0005000E-10173300;4;WUP;00UB;WUP-U-WCGP;WCGPUB;Stealth Inc 2 A Game of Clones;16,32 +0005000E-10175B00;2;WUP;008P;WUP-P-BSSE;BSSE8P;Sonic Boom: Rise of Lyric;16 +0005000E-10175D00;4;WUP;00AF;WUP-P-AUNP;AUNPAF;ONE PIECE Unlimited World Red;16 +0005000E-10176500;2;WUP;00UB;WUP-U-WCGE;WCGEUB;Stealth Inc 2 A Game of Clones;16 +0005000E-10176900;2;WUP;0001;WUP-P-AGME;AGME01;Splatoon;16,32,48,64,80,96,128,144,160 +0005000E-10176A00;4;WUP;0001;WUP-P-AGMP;AGMP01;Splatoon;32,48,64,80,96,112,128,144,160 +0005000E-10176F00;4;WUP;0041;WUP-P-BJDP;BJDP41;JUST DANCE® 2015;16 +0005000E-10177600;2;WUP;0001;WUP-U-ADNE;ADNE01;Devil's Third;16 +0005000E-10177800;4;WUP;008P;WUP-P-BSSP;BSSP8P;Sonic Boom: Rise of Lyric;16 +0005000E-10178F00;4;WUP;00AY;WUP-P-WKNP;WKNPAY;Shovel Knight;16,32,48 +0005000E-10179100;2;WUP;0041;WUP-P-BJDE;BJDE41;JUST DANCE® 2015;16 +0005000E-1017BE00;1;WUP;0001;WUP-U-BXAJ;BXAJ01;Art Academy: Home Studio;48 +0005000E-1017BF00;2;WUP;0001;WUP-U-BXAE;BXAE01;Art Academy: Home Studio;17 +0005000E-1017C600;2;WUP;0052;WUP-P-BK7E;BK7E52;Skylanders Trap Team;16 +0005000E-1017CD00;1;WUP;00C8;WUP-U-BWPJ;BWPJC8;Hyrule Warriors;32,49,64,80,98,112,113,128,144,160,176,192,208 +0005000E-1017D800;2;WUP;0001;WUP-U-BWPE;BWPE01;Hyrule Warriors;16,32,48,64,80,96,112,128 +0005000E-1017D900;4;WUP;0001;WUP-U-BWPP;BWPP01;Hyrule Warriors;16,33,48,64,80,96,112,128 +0005000E-1017DA00;2;WUP;011S;WUP-P-ACQE;ACQE1S;Costume Quest 2;16 +0005000E-1017E000;4;WUP;00XQ;WUP-P-WK8P;WK8PXQ;Turtle Tale;16 +0005000E-10180500;1;WUP;0001;WUP-P-AKBJ;AKBJ01;Captain Toad: Treasure Tracker;16 +0005000E-10180600;2;WUP;0001;WUP-P-AKBE;AKBE01;Captain Toad: Treasure Tracker;16 +0005000E-10180700;4;WUP;0001;WUP-P-AKBP;AKBP01;Captain Toad: Treasure Tracker;16 +0005000E-10181F00;4;WUP;0052;WUP-P-BK7P;BK7P52;Skylanders Trap Team;16 +0005000E-10182C00;4;WUP;00XT;WUP-U-AJTP;AJTPXT;Jett Tailfin;16 +0005000E-10183000;2;WUP;010P;WUP-P-ARNE;ARNE0P;Runbow;16,33,49 +0005000E-10183900;2;WUP;00UP;WUP-U-BMVE;BMVEUP;99Moves;16,32 +0005000E-10184D00;2;WUP;0001;WUP-U-AYCE;AYCE01;Yoshi's Woolly World;17 +0005000E-10187100;4;WUP;00LW;WUP-U-BUGP;BUGPLW;Underground;16,32 +0005000E-10188B00;1;WUP;0001;WUP-U-AXYJ;AXYJ01;Kirby and the Rainbow Curse;16 +0005000E-10188C00;4;WUP;004Q;WUP-P-ADRP;ADRP4Q;Disney Infinity [2.0];16,32,64,80 +0005000E-10188D00;4;WUP;004Q;WUP-P-ADRZ;ADRZ4Q;Disney Infinity [2.0];16,32,64,80 +0005000E-10189200;2;WUP;011C;WUP-P-BSPE;BSPE1C;Sportsball;16 +0005000E-1018C400;1;WUP;00AF;WUP-P-BSFJ;BSFJAF;???F??????????? ????SF???????????;16 +0005000E-1018D900;1;WUP;00AF;WUP-P-APHJ;APHJAF;LOST REAVERS;17 +0005000E-1018DB00;1;WUP;0001;WUP-U-AMAJ;AMAJ01;Super Mario Maker;16,32,48,64,80,96,113,128 +0005000E-1018DC00;2;WUP;0001;WUP-U-AMAE;AMAE01;Super Mario Maker;16,32,48,64,80,96,113,128 +0005000E-1018DD00;4;WUP;0001;WUP-U-AMAP;AMAP01;Super Mario Maker;32,48,64,80,96,113,128 +0005000E-1018DE00;4;WUP;00NK;WUP-U-ATCP;ATCPNK;Tetrobot and Co.;16 +0005000E-1018ED00;2;WUP;00NK;WUP-U-ATCE;ATCENK;Tetrobot and Co.;16 +0005000E-10191700;4;WUP;00UP;WUP-U-BMVP;BMVPUP;99Moves;16,32 +0005000E-10191800;4;WUP;00UP;WUP-U-WAEP;WAEPUP;Rock 'N Racing Off Road;16 +0005000E-10192200;1;WUP;00AF;WUP-P-BRSJ;BRSJAF;KAMEN RIDER SUMMON RIDE!;16,33,48,64,80 +0005000E-10194200;2;WUP;00WR;WUP-U-APZE;APZEWR;LEGO® DIMENSIONS™;16,32,48,64,80 +0005000E-10195D00;4;WUP;00WR;WUP-U-APZP;APZPWR;LEGO® DIMENSIONS™;32,48,64,80,96 +0005000E-10197800;4;WUP;011S;WUP-P-ACQP;ACQP1S;Costume Quest 2;16 +0005000E-10199000;1;WUP;0001;WUP-P-AVXJ;AVXJ01;Mario Tennis: Ultra Smash;16,32 +0005000E-1019AD00;2;WUP;011A;WUP-P-BEQE;BEQE1A;Elliot Quest;16,32,48,64,80,96 +0005000E-101A1B00;2;WUP;00RG;WUP-U-BS2E;BS2ERG;Swords & Soldiers II;16 +0005000E-101A2600;1;WUP;00W4;WUP-U-WKFJ;WKFJW4;Kung Fu Rabbit;16 +0005000E-101A2E00;1;WUP;00TF;WUP-P-WEXJ;WEXJTF;XType+;16 +0005000E-101A3500;2;WUP;0001;WUP-P-AVXE;AVXE01;Mario Tennis: Ultra Smash;16,32 +0005000E-101A3600;4;WUP;0001;WUP-P-AVXP;AVXP01;Mario Tennis: Ultra Smash;32 +0005000E-101A3B00;2;WUP;00LY;WUP-P-BLPE;BLPELY;Life of Pixel;16 +0005000E-101A4900;4;WUP;00LY;WUP-U-BLPP;BLPPLY;Life of Pixel;16 +0005000E-101A5C00;4;WUP;00WR;WUP-U-ALJP;ALJPWR;LEGO® Jurassic World™;16 +0005000E-101A5E00;4;WUP;00UB;WUP-U-ALLP;ALLPUB;OlliOlli;16 +0005000E-101A5F00;2;WUP;00WY;WUP-U-BSXE;BSXEWY;Shantae and the Pirate's Curse;16 +0005000E-101A6200;2;WUP;00WR;WUP-U-ALJE;ALJEWR;LEGO® Jurassic World™;16 +0005000E-101A6300;4;WUP;00YR;WUP-U-ACUP;ACUPYR;Cube Life: Island Survival;16 +0005000E-101A6400;2;WUP;00YR;WUP-U-ACUE;ACUEYR;Cube Life: Island Survival;16 +0005000E-101A6500;2;WUP;00VZ;WUP-P-BKFE;BKFEVZ;Kung Fu Panda Showdown of Legendary Legends;16 +0005000E-101A6900;2;WUP;00UB;WUP-P-ALLE;ALLEUB;OlliOlli;17 +0005000E-101A9500;4;WUP;00WY;WUP-U-BSXP;BSXPWY;Shantae and the Pirate's Curse;16 +0005000E-101A9F00;2;WUP;0147;WUP-P-BDAE;BDAE47;Dot Arcade;16 +0005000E-101AA200;2;WUP;014K;WUP-U-APJE;APJE4K;Vector Assault;18 +0005000E-101AA500;4;WUP;00VZ;WUP-P-BKFP;BKFPVZ;Kung Fu Panda Showdown of Legendary Legends;16,32 +0005000E-101ABC00;2;WUP;0001;WUP-U-AXYE;AXYE01;Kirby and the Rainbow Curse;16 +0005000E-101AC700;2;WUP;00VZ;WUP-P-BFNE;BFNEVZ;Adventure Time Finn and Jake Investigations;16 +0005000E-101AC900;2;WUP;004Q;WUP-P-BD3E;BD3E4Q;DISNEY INFINITY 3.0 EDITION;16,32,49 +0005000E-101AFE00;4;WUP;00VZ;WUP-P-BFNP;BFNPVZ;Adventure Time Finn and Jake Investigations;16 +0005000E-101B3D00;4;WUP;004Q;WUP-P-BD3P;BD3P4Q;DISNEY INFINITY 3.0: PLAY WITHOUT LIMITS;16,32,49 +0005000E-101B3E00;4;WUP;004Q;WUP-P-BD3Z;BD3Z4Q;DISNEY INFINITY 3.0: PLAY WITHOUT LIMITS;16,32,49 +0005000E-101B8500;2;WUP;0052;WUP-P-BS5E;BS5E52;Skylanders SuperChargers;16,32,64,80,96 +0005000E-101B9000;2;WUP;0041;WUP-P-AJ6E;AJ6E41;JUST DANCE® 2016;16,32 +0005000E-101B9800;4;WUP;0041;WUP-P-AJ6P;AJ6P41;JUST DANCE® 2016;16,32 +0005000E-101BA400;2;WUP;0052;WUP-P-AGNE;AGNE52;Guitar Hero Live;16,32,48,64 +0005000E-101BAA00;2;WUP;010C;WUP-U-ATTE;ATTE0C;Totem Topple;16 +0005000E-101BB300;4;WUP;008V;WUP-P-WLSP;WLSP8V;ZaciSa: Defense of the Crayon Dimension!;16 +0005000E-101BB800;4;WUP;011A;WUP-P-BEQP;BEQP1A;Elliot Quest;16,32,48,64,80 +0005000E-101BC600;4;WUP;0052;WUP-P-AGNP;AGNP52;Guitar Hero Live;18,32,48,64 +0005000E-101BE900;4;WUP;00WR;WUP-P-ALRP;ALRPWR;LEGO® MARVEL's Avengers;16 +0005000E-101BEF00;2;WUP;00WR;WUP-P-ALRE;ALREWR;LEGO® MARVEL's Avengers;16 +0005000E-101BFC00;4;WUP;0052;WUP-P-BS5P;BS5P52;Skylanders SuperChargers;32,48,64,80,97 +0005000E-101C0700;4;WUP;00UB;WUP-U-AN3P;AN3PUB;Nova-111;16 +0005000E-101C0A00;2;WUP;00UB;WUP-U-AN3E;AN3EUB;Nova-111;16 +0005000E-101C0B00;2;WUP;00UB;WUP-P-BS7E;BS7EUB;The Swindle;16 +0005000E-101C0C00;4;WUP;00UB;WUP-P-BS7P;BS7PUB;The Swindle;16 +0005000E-101C3100;2;WUP;0167;WUP-U-AFEE;AFEE67;Freedom Planet;17 +0005000E-101C3900;4;WUP;015G;WUP-P-AWBP;AWBP5G;Word Search by POWGI;16 +0005000E-101C4C00;4;WUP;0001;WUP-P-AX5D;AX5D01;Xenoblade Chronicles X;16 +0005000E-101C4D00;2;WUP;0001;WUP-P-AX5E;AX5E01;Xenoblade Chronicles X;16,32,48 +0005000E-101C6A00;2;WUP;016E;WUP-P-AD5E;AD5E6E;Octodad: Dadliest Catch;16 +0005000E-101C6E00;4;WUP;00RG;WUP-U-BS2P;BS2PRG;Swords & Soldiers II;16 +0005000E-101C8B00;4;WUP;00YT;WUP-P-AWMP;AWMPYT;WICKED MONSTERS BLAST! HD PLUS;16 +0005000E-101CC900;4;WUP;0167;WUP-U-AFEP;AFEP67;Freedom Planet;16 +0005000E-101CE100;2;WUP;0175;WUP-U-ACHE;ACHE75;Canvaleon;16,32 +0005000E-101D0700;4;WUP;0175;WUP-U-ACHP;ACHP75;Canvaleon;16,32 +0005000E-101D0900;2;WUP;00FV;WUP-U-AGWE;AGWEFV;Gunman Clive HD Collection;16 +0005000E-101D2C00;1;WUP;00SA;WUP-P-ATXJ;ATXJSA;Bike Rider UltraDX WORLD TOUR;16,32 +0005000E-101D3000;1;WUP;00AF;WUP-P-BT3J;BT3JAF;Taiko no Tatsujin Atsumete? TomodachiDaisakusen!;16 +0005000E-101D3900;4;WUP;017D;WUP-P-AQCP;AQCP7D;The Quiet Collection;16 +0005000E-101D4200;2;WUP;00DV;WUP-P-ABPE;ABPEDV;Brunswick Pro Bowling;16 +0005000E-101D6100;4;WUP;00FV;WUP-U-AGWP;AGWPFV;Gunman Clive HD Collection;16 +0005000E-101D6D00;4;WUP;010P;WUP-P-ARNP;ARNP0P;Runbow;17,33 +0005000E-101D7400;4;WUP;010C;WUP-U-ATTP;ATTP0C;Totem Topple;16 +0005000E-101D7500;4;WUP;00DU;WUP-P-AUMP;AUMPDU;Minecraft: Wii U Edition;16,32,48 +0005000E-101D8300;4;WUP;00TJ;WUP-U-AEJP;AEJPTJ;Electronic Super Joy;16 +0005000E-101D9D00;2;WUP;00DU;WUP-P-AUME;AUMEDU;Minecraft: Wii U Edition;16,32,48 +0005000E-101DBE00;1;WUP;0188;WUP-P-AUMJ;AUMJ88;Minecraft: Wii U Edition;16,32,48 +0005000E-101DC100;4;WUP;016E;WUP-P-AD5P;AD5P6E;Octodad: Dadliest Catch;16 +0005000E-101DD700;1;WUP;013P;WUP-P-ARNJ;ARNJ3P;Runbow;16,17 +0005000E-101DDC00;1;WUP;00AF;WUP-P-BD3J;BD3JAF;????????????3.0;17,33 diff --git a/src/de/mas/jnustool/Content.java b/src/de/mas/jnustool/Content.java index 8fd28ca..414b6c9 100644 --- a/src/de/mas/jnustool/Content.java +++ b/src/de/mas/jnustool/Content.java @@ -1,5 +1,11 @@ package de.mas.jnustool; +import java.io.File; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; + +import de.mas.jnustool.util.Downloader; +import de.mas.jnustool.util.Settings; import de.mas.jnustool.util.Util; public class Content { @@ -9,17 +15,50 @@ public class Content { short type; // 6 0xB0A long size; // 8 0xB0C byte[] SHA2 = new byte[32]; // 16 0xB14 + TitleMetaData tmd; + AtomicInteger error_output_done = new AtomicInteger(0);// 16 0xB14 - public Content(int ID, short index, short type, long size, byte[] SHA2) { + public Content(int ID, short index, short type, long size, byte[] SHA2,TitleMetaData tmd) { this.ID = ID; this.index = index; this.type = type; this.size = size; this.SHA2 = SHA2; + this.tmd = tmd; } @Override public String toString(){ return "ID: " + ID +" index: " + index + " type: " + type + " size: " + size + " SHA2: " + Util.ByteArrayToString(SHA2); } + + public void download(Progress progress) throws IOException{ + String tmpPath = tmd.getContentPath(); + if ((type & 0x02) == 0x02){ + Downloader.getInstance().downloadContentH3(tmd.titleID,ID,tmpPath,null); + } + File f = new File(tmpPath + "/" + String.format("%08X", ID ) + ".app"); + if(f.exists()){ + if(f.length() == size){ + Logger.log("Skipping Content: " + String.format("%08X", ID)); + progress.addCurrent((int) size); + }else{ + if(Settings.downloadWhenCachedFilesMissingOrBroken){ + Logger.log("Content " +String.format("%08X", ID) + " is broken. Downloading it again."); + Downloader.getInstance().downloadContent(tmd.titleID,ID,tmpPath,progress); + }else{ + if(Settings.skipBrokenFiles){ + Logger.log("Content " +String.format("%08X", ID) + " is broken. Ignoring it."); + }else{ + Logger.log("Content " +String.format("%08X", ID) + " is broken. Downloading not allowed."); + System.exit(2); + } + } + } + }else{ + Logger.log("Download Content: " + String.format("%08X", ID)); + Downloader.getInstance().downloadContent(tmd.titleID,ID,tmpPath,progress); + } + + } } diff --git a/src/de/mas/jnustool/ContentDownloader.java b/src/de/mas/jnustool/ContentDownloader.java new file mode 100644 index 0000000..7f36a3b --- /dev/null +++ b/src/de/mas/jnustool/ContentDownloader.java @@ -0,0 +1,32 @@ +package de.mas.jnustool; + +import java.util.concurrent.Callable; + +public class ContentDownloader implements Callable +{ + Content c; + Progress progress = null; + public void setContent(Content c){ + this.c = c; + } + public ContentDownloader(Content f,Progress fatherProgress){ + setContent(f); + createProgress(fatherProgress); + } + + private void createProgress(Progress fatherProgress) { + if(fatherProgress != null){ + progress = new Progress(); + fatherProgress.add(progress); + progress.addTotal(c.size); + + } + } + + @Override + public Integer call() throws Exception { + c.download(progress); + return null; + } + +} diff --git a/src/de/mas/jnustool/FEntry.java b/src/de/mas/jnustool/FEntry.java index 3c8fe49..0637fd9 100644 --- a/src/de/mas/jnustool/FEntry.java +++ b/src/de/mas/jnustool/FEntry.java @@ -7,6 +7,7 @@ import java.util.List; import de.mas.jnustool.util.Decryption; import de.mas.jnustool.util.Downloader; import de.mas.jnustool.util.Settings; +import de.mas.jnustool.util.Util; public class FEntry { private FST fst; @@ -125,28 +126,11 @@ public class FEntry { NUScontentID = nUScontentID; } - private void createFolder() { - long titleID = getTitleID(); - String [] path = getFullPath().split("/"); - File f = new File (String.format("%016X", titleID)); - if(!f.exists())f.mkdir(); - - String folder = String.format("%016X", titleID) +"/"; - File folder_ = null; - for(int i = 0;i private void createProgressListener(Progress fatherProgress) { if(fatherProgress != null){ progress = new Progress(); - progress.setTotal(f.getFileLength()); - fatherProgress.add(progress); + fatherProgress.add(progress); + progress.addTotal(f.getFileLength()); + } } @Override diff --git a/src/de/mas/jnustool/FST.java b/src/de/mas/jnustool/FST.java index 5fb7b89..969ae95 100644 --- a/src/de/mas/jnustool/FST.java +++ b/src/de/mas/jnustool/FST.java @@ -30,8 +30,7 @@ public class FST { buildDirectories(); } - private void buildDirectories() { - + private void buildDirectories() { String contentfolder = ""; Directory curContent = contentDirectory; for(FEntry f : getFileEntries()){ @@ -60,8 +59,7 @@ public class FST { } if(i==f.getPathList().size()){ curContent.addFile(f); - } - + } //FST if(current.containsFolder(s)){ @@ -77,12 +75,7 @@ public class FST { } } } - - - } - - private void parse(byte[] decrypteddata, TitleMetaData tmd) throws IOException { @@ -120,8 +113,7 @@ public class FST { { level--; } - } - + } int offset = base_offset + i*0x10; @@ -216,64 +208,52 @@ public class FST { //Logger.log(fileEntries.get(i)); } - } - - + } public long getTotalContentSize() { return totalContentSize; } - public void setTotalContentSize(long totalContentSize) { this.totalContentSize = totalContentSize; } - public long getTotalContentSizeInNUS() { return totalContentSizeInNUS; } - public void setTotalContentSizeInNUS(long totalContentSizeInNUS) { this.totalContentSizeInNUS = totalContentSizeInNUS; } public List getMetaFolder() { return metaFolder; - } - + } public List getFileEntries() { return fileEntries; } - public void setFileEntries(List fileEntries) { this.fileEntries = fileEntries; } - public int getTotalContentCount() { return totalContentCount; } - public void setTotalContentCount(int totalContentCount) { this.totalContentCount = totalContentCount; } - public int getTotalEntries() { return totalEntries; } - public void setTotalEntries(int totalEntries) { this.totalEntries = totalEntries; } - public int getDirEntries() { return dirEntries; } @@ -283,13 +263,11 @@ public class FST { this.dirEntries = dirEntries; } - @Override public String toString(){ return "entryCount: " + totalContentCount+ " entries: " + totalEntries; } - public int getFileCount() { int i = 0; for(FEntry f: getFileEntries()){ @@ -315,8 +293,6 @@ public class FST { public Directory getContentDirectory() { return contentDirectory; } - - public TitleMetaData getTmd() { return tmd; diff --git a/src/de/mas/jnustool/Logger.java b/src/de/mas/jnustool/Logger.java index d0046f9..324cc0b 100644 --- a/src/de/mas/jnustool/Logger.java +++ b/src/de/mas/jnustool/Logger.java @@ -10,7 +10,7 @@ public class Logger { public static void log(String string) { NUSGUI.output.append(string + "\n"); NUSGUI.output.setCaretPosition(NUSGUI.output.getDocument().getLength()); - //System.out.println(string); + System.out.println(string); } diff --git a/src/de/mas/jnustool/NUSTitle.java b/src/de/mas/jnustool/NUSTitle.java index f66e8a7..bedca66 100644 --- a/src/de/mas/jnustool/NUSTitle.java +++ b/src/de/mas/jnustool/NUSTitle.java @@ -1,7 +1,10 @@ package de.mas.jnustool; +import java.io.ByteArrayInputStream; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -9,18 +12,39 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + import de.mas.jnustool.util.Decryption; import de.mas.jnustool.util.Downloader; +import de.mas.jnustool.util.NUSTitleInformation; import de.mas.jnustool.util.Settings; +import de.mas.jnustool.util.Util; public class NUSTitle { private TitleMetaData tmd; private TIK ticket; private FST fst; private long titleID; - public NUSTitle(long titleId,String key) { + private String targetPath = new String(); + private String longNameFolder = new String(); + private int version = -1; + + private String getTMDName(){ + String result = "title.tmd"; + + return result; + } + + public NUSTitle(long titleId,int version, String key) { + setVersion(version); setTitleID(titleId); - try { + try { + /* if(Settings.downloadContent){ File f = new File(getContentPath()); if(!f.exists())f.mkdir(); @@ -28,26 +52,27 @@ public class NUSTitle { if(Settings.downloadContent){ - File f = new File(getContentPath() + "/" + "tmd"); + File f = new File(getContentPath() + "/" + getTMDName()); if(!(f.exists() && Settings.skipExistingTMDTICKET)){ Logger.log("Downloading TMD"); Downloader.getInstance().downloadTMD(titleId,getContentPath()); }else{ Logger.log("Skipped download of TMD. Already existing"); } + f = new File(getContentPath() + "/" + "cetk"); if(!(f.exists() && Settings.skipExistingTMDTICKET)){ if(key == null){ - System.out.print("Downloading Ticket"); + Logger.log("Downloading Ticket"); Downloader.getInstance().downloadTicket(titleId,getContentPath()); } }else{ Logger.log("Skipped download of ticket. Already existing"); } - } + }*/ if(Settings.useCachedFiles){ - File f = new File(getContentPath() + "/" + "tmd"); + File f = new File(getContentPath() + "/" + getTMDName()); if(f.exists()){ Logger.log("Using cached TMD."); tmd = new TitleMetaData(f); @@ -58,7 +83,7 @@ public class NUSTitle { if(tmd == null){ if(Settings.downloadWhenCachedFilesMissingOrBroken){ if(Settings.useCachedFiles) Logger.log("Getting missing tmd from Server!"); - tmd = new TitleMetaData(Downloader.getInstance().downloadTMDToByteArray(titleId)); + tmd = new TitleMetaData(Downloader.getInstance().downloadTMDToByteArray(titleId,this.version)); }else{ Logger.log("Downloading of missing files is not enabled. Exiting"); System.exit(2); @@ -69,7 +94,7 @@ public class NUSTitle { ticket = new TIK(key,titleId); }else{ if(Settings.useCachedFiles){ - File f = new File(getContentPath() + "/" + "cetk"); + File f = new File(getContentPath() + "/" + "title.tik"); if(f.exists()){ Logger.log("Using cached cetk."); ticket = new TIK(f,titleId); @@ -88,27 +113,25 @@ public class NUSTitle { } } - if(Settings.downloadContent){ + /*if(Settings.downloadContent){ File f = new File(getContentPath() + "/" + String.format("%08x", tmd.contents[0].ID) + ".app"); if(!(f.exists() && Settings.skipExistingFiles)){ Logger.log("Downloading FST (" + String.format("%08x", tmd.contents[0].ID) + ")"); - Downloader.getInstance().downloadContent(titleId,tmd.contents[0].ID,getContentPath()); + Downloader.getInstance().downloadContent(titleId,tmd.contents[0].ID,getContentPath(),null); }else{ if(f.length() != tmd.contents[0].size){ if(Settings.downloadWhenCachedFilesMissingOrBroken){ Logger.log("FST already existing, but broken. Downloading it again."); - Downloader.getInstance().downloadContent(titleId,tmd.contents[0].ID,getContentPath()); + Downloader.getInstance().downloadContent(titleId,tmd.contents[0].ID,getContentPath(),null); }else{ Logger.log("FST already existing, but broken. No download allowed."); System.exit(2); } }else{ Logger.log("Skipped download of FST. Already existing"); - } - + } } - - } + }*/ Decryption decryption = new Decryption(ticket.getDecryptedKey(),0); @@ -140,16 +163,33 @@ public class NUSTitle { byte[] decryptedFST = decryption.decrypt(encryptedFST); fst = new FST(decryptedFST,tmd); + tmd.setNUSTitle(this); - if(Settings.downloadContent){ - tmd.downloadContents(); + setTargetPath(String.format("%016X", getTitleID())); + + setLongNameFolder(String.format("%016X", getTitleID())); + + if(tmd.isUpdate()){ + byte[] metaxml = fst.metaFENtry.downloadAsByteArray(); + if(metaxml != null){ + InputStream bis = new ByteArrayInputStream(metaxml); + NUSTitleInformation nusinfo = readMeta(bis); + String folder = nusinfo.getLongnameEN() + " [" + nusinfo.getID6() + "]"; + String subfolder = "/" + "updates" + "/" + "v" + tmd.titleVersion; + setTargetPath(folder + subfolder); + setLongNameFolder(folder); + } + } + + if(Settings.downloadContent){ + downloadEncryptedFiles(null); } Logger.log("Total Size of Content Files: " + ((int)((getTotalContentSize()/1024.0/1024.0)*100))/100.0 +" MB"); Logger.log("Total Size of Decrypted Files: " + ((int)((fst.getTotalContentSizeInNUS()/1024.0/1024.0)*100))/100.0 +" MB"); Logger.log("Entries: " + fst.getTotalEntries()); - Logger.log("Entries: " + fst.getFileCount()); + Logger.log("Files: " + fst.getFileCount()); Logger.log("Files in NUSTitle: " + fst.getFileCountInNUS()); } catch (IOException e) { @@ -157,11 +197,52 @@ public class NUSTitle { e.printStackTrace(); } } - - - - + public void downloadEncryptedFiles(Progress progress) throws IOException { + Util.createSubfolder(getContentPath()); + + Downloader.getInstance().downloadTMD(titleID,version,getContentPath()); + Downloader.getInstance().downloadTicket(titleID,getContentPath()); + + tmd.downloadContents(progress); + + FileOutputStream fos = new FileOutputStream(getContentPath() +"/title.cert"); + fos.write(ticket.cert0); + fos.write(tmd.cert); + fos.write(ticket.cert1); + fos.close(); + } + + NUSTitleInformation readMeta(InputStream bis) { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder; + + String ID6 = null; + try { + builder = factory.newDocumentBuilder(); + Document document = builder.parse(bis); + String proc = document.getElementsByTagName("product_code").item(0).getTextContent().toString(); + String comp = document.getElementsByTagName("company_code").item(0).getTextContent().toString(); + String title_id = document.getElementsByTagName("title_id").item(0).getTextContent().toString(); + + String longname = document.getElementsByTagName("longname_en").item(0).getTextContent().toString(); + longname = longname.replace("\n", " "); + String id = proc.substring(proc.length()-4, proc.length()); + comp = comp.substring(comp.length()-2, comp.length()); + ID6 = id+comp; + String company_code = document.getElementsByTagName("company_code").item(0).getTextContent().toString(); + String content_platform = document.getElementsByTagName("content_platform").item(0).getTextContent().toString(); + String region = document.getElementsByTagName("region").item(0).getTextContent().toString(); + NUSTitleInformation nusinfo = new NUSTitleInformation(Util.StringToLong(title_id),longname,ID6,proc,content_platform,company_code,Integer.parseInt(region),new String[1]); + return nusinfo; + + } catch (ParserConfigurationException | SAXException | IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + + } public FST getFst() { return fst; @@ -170,7 +251,6 @@ public class NUSTitle { public void setFst(FST fst) { this.fst = fst; } - public TitleMetaData getTmd() { return tmd; @@ -184,8 +264,6 @@ public class NUSTitle { return ticket; } - - public void setTicket(TIK ticket) { this.ticket = ticket; } @@ -194,18 +272,18 @@ public class NUSTitle { return tmd.getTotalContentSize(); } - - public String getContentPath() { - return getContentPathPrefix() + String.format("%016X", getTitleID()); + String result = getContentPathPrefix() + String.format("%016X", getTitleID()); + if(version > 0){ + result += "_v" + version; + } + return result; } public String getContentPathPrefix() { return "tmp_"; } - - public long getTitleID() { return titleID; } @@ -215,6 +293,8 @@ public class NUSTitle { } public void decryptFEntries(List list,Progress progress) { + Util.createSubfolder(getTargetPath()); + //progress = null; ForkJoinPool pool = ForkJoinPool.commonPool(); List dlList = new ArrayList<>(); for(FEntry f : list){ @@ -225,6 +305,32 @@ public class NUSTitle { pool.invokeAll(dlList); Logger.log("Done!"); } + + public void setTargetPath(String path){ + path = path.replaceAll("[:\\\\*?|<>]", ""); + this.targetPath = path; + } + + public String getTargetPath() { + return this.targetPath; + } + + public String getLongNameFolder() { + return longNameFolder; + } + + public void setLongNameFolder(String path) { + path = path.replaceAll("[:\\\\*?|<>]", ""); + longNameFolder = path; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } diff --git a/src/de/mas/jnustool/Progress.java b/src/de/mas/jnustool/Progress.java index 0ff2f98..d840660 100644 --- a/src/de/mas/jnustool/Progress.java +++ b/src/de/mas/jnustool/Progress.java @@ -2,42 +2,63 @@ package de.mas.jnustool; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicLong; public class Progress { - private long total; - private long current; + private AtomicLong total = new AtomicLong(); + private AtomicLong current = new AtomicLong(); private ProgressUpdateListener progressUpdateListener = null; List children = new ArrayList<>(); Progress father = null; + private AtomicLong totalChildren = new AtomicLong(); + private AtomicLong currentChildren = new AtomicLong(); public long getTotalOfSingle() { - return total; + return total.get(); } - - public void setTotal(long total) { - this.total = total; + + private void setTotalOfSingle(long total) { + this.total.set(total); } public long getCurrentOfSingle() { - return current; + return current.get(); } - public void setCurrent(long current) { - this.current = current; + private void setCurrent(long current) { + this.current.set(current); update(); } - - public void addCurrent(int i) { - if(this.current + i > getTotalOfSingle()){ - setCurrent(getTotalOfSingle()); - }else{ - setCurrent(getCurrent() + i); - } + + public void addTotal(long i) { + setTotalOfSingle(getTotalOfSingle() + i); + if(father != null) father.addTotalChildren(i); + } + + private void addCurrentChildren(long i) { + if(father != null) father.addCurrentChildren(i); + this.currentChildren.addAndGet(i); } + private void addTotalChildren(long i) { + if(father != null){ + father.addTotalChildren(i); + } + this.totalChildren.addAndGet(i); + } + + public void addCurrent(int i) { + if(this.current.get() + i > getTotalOfSingle()){ + setCurrent(getTotalOfSingle()); + }else{ + setCurrent(getCurrentOfSingle() + i); + if(father != null) father.addCurrentChildren(i); + } + } + private void update() { if(father != null) father.update(); @@ -48,40 +69,47 @@ public class Progress { public void add(Progress progress) { progress.setFather(this); + addChildrenTotal(progress.getTotalOfSingle()); children.add(progress); } + private void addChildrenTotal(long totalOfSingle) { + this.totalChildren.addAndGet(totalOfSingle); + } + private void setFather(Progress progressListener) { this.father = progressListener; } public long getCurrent() { - long tmp = getCurrentOfSingle(); - for(Progress p : children){ - tmp +=p.getCurrent(); - } - return tmp; + return this.currentChildren.get() + this.current.get(); } - public long getTotal() { - long tmp = getTotalOfSingle(); - for(Progress p : children){ - tmp +=p.getTotal(); - } - return tmp; + + public long getTotal() { + return this.totalChildren.get() + this.total.get(); } + + public void setTotal(long total) { + this.total.set(total); + } + + public void setProgressUpdateListener(ProgressUpdateListener progressUpdateListener) { this.progressUpdateListener = progressUpdateListener; } public void clear() { - setCurrent(0); - setTotal(0); + current.set(0); + currentChildren.set(0); + total.set(0); + totalChildren.set(0); + father = null; children = new ArrayList<>(); } - public int statusInPercent() { + public int statusInPercent() { return (int) ((getCurrent()*1.0)/(getTotal()*1.0)*100); } @@ -101,5 +129,11 @@ public class Progress { public boolean isInProgress(){ return inprogress; } + + public void resetCurrent() { + while(getCurrentOfSingle() > 0){ + addCurrent((int)getCurrentOfSingle() * (-1)); + } + } } diff --git a/src/de/mas/jnustool/Starter.java b/src/de/mas/jnustool/Starter.java index dacd427..7bf3686 100644 --- a/src/de/mas/jnustool/Starter.java +++ b/src/de/mas/jnustool/Starter.java @@ -21,12 +21,12 @@ public class Starter { private static String updateCSVPath; - public static void main(String[] args) { - Logger.log("JNUSTool 0.0.4 - pre alpha - by Maschell"); + public static void main(String[] args) { + + Logger.log("JNUSTool 0.0.5 - alpha - by Maschell"); Logger.log(""); try { readConfig(); - } catch (IOException e) { System.err.println("Error while reading config! Needs to be:"); System.err.println("DOWNLOAD URL BASE"); @@ -42,7 +42,7 @@ public class Starter { key = args[1].substring(0, 32); } if(titleID != 0){ - NUSGUI m = new NUSGUI(new NUSTitle(titleID, key)); + NUSGUI m = new NUSGUI(new NUSTitle(titleID,-1, key)); m.setVisible(true); } }else{ @@ -53,16 +53,12 @@ public class Starter { @Override public void run() { - NUSGUI m = new NUSGUI(new NUSTitle(tID, null)); - m.setVisible(true); - + NUSGUI m = new NUSGUI(new NUSTitle(tID,nus.getSelectedVersion(), null)); + m.setVisible(true); } }).start();; - } - + } } - - } @@ -100,9 +96,9 @@ public class Starter { String line; while((line = in.readLine()) != null){ String[] infos = line.split(";"); - if(infos.length != 7) { + if(infos.length != 8) { Logger.messageBox("Updatelist is broken!"); - System.out.println("Updatelist is broken!"); + Logger.log("Updatelist is broken!"); return null; } long titleID = Util.StringToLong(infos[0].replace("-", "")); @@ -112,7 +108,9 @@ public class Starter { String product_code = infos[4]; String ID6 = infos[5]; String longnameEN = infos[6]; - NUSTitleInformation info = new NUSTitleInformation(titleID, longnameEN, ID6, product_code, content_platform, company_code, region); + String[] versions = infos[7].split(","); + NUSTitleInformation info = new NUSTitleInformation(titleID, longnameEN, ID6, product_code, content_platform, company_code, region,versions); + list.add(info); } in.close(); @@ -122,7 +120,7 @@ public class Starter { } catch (IOException e1) { } Logger.messageBox("Updatelist is broken or missing"); - System.out.println("Updatelist is broken!"); + Logger.log("Updatelist is broken!"); return null; } return list; @@ -136,7 +134,7 @@ public class Starter { String commonkey = in.readLine(); if(commonkey.length() != 32){ Logger.messageBox("CommonKey length is wrong"); - System.out.println("Commonkey length is wrong"); + Logger.log("Commonkey length is wrong"); System.exit(1); } Util.commonKey = Util.hexStringToByteArray(commonkey); @@ -145,20 +143,37 @@ public class Starter { } - + public static boolean deleteFolder(File element) { + if (element.isDirectory()) { + for (File sub : element.listFiles()) { + if(sub.isFile()){ + return false; + } + } + for (File sub : element.listFiles()) { + if(!deleteFolder(sub)) return false; + } + } + element.delete(); + return true; + } public static void downloadMeta(List output_, Progress totalProgress) { ForkJoinPool pool = ForkJoinPool.commonPool(); List> list = new ArrayList<>(); + for(NUSTitleInformation nus : output_){ final long tID = nus.getTitleID(); list.add(pool.submit(new Callable(){ @Override - public Boolean call() throws Exception { - NUSTitle nus = new NUSTitle(tID, null); + public Boolean call() throws Exception { + NUSTitle nusa = new NUSTitle(tID,nus.getSelectedVersion(),Util.ByteArrayToString(nus.getKey())); Progress childProgress = new Progress(); + totalProgress.add(childProgress); - nus.decryptFEntries(nus.getFst().getMetaFolder(),childProgress); + deleteFolder(new File(nusa.getLongNameFolder() + "/updates")); + nusa.setTargetPath(nusa.getLongNameFolder()); + nusa.decryptFEntries(nusa.getFst().getMetaFolder(),childProgress); return true; } })); @@ -176,4 +191,36 @@ public class Starter { } } + public static void downloadEncrypted(List output_, Progress progress) { + ForkJoinPool pool = ForkJoinPool.commonPool(); + List> list = new ArrayList<>(); + + for(NUSTitleInformation nus : output_){ + final long tID = nus.getTitleID(); + list.add(pool.submit(new Callable(){ + @Override + public Boolean call() throws Exception { + NUSTitle nusa = new NUSTitle(tID,nus.getSelectedVersion(), Util.ByteArrayToString(nus.getKey())); + Progress childProgress = new Progress(); + progress.add(childProgress); + nusa.downloadEncryptedFiles(progress); + + return true; + } + })); + } + for(ForkJoinTask task : list){ + try { + task.get(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ExecutionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + } + } diff --git a/src/de/mas/jnustool/TIK.java b/src/de/mas/jnustool/TIK.java index 76c0aed..c51b95a 100644 --- a/src/de/mas/jnustool/TIK.java +++ b/src/de/mas/jnustool/TIK.java @@ -3,6 +3,7 @@ package de.mas.jnustool; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.util.Arrays; import de.mas.jnustool.util.Decryption; import de.mas.jnustool.util.Util; @@ -12,6 +13,9 @@ public class TIK { private byte[] encryptedKey = new byte[16]; private byte[] decryptedKey = new byte[16]; + public byte[] cert0 = new byte[0x400]; + public byte[] cert1 = new byte[0x300]; + public TIK(File cetk,long titleid) throws IOException{ parse(cetk); calculateDecryptedKey(titleid); @@ -33,14 +37,29 @@ public class TIK { decryptedKey = decryption.decrypt(encryptedKey); } - private void parse(byte[] cetk) throws IOException { - System.arraycopy(cetk, 0x1bf, this.encryptedKey, 0,16); + private void parse(byte[] cetk) throws IOException { + if(cetk != null){ + System.arraycopy(cetk, 0x1bf, this.encryptedKey, 0,16); + if(cetk.length >= 0x650 + 0x400){ + cert0 = Arrays.copyOfRange(cetk, 0x650, 0x650 + 0x400); + cert1 = Arrays.copyOfRange(cetk, 0x350, 0x350 + 0x300); + }else{ + Logger.log("No certs for TIK found. File too short!"); + } + } + } private void parse(File cetk) throws IOException { RandomAccessFile f = new RandomAccessFile(cetk, "r"); f.seek(0x1bf); - f.read(this.encryptedKey, 0, 16); + f.read(this.encryptedKey, 0, 16); + + f.seek(0x650); + f.read(cert0, 0, 0x400); + f.seek(0x350); + f.read(cert1, 0, 0x300); + f.close(); } @@ -66,6 +85,9 @@ public class TIK { @Override public String toString(){ - return "encrypted key: " + Util.ByteArrayToString(encryptedKey)+ " decrypted key: " + Util.ByteArrayToString(decryptedKey); + String result = "Encrypted key: " + Util.ByteArrayToString(encryptedKey)+ " Decrypted key: " + Util.ByteArrayToString(decryptedKey) + "\n"; + result += "cert0:" + Util.ByteArrayToString(cert0) + "\n"; + result += "cert1:" + Util.ByteArrayToString(cert1) + "\n"; + return result; } } diff --git a/src/de/mas/jnustool/TitleMetaData.java b/src/de/mas/jnustool/TitleMetaData.java index d8320e2..e38c9d6 100644 --- a/src/de/mas/jnustool/TitleMetaData.java +++ b/src/de/mas/jnustool/TitleMetaData.java @@ -4,9 +4,10 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ForkJoinPool; -import de.mas.jnustool.util.Downloader; -import de.mas.jnustool.util.Settings; import de.mas.jnustool.util.Util; public class TitleMetaData { @@ -28,8 +29,8 @@ public class TitleMetaData { byte[] SHA2 = new byte[32]; // 0x1E4 ContentInfo[] contentInfos = new ContentInfo[64]; // 0x1E4 Content[] contents; // 0x1E4 - - + byte[] cert = new byte[0x300]; + private NUSTitle nus; private long totalContentSize; @@ -112,8 +113,12 @@ public class TitleMetaData { byte[] buffer = new byte[0x20]; // 16 0xB14 f.read(buffer,0, 0x20); - this.contents[i] = new Content(ID,index,type,size,buffer); - } + this.contents[i] = new Content(ID,index,type,size,buffer,this); + } + + if(f.read(cert,0, 0x300) != 0x300){ + Logger.log("Error reading TMD cert"); + } f.close(); } @@ -136,6 +141,7 @@ public class TitleMetaData { sb.append("contentCount: " + contentCount +"\n"); sb.append("bootIndex: " + bootIndex +"\n"); sb.append("SHA2: " + Util.ByteArrayToString(SHA2) +"\n"); + sb.append("cert: " + Util.ByteArrayToString(cert) +"\n"); sb.append("contentInfos: \n"); for(int i = 0; i dlList = new ArrayList<>(); for(Content c : contents){ - if(c != contents[0]){ - f = new File(tmpPath + "/" + String.format("%08X", c.ID ) + ".app"); - if(f.exists()){ - if(f.length() == c.size){ - Logger.log("Skipping Content: " + String.format("%08X", c.ID)); - }else{ - if(Settings.downloadWhenCachedFilesMissingOrBroken){ - Logger.log("Content " +String.format("%08X", c.ID) + " is broken. Downloading it again."); - Downloader.getInstance().downloadContent(titleID,c.ID,tmpPath); - }else{ - if(Settings.skipBrokenFiles){ - Logger.log("Content " +String.format("%08X", c.ID) + " is broken. Ignoring it."); - }else{ - Logger.log("Content " +String.format("%08X", c.ID) + " is broken. Downloading not allowed."); - System.exit(2); - } - } - } - }else{ - Logger.log("Download Content: " + String.format("%08X", c.ID)); - Downloader.getInstance().downloadContent(titleID,c.ID,tmpPath); - } - } + dlList.add(new ContentDownloader(c,progress)); } + pool.invokeAll(dlList); + Logger.log("Done!"); } diff --git a/src/de/mas/jnustool/gui/NUSGUI.java b/src/de/mas/jnustool/gui/NUSGUI.java index e82b319..2334f77 100644 --- a/src/de/mas/jnustool/gui/NUSGUI.java +++ b/src/de/mas/jnustool/gui/NUSGUI.java @@ -9,6 +9,7 @@ import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; +import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; @@ -22,8 +23,6 @@ import de.mas.jnustool.NUSTitle; import de.mas.jnustool.Progress; import de.mas.jnustool.ProgressUpdateListener; -import javax.swing.JProgressBar; - public class NUSGUI extends JFrame { private static final long serialVersionUID = 4648172894076113183L; diff --git a/src/de/mas/jnustool/gui/UpdateChooser.java b/src/de/mas/jnustool/gui/UpdateChooser.java index 9f063ae..1b2b3df 100644 --- a/src/de/mas/jnustool/gui/UpdateChooser.java +++ b/src/de/mas/jnustool/gui/UpdateChooser.java @@ -1,31 +1,42 @@ package de.mas.jnustool.gui; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Collections; +import java.util.EventObject; +import java.util.HashMap; +import java.util.Hashtable; import java.util.List; +import java.util.Map.Entry; import javax.swing.BorderFactory; import javax.swing.BoxLayout; +import javax.swing.DefaultCellEditor; import javax.swing.JButton; +import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextArea; +import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; +import javax.swing.event.CellEditorListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import javax.swing.table.TableCellEditor; import de.mas.jnustool.Logger; import de.mas.jnustool.Progress; @@ -45,25 +56,50 @@ public class UpdateChooser extends JPanel { ListSelectionModel listSelectionModel; public UpdateChooser(JFrame window) { super(new BorderLayout()); - setSize(800, 600); + setSize(800, 650); Collections.sort(list_); output_.add(list_.get(0)); - String[] columnNames = { "TitleID", "Region", "Name" }; + String[] columnNames = { "TitleID", "Region", "Name","version"}; String[][] tableData = new String[list_.size()][]; int i = 0; + HashMap> comboboxes = new HashMap<>(); for(NUSTitleInformation n: list_){ - tableData[i] = new String[3]; + tableData[i] = new String[4]; tableData[i][0] = n.getTitleIDAsString(); tableData[i][1] = n.getRegionAsRegion().toString(); tableData[i][2] = n.getLongnameEN(); - i++; + tableData[i][3] = n.getLatestVersion(); + + JComboBox comboBox = new JComboBox<>(); + for(String v : n.getAllVersions()){ + comboBox.addItem(v); + } + final int position = i; + comboBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + list_.get(position).setSelectedVersion((String) e.getItem()); + } + }); + comboboxes.put(i,comboBox); + + i++; } table = new JTable(tableData, columnNames); + + EachRowEditor rowEditor = new EachRowEditor(table); + + for (Entry> entry : comboboxes.entrySet()) + { + rowEditor.setEditorAt(entry.getKey(), new DefaultCellEditor(entry.getValue())); + } + + + table.getColumn("version").setCellEditor(rowEditor); //table.setModel(tableModel); @@ -85,16 +121,7 @@ public class UpdateChooser extends JPanel { table.setSelectionModel(listSelectionModel); - table.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent me) { - if (me.getClickCount() == 2) { - synchronized (output_) { - window.setVisible(false); - output_.notifyAll(); - } - } - } - }); + JScrollPane tablePane = new JScrollPane(table); //Build control area (use default FlowLayout). @@ -141,6 +168,7 @@ public class UpdateChooser extends JPanel { progressBar.setStringPainted(true); JButton btnDownloadMeta = new JButton("Download META"); + JButton btnDownloadEncrypted = new JButton("Download Enctrypted"); JProgressBar progressBar_1 = new JProgressBar(); panel.add(progressBar_1); progressBar_1.setValue(0); @@ -153,6 +181,7 @@ public class UpdateChooser extends JPanel { } }); + btnDownloadMeta.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(!progress.isInProgress()){ @@ -161,6 +190,8 @@ public class UpdateChooser extends JPanel { new Thread(new Runnable(){ @Override public void run() { + progressBar_1.setValue(0); + progress.clear(); Starter.downloadMeta(output_,progress); progress.operationFinish(); Logger.messageBox("Finished"); @@ -175,15 +206,54 @@ public class UpdateChooser extends JPanel { }); panel.add(btnDownloadMeta); - - btnNewButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - synchronized (output_) { - window.setVisible(false); - output_.notifyAll(); - } + btnDownloadEncrypted.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(!progress.isInProgress()){ + progress.clear(); + progress.operationStart(); + new Thread(new Runnable(){ + @Override + public void run() { + progressBar_1.setValue(0); + progress.clear(); + Starter.downloadEncrypted(output_,progress); + progress.operationFinish(); + Logger.messageBox("Finished"); + } + + }).start(); + + }else{ + Logger.messageBox("Operation still in progress, please wait"); + } } }); + panel.add(btnDownloadEncrypted); + + + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(!progress.isInProgress()){ + synchronized (output_) { + window.setVisible(false); + output_.notifyAll(); + } + } + } + }); + + table.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent me) { + if(!progress.isInProgress()){ + if (me.getClickCount() == 2) { + synchronized (output_) { + window.setVisible(false); + output_.notifyAll(); + } + } + } + } + }); JPanel bottomHalf = new JPanel(new BorderLayout()); bottomHalf.add(controlPane, BorderLayout.PAGE_START); @@ -206,7 +276,7 @@ public class UpdateChooser extends JPanel { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Display the window. - frame.setSize(610, 600); + frame.setSize(672, 600); frame.setResizable(false); frame.setVisible(true); @@ -235,4 +305,93 @@ public class UpdateChooser extends JPanel { } } + /** + * each row TableCellEditor + * + * @version 1.1 09/09/99 + * @author Nobuo Tamemasa + */ + + class EachRowEditor implements TableCellEditor { + protected Hashtable editors; + + protected TableCellEditor editor, defaultEditor; + + JTable table; + + /** + * Constructs a EachRowEditor. create default editor + * + * @see TableCellEditor + * @see DefaultCellEditor + */ + public EachRowEditor(JTable table) { + this.table = table; + editors = new Hashtable(); + defaultEditor = new DefaultCellEditor(new JTextField()); + } + + /** + * @param row + * table row + * @param editor + * table cell editor + */ + public void setEditorAt(int row, TableCellEditor editor) { + editors.put(new Integer(row), editor); + } + + public Component getTableCellEditorComponent(JTable table, Object value, + boolean isSelected, int row, int column) { + //editor = (TableCellEditor)editors.get(new Integer(row)); + //if (editor == null) { + // editor = defaultEditor; + //} + return editor.getTableCellEditorComponent(table, value, isSelected, + row, column); + } + + public Object getCellEditorValue() { + return editor.getCellEditorValue(); + } + + public boolean stopCellEditing() { + return editor.stopCellEditing(); + } + + public void cancelCellEditing() { + editor.cancelCellEditing(); + } + + public boolean isCellEditable(EventObject anEvent) { + selectEditor((MouseEvent) anEvent); + return editor.isCellEditable(anEvent); + } + + public void addCellEditorListener(CellEditorListener l) { + editor.addCellEditorListener(l); + } + + public void removeCellEditorListener(CellEditorListener l) { + editor.removeCellEditorListener(l); + } + + public boolean shouldSelectCell(EventObject anEvent) { + selectEditor((MouseEvent) anEvent); + return editor.shouldSelectCell(anEvent); + } + + protected void selectEditor(MouseEvent e) { + int row; + if (e == null) { + row = table.getSelectionModel().getAnchorSelectionIndex(); + } else { + row = table.rowAtPoint(e.getPoint()); + } + editor = (TableCellEditor) editors.get(new Integer(row)); + if (editor == null) { + editor = defaultEditor; + } + } + } } diff --git a/src/de/mas/jnustool/util/Decryption.java b/src/de/mas/jnustool/util/Decryption.java index cfe0467..771c55d 100644 --- a/src/de/mas/jnustool/util/Decryption.java +++ b/src/de/mas/jnustool/util/Decryption.java @@ -174,7 +174,7 @@ public class Decryption { ByteArrayBuffer overflow = new ByteArrayBuffer(BLOCKSIZE); if(progressListener != null){ progressListener.setTotal(toDownload.getFileLength()); - progressListener.setCurrent(0); + progressListener.resetCurrent(); } do{ inBlockBuffer = getChunkFromStream(inputStream,blockBuffer,overflow,BLOCKSIZE); @@ -219,7 +219,7 @@ public class Decryption { if(progressListener != null){ progressListener.setTotal(toDownload.getFileLength()/HASHBLOCKSIZE*BLOCKSIZE); - progressListener.setCurrent(0); + progressListener.resetCurrent(); } do{ inBlockBuffer = getChunkFromStream(inputStream,encryptedBlockBuffer,overflow,BLOCKSIZE); diff --git a/src/de/mas/jnustool/util/Downloader.java b/src/de/mas/jnustool/util/Downloader.java index 41a26fc..3819a1b 100644 --- a/src/de/mas/jnustool/util/Downloader.java +++ b/src/de/mas/jnustool/util/Downloader.java @@ -1,8 +1,10 @@ package de.mas.jnustool.util; +import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; @@ -23,7 +25,7 @@ public class Downloader { } - public void downloadAndDecrypt(FEntry toDownload, Progress progressOfFile) throws IOException{ + public byte[] downloadAndDecrypt(FEntry toDownload, Progress progressOfFile, boolean asByteArray) throws IOException{ String URL = URL_BASE + "/" + String.format("%016X", toDownload.getTitleID()) + "/" + String.format("%08X", toDownload.getNUScontentID()); URL url = new URL(URL); String [] path = toDownload.getFullPath().split("/"); @@ -38,36 +40,50 @@ public class Downloader { int BLOCKSIZE = 0x10000; int HASHBLOCKSIZE = 0xFC00; fileOffset = ((toDownload.getFileOffset() / HASHBLOCKSIZE) * BLOCKSIZE); - } connection.setRequestProperty("Range", "bytes=" + fileOffset +"-"); - - connection.connect(); + try{ + connection.connect(); + }catch(Exception e){ + + } Decryption decryption = new Decryption(toDownload.getTicket()); decryption.setProgressListener(progressOfFile); InputStream input = connection.getInputStream(); - FileOutputStream outputStream = new FileOutputStream(String.format("%016X", toDownload.getTitleID()) +"/" + toDownload.getFullPath().substring(1, toDownload.getFullPath().length())); - if(!decryptWithHash){ + OutputStream outputStream; + + if(!asByteArray){ + outputStream = new FileOutputStream(toDownload.getTargetPath() +"/" + toDownload.getFullPath().substring(1, toDownload.getFullPath().length())); + }else{ + outputStream = new ByteArrayOutputStream((int) toDownload.getFileLength()); + } + + if(!decryptWithHash){ decryption.decryptFile(input, outputStream, toDownload); }else{ decryption.decryptFileHash(input, outputStream, toDownload); - } - + } connection.disconnect(); + if(asByteArray){ + return ((ByteArrayOutputStream)outputStream).toByteArray(); + }else{ + return null; + } } public static String URL_BASE = ""; public void downloadTMD(long titleID,int version,String path) throws IOException { - downloadTMD(titleID,path); + String version_suf = ""; + if(version > 0) version_suf = "." + version; + String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/tmd" + version_suf; + System.out.println(URL); + downloadFile(URL, "title.tmd",path,null); } - public void downloadTMD(long titleID,String path) throws IOException { - String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/tmd"; - downloadFile(URL, "tmd",path); - } - public void downloadFile(String fileURL,String filename,String tmpPath) throws IOException{ + + public void downloadFile(String fileURL,String filename,String tmpPath, Progress progress) throws IOException{ int BUFFER_SIZE = 0x800; URL url = new URL(fileURL); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); @@ -78,11 +94,16 @@ public class Downloader { } FileOutputStream outputStream = new FileOutputStream(filename); - + if(progress != null){ + progress.resetCurrent(); + } int bytesRead = -1; byte[] buffer = new byte[BUFFER_SIZE]; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); + if(progress != null){ + progress.addCurrent(bytesRead); + } } outputStream.close(); @@ -92,26 +113,29 @@ public class Downloader { } public void downloadFile(String fileURL,String filename) throws IOException{ - downloadFile(fileURL, filename,null); + downloadFile(fileURL, filename,null,null); } public void downloadTicket(long titleID,String path) throws IOException { String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/cetk"; - downloadFile(URL, "cetk",path); + downloadFile(URL, "title.tik",path,null); } - public void downloadContent(long titleID,int contentID) throws IOException { - downloadContent(titleID,contentID, null); + public void downloadContent(long titleID,int contentID,Progress progress) throws IOException { + downloadContent(titleID,contentID, null,progress); } public byte[] downloadContentToByteArray(long titleID,int contentID) throws IOException { String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/" + String.format("%08X", contentID); return downloadFileToByteArray(URL); } - public byte[] downloadTMDToByteArray(long titleID) throws IOException { - String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/tmd"; + public byte[] downloadTMDToByteArray(long titleID, int version) throws IOException { + String version_suf = ""; + if(version > 0) version_suf = "." + version; + String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/tmd" +version_suf; + System.out.println(URL); return downloadFileToByteArray(URL); } private byte[] downloadFileToByteArray(String fileURL) throws IOException { - int BUFFER_SIZE = 0x800; + int BUFFER_SIZE = 0x800; URL url = new URL(fileURL); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); int responseCode = httpConn.getResponseCode(); @@ -141,17 +165,23 @@ public class Downloader { } httpConn.disconnect(); return file; - } + + + public byte[] downloadTicketToByteArray(long titleID) throws IOException { String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/cetk"; return downloadFileToByteArray(URL); } - public void downloadContent(long titleID,int contentID, String tmpPath) throws IOException { + public void downloadContent(long titleID,int contentID, String tmpPath, Progress progress) throws IOException { String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/" + String.format("%08X", contentID); - downloadFile(URL, String.format("%08X", contentID) +".app",tmpPath); + downloadFile(URL, String.format("%08x", contentID) +".app",tmpPath,progress); } + public void downloadContentH3(long titleID, int contentID, String tmpPath, Progress progress) throws IOException { + String URL = URL_BASE + "/" + String.format("%016X", titleID) + "/" + String.format("%08X", contentID) + ".h3"; + downloadFile(URL, String.format("%08X", contentID) +".h3",tmpPath,progress); + } } diff --git a/src/de/mas/jnustool/util/NUSTitleInformation.java b/src/de/mas/jnustool/util/NUSTitleInformation.java index 2083050..a1582e3 100644 --- a/src/de/mas/jnustool/util/NUSTitleInformation.java +++ b/src/de/mas/jnustool/util/NUSTitleInformation.java @@ -1,6 +1,8 @@ package de.mas.jnustool.util; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; public class NUSTitleInformation implements Comparable, Serializable{ private static final long serialVersionUID = 1L; @@ -13,7 +15,9 @@ public class NUSTitleInformation implements Comparable, Ser private String company_code; private int region; private byte[] key; + private ArrayList versions = new ArrayList<>(); + private String selectedVersion = "latest"; public enum Region{ EUR, @@ -22,7 +26,7 @@ public class NUSTitleInformation implements Comparable, Ser UKWN } - public NUSTitleInformation(long titleID, String longnameEN, String ID6, String product_code,String content_platform,String company_code,int region) { + public NUSTitleInformation(long titleID, String longnameEN, String ID6, String product_code,String content_platform,String company_code,int region, String[] versions) { setTitleID(titleID); setLongnameEN(longnameEN); setID6(ID6); @@ -30,12 +34,21 @@ public class NUSTitleInformation implements Comparable, Ser setCompany_code(company_code); setContent_platform(content_platform); setRegion(region); + for(String s : versions){ + if(s != null){ + this.versions.add(Integer.parseInt(s)); + } + } } public NUSTitleInformation() { // TODO Auto-generated constructor stub } + public NUSTitleInformation(long titleID, String longnameEN, String ID6, String product_code,String content_platform,String company_code,int region) { + this(titleID, longnameEN, ID6, product_code,content_platform,company_code,region,new String[1]); + } + public Region getRegionAsRegion() { switch (region) { case 1: return Region.JAP; @@ -108,7 +121,12 @@ public class NUSTitleInformation implements Comparable, Ser @Override public String toString(){ - return getTitleIDAsString() + ";" + region +";" + getContent_platform() + ";" + getCompany_code() + ";"+ getProduct_code()+ ";" + getID6() + ";" + getLongnameEN(); + String result = getTitleIDAsString() + ";" + region +";" + getContent_platform() + ";" + getCompany_code() + ";"+ getProduct_code()+ ";" + getID6() + ";" + getLongnameEN(); + for(Integer i :versions){ + result += ";" + i; + } + result += ";" + getSelectedVersion(); + return result; } @Override @@ -139,6 +157,41 @@ public class NUSTitleInformation implements Comparable, Ser public boolean equals(Object o){ return titleID == ((NUSTitleInformation)o).titleID; } - + public String getLatestVersion() { + String result = "latest"; + if(versions != null && !versions.isEmpty()){ + result = versions.get(versions.size()-1) + ""; + } + return result; + } + + public List getAllVersions() { + List list = new ArrayList<>(); + if(versions != null && !versions.isEmpty()){ + for(Integer v: versions){ + list.add(v + ""); + } + } + list.add("latest"); + return list; + } + + public void setSelectedVersion(String string) { + this.selectedVersion = string; + } + + public int getSelectedVersion() { + int version = -1; + if(this.selectedVersion == "latest"){ + version = -1; + }else{ + try{ + version = Integer.parseInt(this.selectedVersion); + }catch(Exception e){ + + } + } + return version; + } } diff --git a/src/de/mas/jnustool/util/Settings.java b/src/de/mas/jnustool/util/Settings.java index c2f1fdf..ec1373d 100644 --- a/src/de/mas/jnustool/util/Settings.java +++ b/src/de/mas/jnustool/util/Settings.java @@ -3,7 +3,7 @@ package de.mas.jnustool.util; public class Settings { public static boolean downloadContent = false; - public static boolean useCachedFiles = false; + public static boolean useCachedFiles = true; public static boolean downloadWhenCachedFilesMissingOrBroken = true; public static boolean skipBrokenFiles = false; public static boolean skipExistingFiles = true; diff --git a/src/de/mas/jnustool/util/Util.java b/src/de/mas/jnustool/util/Util.java index c7eff97..9f446be 100644 --- a/src/de/mas/jnustool/util/Util.java +++ b/src/de/mas/jnustool/util/Util.java @@ -1,5 +1,6 @@ package de.mas.jnustool.util; +import java.io.File; import java.math.BigInteger; import java.nio.ByteBuffer; import java.util.Arrays; @@ -21,6 +22,7 @@ public class Util { public static String ByteArrayToString(byte[] ba) { + if(ba == null) return null; StringBuilder hex = new StringBuilder(ba.length * 2); for(byte b : ba){ hex.append(String.format("%02X", b)); @@ -59,4 +61,26 @@ public class Util { return 0L; } } + + public static void createSubfolder(String folder){ + + String [] path = folder.split("/"); + File folder_ = null; + String foldername = new String(); + if(path.length == 1){ + folder_ = new File(folder); + if(!folder_.exists()){ + folder_.mkdir(); + } + } + for(int i = 0;i