Skip to content
This repository has been archived by the owner on Aug 23, 2020. It is now read-only.

Commit

Permalink
Updated Snapshot
Browse files Browse the repository at this point in the history
  • Loading branch information
Paul D Handy committed Oct 23, 2017
1 parent 5244112 commit d7679b4
Show file tree
Hide file tree
Showing 6 changed files with 65,640 additions and 51,897 deletions.
2 changes: 1 addition & 1 deletion src/main/java/com/iota/iri/Milestone.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class Milestone {
public Hash latestMilestone = Hash.NULL_HASH;
public Hash latestSolidSubtangleMilestone = latestMilestone;

public static final int MILESTONE_START_INDEX = 217000;
public static final int MILESTONE_START_INDEX = 243000;
private static final int NUMBER_OF_KEYS_IN_A_MILESTONE = 20;

public int latestMilestoneIndex = MILESTONE_START_INDEX;
Expand Down
17 changes: 11 additions & 6 deletions src/main/java/com/iota/iri/Snapshot.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@

public class Snapshot {
private static final Logger log = LoggerFactory.getLogger(Snapshot.class);
private static String SNAPSHOT_PUBKEY = "ETSYRXPKSCTJAZIJZDVJTQOILVEPHGV9PHPFLJVUFQRPXGNWPDBAKHCWPPEXPCZDIGPJDQGHVIQHQYQDW";
private static String SNAPSHOT_PUBKEY = "TTXJUGKTNPOOEXSTQVVACENJOQUROXYKDRCVK9LHUXILCLABLGJTIPNF9REWHOIMEUKWQLUOKD9CZUYAC";
private static int SNAPSHOT_PUBKEY_DEPTH = 6;
private static int SNAPSHOT_INDEX = 0;
private static int SNAPSHOT_INDEX = 1;

public static final Map<Hash, Long> initialState = new HashMap<>();
public static final Snapshot initialSnapshot;
Expand All @@ -41,7 +41,7 @@ public class Snapshot {
System.arraycopy(trit_value, 0, trits, 0, trit_value.length);
curl.absorb(trits, 0, trits.length);
Arrays.fill(trits, 0);
String[] parts = line.split(":", 2);
String[] parts = line.split(";", 2);
if (parts.length >= 2)
{
String key = parts[0];
Expand All @@ -52,19 +52,24 @@ public class Snapshot {
{ // Check snapshot signature
trits = new int[Curl.HASH_LENGTH];
curl.squeeze(trits, 0, Curl.HASH_LENGTH);
SpongeFactory.Mode mode = SpongeFactory.Mode.CURLP81;
int[] digests = new int[0];
int[] bundle = ISS.normalizedBundle(trits);
int[] root = null;
int i;
in = Snapshot.class.getResourceAsStream("/Snapshot.sig");
reader = new BufferedReader(new InputStreamReader(in));
for(i = 0; i < 3 && (line = reader.readLine()) != null; i++) {
digests = ArrayUtils.addAll(digests, ISS.digest(SpongeFactory.Mode.KERL, Arrays.copyOfRange(bundle, i*ISS.NORMALIZED_FRAGMENT_LENGTH, (i+1)*ISS.NORMALIZED_FRAGMENT_LENGTH), Converter.trits(line)));
digests = ArrayUtils.addAll(
digests,
ISS.digest(mode
, Arrays.copyOfRange(bundle, i*ISS.NORMALIZED_FRAGMENT_LENGTH, (i+1)*ISS.NORMALIZED_FRAGMENT_LENGTH)
, Converter.trits(line)));
}
if((line = reader.readLine()) != null) {
root = ISS.getMerkleRoot(SpongeFactory.Mode.CURLP81, ISS.address(SpongeFactory.Mode.KERL, digests), Converter.trits(line), 0, SNAPSHOT_INDEX, SNAPSHOT_PUBKEY_DEPTH);
root = ISS.getMerkleRoot(mode, ISS.address(mode, digests), Converter.trits(line), 0, SNAPSHOT_INDEX, SNAPSHOT_PUBKEY_DEPTH);
} else {
root = ISS.address(SpongeFactory.Mode.KERL, digests);
root = ISS.address(mode, digests);
}
if(!Arrays.equals(Converter.trits(SNAPSHOT_PUBKEY), root)) {
throw new RuntimeException("Snapshot signature failed.");
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/iota/iri/TransactionValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ public int getMinWeightMagnitude() {

private static void runValidation(TransactionViewModel transactionViewModel, final int minWeightMagnitude) {
transactionViewModel.setMetadata();
if(transactionViewModel.getTimestamp() < 1508760000 && !transactionViewModel.getHash().equals(Hash.NULL_HASH)) {
throw new RuntimeException("Invalid transaction timestamp.");
}
for (int i = VALUE_TRINARY_OFFSET + VALUE_USABLE_TRINARY_SIZE; i < VALUE_TRINARY_OFFSET + VALUE_TRINARY_SIZE; i++) {
if (transactionViewModel.trits()[i] != 0) {
//log.error("Transaction trytes: "+Converter.trytes(transactionViewModel.trits()));
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/iota/iri/service/API.java
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,9 @@ private AbstractResponse process(final String requestString, InetSocketAddress s

log.debug("# {} -> Requesting command '{}'", counter.incrementAndGet(), command);

if (!request.containsKey("apiVersion")) {
return ErrorResponse.create("Invalid API Version");
}
switch (command) {

case "addNeighbors": {
Expand Down
8 changes: 4 additions & 4 deletions src/main/resources/Snapshot.sig
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
TVZRSRSKPNOYRLXOKNNWHMQYAZVFQNM9QSVVUZRGGKWDVHEPMUNVWROFQAWQFMPDWHCPCVEIXWFRZYKZWMXIPMDFFMDYIFTXSTIUUHELYHYCPZCDLNGQHSNKDCFETEOIFLAYBEUFDOUMC9VSRPWGWFYUFOGSGQZQJZEKNYX9HNOUHJJRSJGYU9UNJVRBBLTCXAKQGLLTUGUFWKPIIQKEXLCD9WYRZXGZPTAYLUBIYWHNMEWSKMWOKSOYWBFAHVTGFVOAOAZICYWJDUYDHPTMNQMVVKUWZKFHLZWFTJDMSYBWZAMYMSOZWHWBGPSTRGUAYZRAJIE9VUMASJZRULBDQSEPLCPTXSSAEJWAEBIKSJFNKBAMRMRIIYOIFSJUFEZLCGOFDNBFZCKCJYWWYPEZDAYQAFCJHAECET9CJOJNFOXKRLWXSLFMXFCWKAEMWHBHQPQVSDXDPBAEYKPNNFYVYJLPZITLIPBGORLVOXFFOIFKWBJQRIJOVMDZFYMHUXXDGCGYY9SCLMFCCZGVAMBNWZZTBFEERJGA9CXUBAXHZTXJPJKPLGNDWMYPOUTOJQGQELYYJKQFREHEJNKTOFZGSPBBPYHEBAZMOXWKFHTVOVFGRSALZBKKQTCGNHKYVLUIBJSEUHDDPRIPPIRJDTSYTFERDOWZQGJQM99RAVY9UXTIDDNGFSGVTRIKFKVOGWUIKRZRUMTFBZEDHNBSPKTHLVAQZEJRTVVRBGOKNXJYSBZKFWQXUZCAFZFQROHWPTU9VZQAM9EMWGZDDVU9WSHUYJLCVFC9ROTVSQWXHVDOGXRJAJCMI9JDFPPKTFPY9KZZVMWUAI9E9HNFNNNPHESBMCHYBSUNNNUMZHBVJCBRBWCAJYPTESLANBENGFDAXTWLCOVBONGTRVKIMKFMWBEVVSNXZTWSIQMSTUNJTRJZEEXDMYPWTCQNBXMSIUGPHFCZUM9SDTMWZMJAZQQRXHJCJWMWKSPACWUZFMKLEIUXYKWQMHABQMSSZOULGCKVMPKMABJRINJETUJEMPYEEYTCDKBMGB9OXNDOFEUZNEAUP9ZLGECFHWTGIKYEBFRUTXMPEQUNRYTALIUSQFSAXLSBS9RJOSVQQSSZLSFKQG99BKUUPZFHCWQLBDFXGQPKIR9BRFNXQHOME9EIYGRACWNSWMQBRPSKC9XEMDVKSIEFMVLFTYZMPJIHZBGOVHUXYZBPJPC9XODXVVKTKOXJCEEXTAZATZNBTK9XQHXYZZUBURATRQCJWXWVFIBJWUWDUYCTOYIRFSSMPKSOY9TWNYUUKEW9DKHOAEMLTDSSFADEBFIR9QPZQI9MQNKJYPEPYPZFXDFIKU9ZFZESUKZ9PDQFMOUKWCVEOINV9UKNAPUMFF9PVNLIZHTVGIJJMGLROLDFEJATZJBXCDTGT9FPXZFAAADLRNOHBLRVJG9EYAOACHFA9J9BFBLEKPDGCEVFRCCHE9QOZHFTZCVFAKYRPKLBOERHH9WOCMUUDWSQXTCVHPPIZG9MKNOGQUWYWXXUCLRVITYLZKLHZSRXUNMUKEFBPQACAFFUIJHTRALGXDNXLJKTVOFJGGRHOIESAKYEDTQQFLKRHEMCVNTPCKICHMT9KQLDFAXAMZQVAFCPDEPWH9VNRYEUPPTBJ99EPSEXAMB9TLHPUVPVZIDRAXDAJUPCJBXDMEIAYANAMOYK9HWXUJTDOIOFGELNDTHSPKZZCJTENDSPELBM9LOOCGUHOZBSDC9YPFNFEAPE9CGFUHUPFVSHTAYUV9QIDCLBM99DPUAFMDQWVGZJFRTZVQTLFTJIPJRBEFTSSJ9DVKLUOEHOBBSXBGKV9PJZYNPTVBCPTQPGOSOVUIWNFJQGITAKZCWXAUMRDFKQBRPL9ZXUYFLPRZOGBEFCTIWTCMDDYVSXFRVMUNYAARNIALJQBC9RCOBWYLBDCHEXOSBEDMZBRJALAPKMNXAFDTZHAXTXHTMFMSHLALNLCBAZBJ9EMJEFWYUTCQTXGYYKIPTUNRBSBZ9UDJSRVTAUPXZZZLXZPMDGGQJAXWQDCKTGKGKNFMWPJQH9WHFDASAKGJJLIXQXVMQXOOIHXBSQXGOBMLTQUABY9QGTQGINBFCWRAQMLL9SJKEOSIQSFIKJ9ESBNRHFHODVYUWWAJFFIIMX9XOK9YNFXIRXUNXXL9KLTWA
AJUEDIDTWOFNCNUB9PIQEXFDFKWTHCFLNCAIEPKHYRINOAWYINPRANBLNU9HSNMPEPXLQAMBAFVPJGDTWZTWLLSQINKIXYDFRGAJDTJFILEPZXSXYUOGSONRBHUCQJZOGRGJHQL9IGYPLHKUOGPTOXEPZI9WUFKMEY9KWMEMVSGWLDGIQG9BINML99ZVREHKOLXOBEVSXCYLKREBSSNZRHPNTCGHYEL9INSWRBWNYXWLRUWYQBWXLPIWTEBYFXOOTMSSQTHSLUTSEVCFZ9XYJSUQPUYJOAAORIFRBHIQKPTQMYHTNODBRFXCRTZMSRRAGMAXKXYSQKFDOQ9ZGRAFCVTKHCUOGINIAVWCHMKHDFMTLHLO9OMKVOVBQDAPEUBLF9MKDGZKAYQQWXXAXTC9CTATOVDJRKTHRPJFFYSUIPZDZPZRQRHCUTDKKCAYXTT9BOBVG9QENKWSLFKRWAZSEXLRYCFKFKHBW999ZCSR9UTQLICAIZRMTQQWAGDRXUEXZLIWMYKYNZSETMFMZDXYFUNAVIFFDSFNIOAPPJCALLILTOTRBPAUTOWPUXLOC9WDTIAGWGTRZOJZPWZNJBWKVPIPWUEKAZ9GPTA9KQOGWBMTVULIKLOD9N9HEVNTNEOMWKZCTXIXROXTNRPUNNK9RCAVSGIEWGYPHXHOENSQAWYHJMHPSADKOHCJNQDLRJKTRTETAZWACYNKAPOTJBDCOCQLBG9HZZNLF9GRCTWWQFMOUNSARDCARDXWHVDIAFTKXBEWWGFCVDUTLRJXTGVIAJACSTINEJTGGZPKLQVIC9TBEDREWMIKZDVVAI9IXZBYQPNISZAKCUAZATJEXUCIMKBIRDDIXRBRDTGENJYAGTEUENXVLOVTLHYAEED9WAXGNJRVKHGFZKY9HHGYHV9VQUDACAJUHZIFVTGITCJOIGJSVJWLDUVBL9EUTUHDSLRHGUWELFE9KAPDNEU9SMIBYXIG9RGRCIXMEUZWYEMREVUALUYALZZPFOLSBYEFFXEMAGDZDKUJGGRBUOXDZFVJPIRRMJYIYLDOTSMKORPSFHNKTGSDDIEV9NHLYV9QGMBDPQAJQGWUHFO9UTOCNBYYEBBHKILOUKEUAJYAPCQGFRLIMBHIVNFADVOIGGYFSL9AOQQEVJQOOCTHYHNORZ9BDIJJOTGJMQWYIORAUXPAX9DXDOZIGSLGAZDVVULJSTYALJBKQHWHKBOTPJCWYKMABKRHJOMLVLBIAYRNWDHRVCGYD9IZVBCQCLRDVOZKADWZOONJKCRKCCA9GHMCSKXQWVDMNZJELDUZRMCNUIFJYP9SNBGPKVYFYZYTNJILYKVAHKKCTXSBETYVEUIQNSF9TYICQUHLWYVTCKTANCFRVRMWWCERZYUQPEQNIOIEPCRYEHIQRYAIOGNMZAYFOSJKHDOCIKJEIAXJDDUVIYSALQGFE9MEYB9XKVUYOQLDFWMEZICYHMRIEETPYPUAVGYXSBSQWJSKCHRIHBSEJWGUYHYGKEHBJFPGEHXJGCROKIMHND9KXMPWTCLQUUR9OPV9VMTVSHCKGXJEDPURLVKBEGQAMGBVDQLWMHZIAAYJKSZXBQOKWSYPXKYDEDEGHGCZCW99LONPDKOLHNIKOWPN9IPZTFMJCKLNEEJGJBRWEVIEAFQRJQTBVLXZHZCC9CT9JIIHSRHAUXQMQBQYDSWIB9IAPAVJGOPITHOJBU9QLCRQBLMUADBDSLODKUOESIGHOTWNGPJMJXPZDYIXMDLFKRNURQUPKLXTRWZJYSOHABXAFNO9ACURZZFCJBEPLZZBMTMRDTXLSYPEGDGLF9NNPYBBPXIWIDUEZOJ9LZRDZFFGYZ9GOJDLKLLDL9XLOWXHYLWQRKLQWLONUELECDVOSYK9JWGJTKTNMAOCJPLLBFSWY9KFMPLWKSZIAERUVVTMO9VWRSZUXNTMYYJNASRX9DNFJXBENDOAFWLUOXXRSFXZLTHDKLCMALELXQZEGBTQGVSRYRUKPBBEJABZWAUWXKVCLQGBC9YPKVQXOGIGMOLBR9SSXCCHDRJPKAMYAPVQBISVASIHRGBBXMREMSPWJLLTBOZSYZDBAXNS9ATJR9CVEYKKVYLFIKWEUEIDEKOEKPHQLNVXPUXSWJLSCO9WUEKMFRUFQPLVR9HAWJLPWAJESYKMBUG9RRZ
BXFFUFHZZJ9QRWGG9EYTIKJAVCVMUCCJAHGZTUVVDDUZYMKWGSVYJJFBZIOZOHIWLUDQMEPGSN9VTWEXXUATHLQJGWXNSCSCPBFSEMJLQIXJC9OQBDQMKHFXOKNVKXADVGACMSLBBZYQPUIULOSUOQZJLDUBMLQFWXSADYXBERO9SLTLTKPPQ9LRDVMOYPPTUGHQZSCFFOZNVJMJDQHSDZB9FKIBAVFMHLZOIGMFWJNWPARJKLYIREQUHTJSKTSKSBOMKSSPMBXQYGOCANKZPANKZAWJXDQMUDQVZOOWLQLQ9OJSBROQXQGEFVANGJRUVBOXXNSGQ9TGGYIPLOUC9WYFTMJRQTJCHHQKFQRYZUSGAKDZ9F9RLNWQHQESQ9ESMCSGMFABHPKRDJCWVZHTCUQXDEQGTTHSGDYTHHMXHAIYOFELTIBOBZJZZKWREKOTCBMMSOKQLTGJHFTNQOPU9VOSCMQFP9UHQFKBT9YPAHHYHKGHNJFHCUXZZWQGFCYEDQQNVSHOVQHKSSOVQAOXTWNFBLNHTLKJIIVEL9NVSDKDTCISMXUKURBYOOTSRGKWWCCDPRPLCCYKZOATFNSVOFYUIJCQTHCIJDXZLEEYGJKOERDLKPBUSGKK9FGWIAGHC9CHEARDPGO9ZP9ERHG9KJSMXVBOBZOGYVALMXWYFWRCNYOQXIQPQFNKVLECXVYPJHQRJNJUCLQKTYYOZDVELJNOCXGVABFNEAUCJSTO9CUTFVTK9VUIXVSZMWDBYPPDTPDAY9ANDWFROYBCUVFSNNLYIXXV9JS9N9AHAUOWXXXBEMJJQSWZUOZC9CTXOTNAXEFWVQTRUVI9TPTEBUXDDXAHEPHXOSNDUSEUOQRXJHVOQZZLB9SVZVEROWBHYZAZOSVSLEGGRAVCIUZPA9RWVAGKXBQ9MBTOYWAWEE99LBIESORFWOCTWDTJVMBQZMICWMSFWWLVHEJCIESAMFDCWVDCAVD9RQSVLEAISMPKPWTZGCBPZE9UCVDUOBSIDBGZRDXRSLUVYM9HYAEYRVTGTXYVBLIFAQDBSATOPNFIRBIVIQMEIFSCJUKOIRLMHIVFBRUCKEPZEPOXSNVICWZLLSVGTZATDEJOXNXHVGOYZX9HFXNFFNJIQWWRDMMVKSKFJFTPNQZSTUEBFIGTRABBLXIMZAEWKIOOIRLATQCX9MXTCK9HSPFYDZIBHSGXYTZBMXBDVJSKCDBDDKQJ9R9MLQXMVMYXVPDYFEUXRHQJMNREYBXXNNYIGNBQ9HAKIDEXYVIGSEYGTJPMXSHBSOYJBEVVBOHBOXTCF9WILPDLVNSZMSRKMDSVGBGHPJSOFPZDUE9CSBHEDFK9GVDGENOI9PIAXD9FJFQMCFZQOLXKVXVMK9IRPPYNABYGLGVGXQKENKMCE9AVMGCJHERSDLPLYKCZAL9XAPXVBAUOKJGNIMDQURPQFCWJSFKYFGIQJWKUYAGODEQLBTGDSJL9URPWBJGIHGRUVMUMYZCBFWFIACVYBSYRE9IRCWRIOWLGMCOBZQDLANILLBYKRYWDSNNSHDMRNHTLMTQOAIWSWOVLMZEYEOACDEWXHNDKZTRIAOVPHCWWUJGEBIXPCFOGFVY9GIYJYWKMNCAAMXRNPUTLTRBYIPKELINLVTFZQCVVQQMDYBVNBZSNCQHMNCWMPEYBASUDMI9BKYEANLFLBFJSUUAKU9QDGDVJMMSPG9XVFEZARQODJXMBETWZGQTPHUDDO9LQWJEUSAXVUJEZ99OSSPHHNFBOYLGBW9KQFWKIRSZPAHJKUMYJOQJLVATXYGNURENKJERIOHPVCJJWQRKFSDKELEXYKJQHATBFLXQCDCDPMLWFSNYTFAQDLYDWRVHWFHGN9SPWYCRBXBWASCSEQ9AXBAABGNQFHFIRRIHGTZKED9MLZD9JSIDJCMFWEWRTTBAXI9JTMVORDNKFLBLKF9DZQXIR9PZCOHA9QTBWNWRBRXTPFHJVRYWUFWTWYPWEDNLLBRXSBGHGI9ALQO9ZCGUCUZGMAQNSVEJPBWOUINKTWFXGLWRUE9CXRWEMKCORBYZA9UMPDPOKEPJZJREHXJLFPQXIQUPWCVHKUAOWJD9LWEUXNQAUBSRKCXEOTCDYDMKPJS9FESEQXIESVDUGDTQOTIUCMUNRJL9PMHUFMRCYPVQRWT9GUOB
RIIGGJ9OTHPQJDSVYYQOZAWVTREMULBGFNAWTLHYZPDMVFHHBSYPHOEFPLHEICSRQFACZNXWLXPMWBOIYOFLRJN9LWQPUOQGBYZDZKRQHSETGF9TWBAEPEYLHCSFPHHGIUNYRLSKQFZHHCSPCGNROAQEAATKXYGLXXOJBQWTQGHDBEUYQCJNTKUVYYBNKSNPSRM9GMWMJKVVJ9LTJ9RDKJ9EHHYK9SOKDCKHFJJTLAMWUOOKMYTLQZMI9AJKICMMGAGJANREBJUGWPTSWVQVMNADBUMEHUMEVUBUIIFEOOJLYKVNBUBI9VHTEAVTXHGMWYPMWTVPYGSXZLAMCPCKOUZILQIVRFKFQUCYZWQVZTPRHYDUNZG9YISLHWLFT9JRKFVTVUPFZXWRIWKZOVCWGAMHHJVDYQWFQX9O9OHZSYSY9BNKIEURHPNCLFYHGGDFRIUKGBUPQRVLKITVKTWDXPJOUN9OXSMQ9VYMWO
PKMXSGLWRNKAY9NRXDAJDOHTPGFE9QVJPY9CBEAUH9J9ZCVHUXAHBJFZJGVKFUECLAKFYX9N9VHPZBHSV9PASABPD9EAMHVUI9HNYHAJPATCAVIEFDJRTPOFSUVQ9TFPYORRSCWQKFALY99YLDREPPYGGN9ZJCWQDTKBWEDIPFZFSCOTCOJOGHVKARWRG9HRLMKJFILTF9TVNWWETFUPWCPHZYSSENFNZGAQBZHLIJEAEFMTLIDTMVJDRONJCNFMNUZBNQTXVTOK9MSHMIPCLDHJBSFRAZKPNXSNKRWTFLQPWYILBI9ZG9KLGBGMXCJZUXKXQ9BBMEKLWOBRITA9PZQN9UR9ETVXFAVGTQIUMBMSPYVGYKZCSQVBKU9UPZEPQ9EE9D9HURDOACYUOANQUIKUAT9VC9UHJJWOKROMMDSABMAABRGNVACCELDVFDGEHXMWAYZVZVPLOOUDBNPHJAMWGMZN9ODFGHIZTMRCKDAANDOUGPJUKTMMDFNWWHJWHBFDPRFNHDP9GJZPAAEJXEQMZ9VKYPYITWRPIYHSQRPQYZNDACKFEONNFUFZOJMS9PGVYCVAMBPCVKLSBNS9D9MZQWCCQOYKCJZOHHTPKESIXPTCBUAALFZGEOZGDIOOEMCGHDXPT9BXLJWR9CI9CY9MPHTVYMYJDEXBELWLIAKXZXXWCMJMKHZCJNTMDBJQBQZYQHSETEGBUFVZIUTMYIFLDKCNVBKYTDQ9XLOUSBBSHEJMTYMBCYUZMYIXBFHZMADICJBVLPSEJAARLL9YQJFGHWMYVN9AAYRHABFAROSLMHPLRGBYXGJOTAX9VCNNE9XLXSZSAKXBUXVGCIO9MANNWPMLAUJDRGVI9XSXYCWWVGSNRZKIONNQVDCIZBYWPH9BCXRZSMCIRQGGLXZ9KDZXSCYIQPNXCYTQSZXXRXZORJQDJEVPRVADQSIPYGEWMYBMLSV9CXNQKSZWWLHVPXFUJCUNFETASHLJMVFAYSTVMASASGRPYVNALASCCWZNQWKNAKWSIHNRSSMBYEGEOERVZYJYRTMSACHYYODOHTXTKACHPZPXZXAYFV9EBHIIAAOFXYRPZK9WMQ9KFJJTPHWYVTLTRKMMPBQVUNMVOBJKJ9RMTSOHQPOPMMZFEEGTWGGIYPAPUSNNO9LMNKBZUXC9UEFR9A9GQTRWDJCMLMVYSK99BUIYNGAZCASNNLB9SRGJMEREJQEUVYQBAEBBVJHWXBGOPTQJOWII9AJQ9KFPCGMAOKAWDTXQGATEZGSACRYGL9HZZIAQKIUKXXXYKZMVXTAXKTXQDN9DNHYX9VDD9QIWBLZFSQRITBMJUGFZZDWIIEGEHKWTDGNRAXYNKKFATVTWFSTSPLIXWZWUUHPPKAFZRETRHYDHQTPJMZAVDZSJKRWVOWIIMMLUVMWMHBKRLHXOCDZRYVBDWZO9X9BWYLKAISWNSYFAKKXLUSVWU9PYGNBRLFQWVPLFCYNOQMOZWLSYFUNOTZWHCSTFSW9OHZJ9PNOMFRQTGRHTNGCWFNCQSGMMOLSPJOHIWNONYORDDKYZUGPIOQGLHVRYTVEQXNPKGKKTAXPJSKJJGFRXOYWKTQ99BRN9ANUJKSYYWNGWIOTDFRJVYUXJRPVT9XLNGNSBPJLNWMQZLDCDOQUUEAUOCL9KBYJAYGNZOJK9EJBEM9OWNKKEA9SODTNRUQWVUBPCMTBWEXGLSVYNBUVV9CDAUPLVCYREADORP9UNETIZHGKCWBDNWGM9LPNQXGDCEMILPRSYZ9ZKKGTXXSJCSAVMVFQKTVARGKK9AGUJSVAQUWEGXJLCSLKFWUYNZHURFHEVRXRZHCIDLFFWQAPBUJHYPZKOFGBFXRPQMLUQTCGSJDWZPTNYSFYFUCX9OJIVLMJXXCHJGBJLIYVAJXUYPGGESTTZCXRXQTSLX9UTRQLCEESNHGTVEZTPQJIWTTNCXXTLLXWZPQRNOOJJKNBIXYAGBEIDPSUMOCV9VIHTZZDNDYNJHRXUCKEKXCL9IRQ9BOKZAOLLCYVQB9RRUNVKIWWNSGPKDNDXRSJLWVHMNLLAHVGCZJYOZALRFMPLTKKSLDVUYYDCXGKXYDFGDSCJRKJPBSEW9LY9XURXZXARYBFOYKPMYUWQXUKNJUFGLHIVBNGORDSRRHORA9DZQKFAHEPH9P9CQCW
NJKMGXYPNKZQZETJFGBTHPRFSZGLVXIJINSWCVSMUBZLUWQXBHNJFWDDETLKVCJHZIBSPNQIBSYQESYVESPBABGUHPHCXXTI9FUCANYBAQUBH9MUJMDLCTQZHZSEEQDMOZMHCLSILNOEDDQYMRWVQKFELARXVYPTYRQUJHOOZEXYIJA9KOMOBMGGBNMTYGOSANCVRJARTECCHWLNZEGCKIKFFHRWSPGPTBDURVQURSMXWKFCQ9NVQRLODYSAGYSKMOWOXOSXZYYNNFXXFNXNSFGMPMG99SAUVUSPUIKQLMPQBQJSW9KFABKRFMRIYRICFBRVOTIGEZ9NAWFUJVFVRQBZMHQCMBVIPDTINIHNSQLGIRUWSGIFJN9ELTWNHSNLOSZZUKDNYXNGSXYDLSBOONJPDWFJETNP9HWKPCEMMADPXRRWLUDMWIVSYXNAFQIUQHVJUEFEDDHRORSLKYAP9YNG9GWEWSXGLZYYNTKUDJBMDWLBCISGLVAPLFNIHJZWQFXHIHWFEVCWYSKEDK9PJOCVWPQDILJGMWIZBDV9CGRTJVO9EUHAMGYXQNILXOQFMFHUTICREZHIMDCXKSKCNCGICMJJHNZSMDABDHSPWDSPHPVJCRSCWDLRTJRQUYHDHCR9RIYDNTVBORNRMYVFULKJ9AWMHMZXFCEPPDWSWGPCHMIDBNOZEJPWRFHDQDYTYGSSOTGRQTOQXRBZLPLEAOVYAGYHRVVEBQZSHMXWCL9ZHRIC9ILBYCSRGKASFLXNV9MM9ZBCHIQMFFHYHCEJMQMLQFLAZSKFGKEJRAV9LHOJGI9CUZFETP9FFNBCSRAIJMFYHWRWCILKUCSTYWDQRVYAXYEC9WZJQZEFPQQZLPTGPIQJUEMNACIUJGXZDGOAZARVTNYGHLENYHVX9RXKYTYCDWRXUMJVTQYT9NAVMZCXYFRTCWMDSGGDUYBCBCJWEJWGCGVLGUHVCFDQPDJYNVGKPEIWGWBU9XXGVOLOWXPAYYNREKTBEKUBDJHDM9DXJNSINWOXHPNZH9A9YSULYADCSHVFZGZZOPZFZZDLFVBXGMESBJK99C9DAMUMKBQCT9FHPWRKFLGAFWDNVBCJVRIANTTEKFIHZMRKJZXGEQCKWGPR9MMKUXBCZJHBJVZRADSSN9Z9KKICTGUILNVDLGDOQCKKQTNEVCWPLUOHZZXHLEVK9BIPVGIPUZCLHIBEESGNIK9JJV9VUMPKDEZBXGVGTXBDOLSQJNEA9DLTQDGGEIORPLHBEMOQWN9BCFMLWRNCIAEKIDSUYFVPHYKYAMAIDFCWNQPLSQZTBRBYAYBFSQLRKWCELOMYE9WJJFTFXGNEGFXIJDPQVFTVKLYVEVSPYXPDGCFVFOEKUYMY9MFB9ZIVHVEFSBQEQWGWDACE9KTWFUEBVACOOIIDHRHLCLYGBIORWWHCLHPPBVTUAWSKESOHFKPVWNSJHWAZRHACHKXUOOXAQSZLVKHQRBEDHXKTJUDDCQQLNZGZTUHHRTNCDVSPSWZBBUS9N9XKMVAGJK9SIHMFOWDDFRWLRGCJEAIAYTHCYIY9D9YCDTAZQMBSVDKRLXZMFTSWHXJKRUSFKOTJKGKMVVAZYQWIVWUZAMAYTPVSVQ9JSBARNMAAZBHLBESSIGTLZLXDSC9ECNASKJXZINON9CEVBBYODKHEOKGKRVAZVQCYVFOXRSCRAKBBHBYZJTX9ZMDRTI9ABELYIJEYBWVDOMDTZFBJJEBGHGBRMPDAYZPNBMNSVFGOUTCMDEYVSVPKGBOFMBUAEKSFOUEX9ZAWFLLONFDQYFBNEN9RCMUIORK9MIIRJXNE9VNZDPGNOMELYDTANFVTW9BHMYOJQUOVOZMIL9FWPDKEDPXUATLJ9MEHAWCTMHQOJMEZZOUHKZGXYQJZVYQMMGNALPNURMRAWWQQSWG9NVISBUZJOCQTVKAMQDEJWPGARHIXOHCBC9OMUOQKNWFXTVNCDUYMIXFROBLRU9FSTOBSCQJPQFMMBXGCEDBHVZQUCBVNJTSOTYYRQZBIECI9MPVJMMBYRQXGZZZBIIPPXVPHSFJPSIILIU9EMSAA9PZSHWGH9CBNWHWZZNQILIPAJFJUIEVZYVQEWWYLHUSUCRZRZRHLGVPSSJDHIBRSVHLNLQJDDU9QFBPCEPWOUJHIAGFADSTBQBPETTQ
WRRQJNIKIOUHELSRNHEBBOSZUMNGBZMQWLHXKKOBEXAAYEYRVRJSRUFYCUHYDTXWOGXEYMGXPWTXFPQTRIBHUMMLXTPSSIRHOQWFZZPLFCGMTWQKVTADJORMWRXALVMLEH9UPWYQPGDNNUHTUSECSGKSNKVYBXDWWVMMJ9VSRTZASZPI9TJBDCJQHYHWPRXI9YXBAHWBTFQADTPDXGTJVIKNKLVJROQEATVWFSLCNDOVBDTAFHWXO9YI9LB9WTHHDOPXSWT9SQAUAXZMOG9FTYOYTTOOUKAZFDAPFSNTJV9F9PG9KOAGJ9RJOBLNPCXJMDGFZOERFPLRTJZDPKPPKGDNUEPVCQHZMYHRIWIXJACNLLFBHOPCCEJGVEAEYNPI9OVSJLYWGAGQFBRJGOJGGJCVQUDDGCKYWWCWKIQDR9CKUIBPOPNGUPKEEO9IXFHWFOODCZFXNVGKJRWSWVFEUPFRNRCVPDTWTISZMNKTROAIOBKKIECXVZNAEYT9SZVKLHADCIQSQ9CLFHCDEANUOOFKSF9YXSGIPNWNRZJOMOHSATPGWO9QIYFBRMYFPRKFBAIISVJEJRVSEURJQJHUNPWNKECXKEMBKJTKHMDHMHSHLMANEJKUQEOMFJZZHDUZKFRKLDYPZXRBZCWLGEUC9UXGWQFKREPNJZKUAODKFKFZTNQ9WZAJYSFKCVUBTC9MWYFVTOEWCMRRHXCZZHOGG9AVAEVTEIA9UDKUYBMORIPQIMT9HXSOZWSGSDWQTAOTUZOGINDHRUVAGDYIZRTDERKZRSRRQVQ9KODP9EDOLRDDR9LYVUCZLDQZNAEDGANPXOVRR9JAQZPFERPEVHONISCUYWAAPODZYGSKLTMUUNQNMMHVBWQAQKLJ9GMDDMBFIMRWCTPOTCHMTTCWMJRNRAWVQMGBYPM9MSEPZWXRYWQNH99XKKJ9HRGTFWPCMVEGLWVEOYUVTKIQPVQ99YEXHCMMOIGMRMNLEYT99SLVLWNGCQABBHUCXOQKPLBLFCQPCGQMZDSAGIDJLEJILONNPBPROGOAAILXIZP9PDHFIOEDXDVSTRQQPKEHVRVFEITQJPUDDOKFVXPL9WZUP9PZB9CINTFZVXKUFHAEMSMXRBDZUQRCHGBZAVPSHZJOOQVTPZHDRFXTPLL9TVQMQ9OMVFCDMODIY99CCBU9BYXWHGHARA9YAKUTSASNACYNZHXNSVVPKO9DCBOMEYSHOJJSTUODSHRYABZYTQWQRIFRSUPIHGDKRZHFVDVCVXVNOMERBREMUHISBH9EUEOSXLSRYPXVTQYGTJGYQVZMLNYQSZWCOMGT9ILKDGYATPFQDPHIWMGNLTIHCBZVFVAFZTYUI9IFWRHZSRXQYMLQXYYIJKRYDZICEYYDIXMGTNSB9HKGBBGJEXYVOTCSADNSMHXUHVJTXBWEPQPYETXPLQEYAMDCVXTZCIOG9ZPLGFGCYAZXNRQLECHGEJBHOZYXHTCQFY9HFBGOZCQTGYDNZICOYBETOOHSEVQWJXMY9DZXDLKEMJ9SGWDZIWFNBAVWMUKYWZHOUNBSJDTSCXGMKXWQMYASBRDQMIACFZTKMGQUBZQJFGHLAHLTB9IFY9FNUUFAXMORHGRIZFTMPLBADAYULJO9NWZBNVYHIJTXITTSVRJCSKMKNPPKGYXGHPCC99LIWUY9DSSCBLOEUNYLSYOTJQADBVSZNIHRGGIAIEEGO9ULQNCTHYDOC9IIVIVEWEKPVQCDUAZSLLIKMVDVSAMDB9TTM9NDZMEPOLCMRRTCAEUXGOIERCMSJWIBJPTSUUMRZAUKHUTIWLO9TESS9DCBDPMFQXHXKIKAYTOEEOIXPBYAUFZOVXHOJJDXJZPVSBAFFUDYNSBWOSKD9GIKLZNTRAFZUTZVMQDNBXPSBIGN9LEOVYKEFFFLL9UNCINHMZOTWVWEJADYTI9SWEVJAQA9RKUSCINMDUOURZQELDVRGBHN9XYVSMHZW9VSKSJABDXHHKHPOO9UWVVTKQQZCQIAFVCKPXBDVRWRLJPGBMNVWVTTNQJIRQVQDXBU9AKKTGRJLWQZXJIIDPFSBYLSJWAOCTKMDZ9AUVMHPNDZIPVRWZFBJKZQU9XPMCNQNSSSF9IO9GH9YINWLPCSUHVFCYKKJYULNERVMKCXVPNJLW9AJVD9MYLENSJTHMU
XN9BTYVMMJNRNBVQMDUXSAYYMGILROSXFKCFEU9ENJDXDFPQLIHGNKUYWZEEC9SP9GJHYXUEQBGHRPHOWTKRLTSEUWECUHAJJEMTCRFCORHGN9SJVK9NBTLZPC9SOZVDBZWRTSTIAKXNLLWMGAHPMAYQRVECXLGVQNEDIRCVQEFSZRTENMPVPAXMBWNWXASJYGPASVXEVCLQLSUWWZLIJAGCNACAIJRYJZ9GZTQUJHRGVEJNF9GIZMEOD9ACIRJMYYDFVTUJGGAQTUCTQZJZIJVFEDLQ9JAYQUODVM9CMCQSDKBWIRKTYSNRINAQEBHSDSHIVS9YHMNZUWGA9CD9UGUPKQUZWERLCOOOWHSHBP9ZQFXUVNBPFCZMV9HXGDCTAMJRQNNTJMJQRDSMFKEKQGMJDHTWYGTQAVEJVHXKVIEPLHEZSOUGOZNEBVNKIPUEBBXWYWYGGBMTZKTYYYFWV9LCZNHGZSQXSZSPOY

0 comments on commit d7679b4

Please sign in to comment.