Rewrite to static site

With a complete reorganisation of the directory structure and most of
the content converted to pandoc-flavoured markdown.

Some TODO's left before this can go live:
- Main page
- Atom feeds
- Bug tracker
This commit is contained in:
Yorhel 2019-03-23 11:52:08 +01:00
parent 5c85a7d32f
commit 6242b2ee9c
291 changed files with 4346 additions and 6141 deletions

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxkBAAoJEGI5TGmMJzn6KJUQAOdaZcV6NWqrtB4rsNmSCp8/
i3QQpIpdywfPqPH+AzQ0ednYrojKFAN6HHfbyaH5L3f2QbdlV8tHR5WK8F5WPigu
saC7hL1HX/JVEO9G+zQBPUDr0JB/6+0S73lPaFY7F84j7UDNu6DyX3t57VDqc5hb
fHQ/ZsBAyIZOBNLtBvfdcduVWBtNnTJu9IaZjqneo9UQnbkmjBqHRbp5UEP5m7Sg
r3XUAXQdQz8H/f8yXS3Y3PbifhzkMFM3mgkYREGyihmkqbeqeR1pulINcEAHe8zS
+DFHdhakothq0AW8QZxQ0jGcSAYMc/oqDFkiN69Wao2QvHsGcfRKUKINrrRshfW/
2wXVqpFe6xGNj0GOwubgsam2LGFpZIXmYR6StLENM6EolpGmuG4W5ZuH5tbdwafB
tgi6xoAF1SVKzpaYHMCyrcFtSa55A/r75tihRKyCi8CCfISEFAdns8G1neazH5K9
BlaUAmHDTPe93P8Li/8CdXlrU+HtTkZZ9qBJGmUwB/tznZsiAjWdvRKaKld9W8RC
+UguA42qXQtdZh7Qu7Gz5S/9DZe3y3b5sHJhkKU7pghAvP4hLmqL0uTdHpPlVlfd
whLHo6Je9bJi2vhi8M4Vle3CMgyT3epotCuqre0ix9kMEzd3fGemd8Kr7cpTRrdq
GeoC03nfiEh/cFnyrVdo
=jKN5
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
3dec988da6388fa32cbaeaa6a6a94b14 TUWF-0.1.tar.gz

View file

@ -0,0 +1 @@
aadd234dc1b703340df636801cd66b477fdb8b45 TUWF-0.1.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJPF9/6AAoJEGI5TGmMJzn6ZNwP/2zfqGyUV+KUmXPFuFXVWY4s
xE2O+mgZpN+Gr53ZLG05OrlwnwJhDoQmiBjOvoOo5gHpMvRilGE6wbcoClV+VFX1
4L4FDJMAz9ij7iUP4Ex4lo09RjSfDt78RbK4ThnzA+n0+NwEJ71heolOVZQLl4f5
GLLsx787djtNI1cA7s8h57PxAHiNQX9O3egHTNP46mHd7zMQ7EDUFf6yOiHoiliR
8zcWWj0p2PwkI01D7DP754MU5XAU7cM4Qyx8IvGtFVGPT1LCZ4VtBfMnQTkIV2Op
EBD4Qfj/V3r1trOf+4RujNY9kfZKotUvMLIgZ57o5JL8mMY243Q74Kb4ATFmFyvs
APt//iR/l9CpP1ztq3GDjrHn0OZw1u4STEBzZZHU8B5T4690ZOXIC82b+kxA/wSA
sPq4bbm+FpDdPGlFVAb7iR/7aJfNHzkMHVvcOGowdtik1kfb94/xX1R0R2dWOWVY
Bz+jyCeBAAsk05cicYDdjuJl/N09KO2i5Bos0SwiXzp2d/HQoGMqJU9R8OiobgZ9
ZsU33kQdN/9ZAjzeKqiKe88Oz4LUb2YfKUgajDZDW6pHuYmoa22Fz1hLtvDVOsOY
iIE5fV2ciylVJbkotFf3rtxv1KY5uIWSc6Dxgwn0VcHEkz7GAwYLz0FZ3focb9M2
rkMamcnJkkBflSYKElEo
=0AT+
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
8d2e443764dea673d2a30379cd9fa149 TUWF-0.2.tar.gz

View file

@ -0,0 +1 @@
0d3e86975e47f07fe12b25dc1753cb6a105cc6df TUWF-0.2.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
iQIcBAABCgAGBQJWB5ibAAoJEGI5TGmMJzn6mrQQAOt844yvmllGTuOIV6RLfLHP
nk5n7F0i2NglktCeN3DQXeIDIXPx2IgE1XYu7n0OFCQxiUjpMHx7HdSz53E4XHt6
HR8tkfsQgrhX8bg0eP7ehb9wHfQh/4rL/UtHwSg94IacfPPffrjDwH9P1BhfMrfc
K78VmzdIxVbTIH+TDvQWPBY9ae/ZmoC6y7A9pDwTs3OaL1n1l9qSmnRnEtGF+7te
w8lIPJyMlD8Gfg9g7+5eZBCeyfwEZXPfHOHYFaFYU5juqdc7M7sAmsixgJ7WEV2G
G2+jNEgZXOjpQu81auVZk6NaQJbP5vdeu5yQUyhlYiqqOS94o+ljNEn+5wXMi67D
23m3hf91rHQqdmsb72tzly44/rGZmLBEZkNsdqlZNsFomgKLS+T/D4n6UqfONuDH
y0DfgaFtm0AxAmlFyUVM83aJFXkttGU+59G3LPO5PeNAjDA1UZamAqJyac+IeLj2
Ikaa73MjTPllQftgD0HOnKPV/a2QfBMw3jajEzOA/Vd0fLsWz90hwwYYgCww2Tfe
KhhzW917S+VfOsRVvnI//JeSfEbZ99OUt/9z4o98TOt2mKUN00epLTej7qcvFvAy
oul4H/6AxDKOj2IGDHoC9JxKxa5RbXbhkCDMu2qdg8YSe3/EKFn05Ohzw53Il5o9
8Ag6HUAyvdopGu0Wjo4H
=Gq1J
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
fe6ed1c21b43bd8b57cee447c3093d28 TUWF-1.0.tar.gz

View file

@ -0,0 +1 @@
c4be0e1b08896053bbccec0194583b7ab03e1cbc TUWF-1.0.tar.gz

View file

@ -0,0 +1,16 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAloaeBgACgkQYjlMaYwn
OfqtFRAA0ZXztAZ2GDb1puNXknJO1kDFam2DXUHXQvuNW9rn2I7nH0utdW/VWvt/
vpWAyKT8kvywpK7m1JGjVj8RiE/sgncTpYi3E3H+Dv6OO0z0dEoq6VUS3Mc5Gk1b
1TclOZt3uShK9PgjGsjJZcyMGvvgXMUO/5peBlbXDgWhokfVWZrM5r58Ve+dJwQn
4s5IDjoIqZy7RuSzlhkdT661NftfWpvjvr+XMmS3kdBsiIxTUrbPnUp1T85yYslA
0UpMCnGIwYdbu1J3igAMRIRmp0ix7e4ANagh97MVeCueO6acHAYqe3uui5SHwE+7
iuHWmyZTQtuikrZjpNBDMbQxUwk79SQaYOM5bXDn/pTTAcBm1RU2Sf3Slnk+Xlrk
kKjqgvf7qfx3zZKNMuTvxslzF4HUbE4/CB9I6Ccz4KnQ6qkyQMMPeo4ETjumCpPa
5CosdSFF4vrPHO7v6KTc2Q+l5gp4900Qb/wxydUptSJTTsCFNNRMwpkDwtSh9wfn
rU9L6vx54aem3nucqStFwe3gIkuu9NNqGCwpUu9Dga0/gnxP5i6O/bNC8MH3tnsR
yTodqjGQWsTtmpDaLnZX1TeCWCgjtVvfbrTqTUiM8l2BQnTVtgBJbGZDHnC1nCs0
/MnIEXxfLqrWynPieeAKSuxs2zrToR9PFDuWSVs6X0oCuo8SaUI=
=9nQv
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
4629606ce88c28e2ea767bf7b356fe9c TUWF-1.1.tar.gz

View file

@ -0,0 +1 @@
7f2c4018674f7009db5d3d30218d379210c3a972 TUWF-1.1.tar.gz

View file

@ -0,0 +1,16 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAlqJW1IACgkQYjlMaYwn
OfoX8xAAtvV3oCpZqDEEJl50MJTy8dncFo3nMxKfD7xbsv4pKbPh6sj3kEd+PcdM
kbQxECdKZbNx8LgtjW7jNwIsU6SoEV4WZUWN3dZiVEGr+qF5Gc9101M1c5z99BPU
D+2QjjbcHB1MepcRaKe76eT1+KLm/nA5OqfNgQ1z626r31JriB4d+Ppd8GlDfCDq
UALjjv0qzwVEr4YBdeXClDYJ1vorEGoOyt/gqBuged86NDaeyqkZ2c/2y2HeB8If
B2PCZbYx7DFAcOz7XSJuVkeHLUvOlK3zknWMZXXeK01ev+evuVgGwe8dktQGL01P
dRl+vpJi++eFhJ57zwXYvAFlW9KWuor3YnPJms2eOZAZyHKc2WXjN581YT/Xt1s1
+r5qndZXUfgrk8tUANRKff5oaZ9xwoZ1XqBu3M3Dqrtl2RCj3TLg8KXuh19Sy0KQ
ijz1/7ZlIRXVAo+mqmb2ZE8OfqXrGRwXdCWJTZ9LsHnkY+kPfB8FdoUP93vrkV7Z
1Fu0T2Et7UWKj6Xr4qyBf/CjJZK9cy1EXfnrKVJQa5YkRVqQbnnzKFI5gv7U+GgO
hJG4Tr84bv3xJEGtcMyMrgnAcag8+7KZYiM2yd/fp7wUtxs1BJczyxevVhWMKcSM
dNsVm76AF8vsC7CCOOCXJZ9w4DfDyEWkyV4dKbFk60hkslj7BnI=
=YQqj
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
5028482611a415c22993adab05b9698e TUWF-1.2.tar.gz

View file

@ -0,0 +1 @@
3b336c065e9f8a37b2f387f9ff645c2ab2da5485 TUWF-1.2.tar.gz

166
pub/download/code/awshrink Normal file
View file

@ -0,0 +1,166 @@
#!/usr/bin/perl
# awshrink v0.1
# 2007-01-15
# Yoran Heling
# License: MIT
use strict;
use warnings;
use bytes;
# hash for easy lookup
my %shrinkable = ( map { $_ => 1 } qw|
DOMAIN LOGIN ROBOT WORMS EMAILSENDER EMAILRECEIVER
BROWSER UNKNOWNREFERER UNKOWNREFERERBROWSER SEREFERRALS
PAGEREFS SEARCHWORDS KEYWORDS SIDER_404 SIDER VISITOR
UNKNOWNREFERERBROWSER
|);
sub getstats { # read
my $fl = shift;
my @l;
seek($fl, 0, 0);
# get positions
while(<$fl>) {
last if /^END_MAP/;
next if !/^POS_([A-Z0-9_]+)\s+([0-9]+)\s+$/;
push(@l, [ $1, $2, 0, 0 ]);
}
# get sizes (bytes)
@l = sort { $a->[1] <=> $b->[1] } @l;
$l[$_][2] = ($l[$_+1] ? $l[$_+1][1] : -s $fl) - $l[$_][1]
for (0..$#l);
# get lines
for (0..$#l) {
seek $fl, $l[$_][1], 0;
<$fl> =~ /BEGIN_[A-Z0-9_]+\s+([0-9]+)/;
$l[$_][3] = $1;
}
print " Section Size (Bytes) Lines\n";
printf "%22s %12d %7d\n", $_->[0].($shrinkable{$_->[0]}?' ':'*'), $_->[2], $_->[3]
for (sort { $a->[2] <=> $b->[2] } @l);
print "* = not shrinkable\n";
}
sub fixmap { # read, write
my($fl, $FL) = @_;
my $map = '';
my @l;
seek $fl, 0, 0;
while(<$fl>) {
next if !/^BEGIN_([A-Z0-9_]+)/ || $1 eq 'MAP';
$map .= sprintf "POS_%s %-20d\n", $1, tell($fl)-length($_);
}
seek $fl, 0, 0;
seek $FL, 0, 0;
my $inmap = 0;
while(<$fl>) {
if(!$inmap && !/^BEGIN_MAP/) {
print $FL $_;
next;
}
$inmap = 1;
if(/^END_MAP/) {
printf $FL "BEGIN_MAP 27\n%sEND_MAP\n", $map;
$inmap = 0;
}
}
}
sub shrink { # read, write, %sections->{ key = section, value = lines }
my($fh, $FH, %sec) = @_;
seek $fh, 0, 0;
seek $FH, 0, 0;
while(<$fh>) {
if(!/^BEGIN_([A-Z0-9_]+)\s+([0-9]+)/ || !$sec{$1} || $sec{$1} >= $2) {
print $FH $_;
next;
}
my $sec = $1;
# read entire section
my @l;
while(<$fh>) {
last if /^END_/;
s/^[\s\r\n]+//;
s/[\s\r\n]+$//;
push @l, [ split / / ];
}
# sort section
# DOMAIN, LOGIN, ROBOT, WORMS, EMAILSENDER. EMAILRECEIVER,
# BROWSER, UNKNOWNREFERER, UNKOWNREFERERBROWSER, SEREFERRALS,
# PAGEREFS, SEARCHWORDS, KEYWORDS, SIDER_404, SIDER -> 1
# VISITOR -> 2
if($sec{$sec} > 10) { # assume sorted if we only want the first ten
@l = sort { $b->[1] <=> $a->[1] } @l if $sec ne 'VISITOR';
@l = sort { $b->[2] <=> $a->[2] } @l if $sec eq 'VISITOR';
}
# write section
printf $FH "BEGIN_%s %d\n", $sec, $sec{$sec};
print $FH join(' ', @{$l[$_]})."\n"
for (0..($sec{$sec}-1));
printf $FH "END_%s\n", $sec;
}
1;
}
sub run {
print "Usage: $@ [options] filename\n" and exit if !@ARGV;
my $file = pop;
my $ci = 0;
my $st = 0;
my %options;
while(local $_ = shift) {
/^-c$/ ? $ci++ :
/^-s$/ ? $st++ :
/^-([A-Za-z0-9_]+)$/ && $shrinkable{ uc($1) } ? $options{ uc($1) } = shift :
printf("Unknown option: %s\n", $_) && exit;
}
(!$options{$_} || $options{$_} !~ /^[0-9]+$/) && printf("Invalid value for -%s\n", $_) && exit
for keys %options;
print "Nothing to do...\n" and exit if !keys %options && !$st;
open(my $fl, '<', $file) || die $!;
my $tmpfile;
open(my $TMP, '+>', \$tmpfile);
open(my $FL, '+>', "$file~") || die $! if keys %options;
shrink($fl, $TMP, %options) && fixmap($TMP, $FL) if keys %options;
getstats(keys %options ? $FL : $fl) if $st;
close $fl;
close $TMP;
close $FL if keys %options;
rename "$file~", $file if $ci;
}
run @ARGV;

330
pub/download/code/bbcode.c Normal file
View file

@ -0,0 +1,330 @@
/*
* BBCode 2 HTML converter by //YorHel
* Copyright 2006 Y.Heling,
* License: MIT
*
* Created just to learn C, probably very ugly piece of code
* and probably with a _LOT_ of bugs... But the only way to
* learn a programming language is to code something yourself :)
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_ARGH_SIZE 500
#define MAX_TAG_SIZE 10
#define MAX_NESTED_TAGS 100
#define TAGCHARS 28
#define NUMBER_OF_TAGS 16
#define TRUE 1
#define FALSE 0
/* typedefs */
typedef enum {
B,
I,
U,
SIZE,
COLOR,
URL,
QUOTE,
QUOTE2,
IMG,
IMG2,
EMAIL,
LIST,
LIST2,
CODE,
HTML,
UNDEF, /* hack */
} TAGNAME;
typedef struct {
TAGNAME intags[MAX_NESTED_TAGS];
int curtag;
char tag[MAX_TAG_SIZE];
char argh[MAX_ARGH_SIZE];
FILE *dest;
int inlist;
int liststart;
} PARSEINFO; /* just a hack to prevent the use of global variables */
typedef struct {
char *bb;
char *html_s;
char *html_e;
char arg;
} TAGINFO; /* store global information about the tags */
/* functions */
void parsebbcode(FILE *, FILE *);
void converttag(PARSEINFO *);
void formattag(PARSEINFO *);
char endtags(PARSEINFO *, TAGNAME);
void convertchars(PARSEINFO *, const char *);
void convertchar(PARSEINFO *, const int);
void convertchararg(char *, int);
char istagchar(const int);
void err(const char *);
/* global vars (only consts!) */
const char tagchars[TAGCHARS] = "abcdefghijklmnopqrstuvwxyz/*";
const TAGINFO taglist[NUMBER_OF_TAGS] = { /* same order as TAGNAME! */
{ "b", "<b>", "</b>", FALSE },
{ "i", "<i>", "</i>", FALSE },
{ "u", "<span style=\"text-decoration: underline\">", "</span>", FALSE },
{ "size", "<span style=\"font-size: %spx\">", "</span>", TRUE },
{ "color", "<span style=\"color: %s\">", "</span>", TRUE },
{ "url", "<a href=\"%s\">", "</a>", TRUE },
{ "quote", "<span class=\"bbcode_quote_header\">Quote: <span class=\"bbcode_quote_body\">", "</span></span>", FALSE },
{ "quote", "<span class=\"bbcode_quote_header\">%s wrote: <span class=\"bbcode_quote_body\">", "</span></span>", TRUE },
{ "img", "<img src=\"", "\" alt=\"\" />", FALSE },
{ "img", "<img src=\"%s\" alt=\"", "\" />", TRUE },
{ "email", "<a href=\"mailto:%s\">", "</a>", TRUE },
{ "list", "<ul>", "</li></ul>", FALSE },
{ "list", "<ul style=\"list-style-type: %s\">", "</li></ul>", TRUE },
{ "code", "<span class=\"bbcode_code_header\">Code: <span class=\"bbcode_code_body\">", "</span></span>", FALSE },
{ "html", "", "", FALSE },
{ "", "", "", FALSE },
}; /* NOTE: not all characteristics of the BBCodes are defined above, there is also a lot of hard-coded stuff below for a few tags */
int main() {
/* printf("BBCode to HTML converter by //YorHel\n");
printf("Copyright 2006 Y. Heling\n\n");
printf("* Reading & parsing bbcode...\n");
while(1) {
FILE *file;
if((file = fopen(BBFILE, "r")) == NULL) err("Couldn't open BBFILE");
parsebbcode(file, stdout);
fclose(file);
}
printf("\n");*/
parsebbcode(stdin, stdout);
return 0;
}
void parsebbcode(FILE *file, FILE *dest) {
PARSEINFO pitemp; /* make sure we allocate the memory */
PARSEINFO *pi = &pitemp; /* but we are still going to use a pointer */
char intag = pi->inlist = pi->liststart = 0;
pi->curtag = 1;
pi->intags[0] = UNDEF;
sprintf(pi->tag, "");
sprintf(pi->argh, "");
pi->dest = dest;
int c;
char tmp[MAX_TAG_SIZE+MAX_ARGH_SIZE+4]; /* temp string, should be able to hold anything necessary */
while((c = fgetc(file)) && c != EOF) {
if(intag == 0 && c == '[') {
intag = 1;
}
else if(intag == 1 && c == '=')
intag = -1;
else if(intag != 0 && c == ']') {
intag = 0;
converttag(pi);
sprintf(pi->tag, "");
sprintf(pi->argh, "");
}
else if(intag == 1 && strlen(pi->tag) < sizeof(pi->tag)) {
if(istagchar(c)) {
sprintf(tmp, "%c", tolower(c));
strcat(pi->tag, tmp);
} else {
sprintf(tmp, "[%s", pi->tag);
convertchars(pi, tmp);
sprintf(pi->tag, "");
}
}
else if(intag == 1) {
intag = 0;
sprintf(tmp, "[%s", pi->tag);
convertchars(pi, tmp);
sprintf(pi->tag, "");
}
else if(intag == -1 && (strlen(pi->argh)+10) < sizeof(pi->argh)) {
convertchararg(tmp, c);
strcat(pi->argh, tmp);
}
else if(intag == -1) {
sprintf(tmp, "[%s=%s", pi->tag, pi->argh);
convertchars(pi, tmp);
sprintf(pi->tag, "");
sprintf(pi->argh, "");
intag = 0;
}
else
convertchar(pi, c);
}
/* some stuff left in the buffer */
if(strlen(pi->tag) > 0 && strlen(pi->argh) == 0)
fprintf(dest, "[%s", pi->tag);
else if(strlen(pi->tag) > 0 && strlen(pi->argh) > 0)
fprintf(dest, "[%s=%s", pi->tag, pi->argh);
/* automatically close opened tags */
endtags(pi, UNDEF);
}
void converttag(PARSEINFO *pi) {
/* ignore tag if we're not allowed to nest */
if((pi->intags[pi->curtag] == CODE && strcmp(pi->tag, "/code") != 0)
|| (pi->intags[pi->curtag] == HTML && strcmp(pi->tag, "/html") != 0)
|| ((pi->intags[pi->curtag] == IMG || pi->intags[pi->curtag] == IMG2) && strcmp(pi->tag, "/img"))) {
formattag(pi);
return;
}
/* parse list items */
if(!strcmp(pi->tag, "*") && pi->inlist) {
endtags(pi, LIST);
if(pi->inlist == pi->liststart)
fprintf(pi->dest, "</li>");
else
pi->liststart = pi->inlist;
fprintf(pi->dest, "<li>");
return; /* no need to parse more */
}
/* begin a tag */
if(*pi->tag != '/') {
int i; int got = -1;
for(i=0 ; i<NUMBER_OF_TAGS && got == -1 ; i++)
if(!strcmp(pi->tag, taglist[i].bb)) {
got = i;
if(strlen(pi->argh) == 0 && !taglist[i].arg)
fprintf(pi->dest, "%s", taglist[i].html_s);
else if(strlen(pi->argh) > 0 && taglist[i].arg) {
if(i != LIST2)
fprintf(pi->dest, taglist[i].html_s, pi->argh);
else
fprintf(pi->dest, taglist[i].html_s, strcmp(pi->argh, "1") ? "lower-roman" : "decimal");
}
else
got = -1;
};
if(got != -1) {
pi->intags[++pi->curtag] = got;
if(got == LIST || got == LIST2)
pi->inlist++;
}
else
formattag(pi);
return;
}
/* end a tag */
else {
char *tag = pi->tag+1; /* strip the '/' */
int i;
char got = FALSE;
for(i=0 ; i<NUMBER_OF_TAGS && got == FALSE ; i++)
if(!strcmp(tag, taglist[i].bb) && endtags(pi, i)) {
fprintf(pi->dest, "%s", taglist[i].html_e);
if(pi->intags[pi->curtag] == LIST || pi->intags[pi->curtag] == LIST2)
pi->liststart = --pi->inlist;
pi->curtag--;
got = TRUE;
};
if(!got)
formattag(pi);
}
}
char endtags(PARSEINFO *pi, TAGNAME to) {
char s = FALSE;
if(to == QUOTE || to == LIST || to == IMG)
s = TRUE;
else if(to == QUOTE2 || to == LIST2 || to == IMG2) {
s = TRUE;
to--;
}
int i = pi->curtag;
if(to != UNDEF)
while(pi->intags[i] != to && (!s || pi->intags[i] != to+1) && i > 0)
i--;
if(i) {
while(pi->intags[pi->curtag] != to && (!s || pi->intags[pi->curtag] != (to+1)) && pi->curtag > 0) {
if(pi->intags[pi->curtag] == LIST || pi->intags[pi->curtag] == LIST2)
pi->liststart = --pi->inlist;
fprintf(pi->dest, "%s", taglist[pi->intags[pi->curtag--]].html_e);
}
return TRUE;
}
else
return FALSE;
}
void formattag(PARSEINFO *pi) {
char tmp[MAX_TAG_SIZE+MAX_ARGH_SIZE+4];
if(strlen(pi->argh) == 0)
sprintf(tmp, "[%s]", pi->tag);
else
sprintf(tmp, "[%s=%s]", pi->tag, pi->argh);
convertchars(pi, tmp);
}
void convertchars(PARSEINFO *pi, const char *chars) {
int i;
for(i=0;i<strlen(chars);i++)
convertchar(pi, *(chars+i));
}
void convertchar(PARSEINFO *pi, const int c) {
if(pi->inlist && pi->inlist != pi->liststart)
return;
else if(pi->intags[pi->curtag] == HTML)
fprintf(pi->dest, "%c", c);
else if(pi->intags[pi->curtag] == IMG || pi->intags[pi->curtag] == IMG2) {
char tmp[10];
convertchararg(tmp, c);
fprintf(pi->dest, tmp);
}
else if(c == '\n')
fprintf(pi->dest, "<br />\n");
else if(c == '&')
fprintf(pi->dest, "&amp;");
else if(c == '<')
fprintf(pi->dest, "&lt;");
else if(c == '>')
fprintf(pi->dest, "&gt;");
else
fprintf(pi->dest, "%c", c);
}
void convertchararg(char *to, const int c) {
switch(c) {
case '\n' :
sprintf(to, ""); break;
case '&' :
sprintf(to, "&amp;"); break;
case '"' :
sprintf(to, "&quot;"); break;
default :
sprintf(to, "%c", c);
}
}
char istagchar(const int c) {
int i;
int c2 = tolower(c);
for(i=0;i<TAGCHARS;i++)
if(c2 == *(tagchars+i))
return TRUE;
return FALSE;
}
void err(const char *msg) {
fprintf(stderr, "ERROR: %s\n", msg);
exit(1);
}

View file

@ -0,0 +1,180 @@
/*
* echoserv.c - a simple single-threaded TCP server test
* by //YorHel
*
* Copyright 2006 Y. Heling,
* February 2006
* License: MIT
*
* Use it at your own risk
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
#define LISTEN_PORT 1337
#define MAX(x,y) ((x) > (y) ? (x) : (y))
;
#define MAX_CONNECTIONS 10
#define READ_BUFFER_SIZE 512
#define CST_FREE 0
#define CST_READ 1
#define CST_WRITE 2
typedef struct {
int fd;
char state;
char *buf;
} connections;
static connections *conns;
void error(const char *);
void close_and_free(int);
int main() {
printf("Simple TCP server by //YorHel\n\n");
printf("* Creating socket\n");
int l;
if((l = socket(AF_INET, SOCK_STREAM, 0)) < 0)
error("Can't create socket");
printf("* Setting SO_REUSEADDR on main socket\n");
int set = 1;
if(setsockopt(l, SOL_SOCKET, SO_REUSEADDR, (void *) &set, sizeof(set)) < 0)
error("Can't set SO_REUSEADDR on main socket");
printf("* Binding socket\n");
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(LISTEN_PORT);
serv_addr.sin_addr.s_addr = INADDR_ANY;
if(bind(l, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("Can't bind socket");
printf("* Listening to socket\n");
listen(l, 5);
printf("* Creating connections table\n");
conns = (connections *) malloc( sizeof(connections) * MAX_CONNECTIONS );
if(conns == (connections *) 0)
error("Can't allocate memory for connections table");
int cnum;
for(cnum=MAX_CONNECTIONS; cnum--;)
conns[cnum].state = CST_FREE;
printf("* Accepting connections\n");
/* re-use the same vars over-and-over again
* is a little faster than defining them each time */
int n, cn, newid, clifd;
char stop = 0;
fd_set rd, wr;
struct sockaddr_in cliaddr;
unsigned int clilen;
/* main loop */
while(!stop) {
/* set FDs for select() */
FD_ZERO(&rd); FD_ZERO(&wr);
n = 0;
FD_SET(l, &rd);
n = MAX(l, n);
/* set FDs for the connections */
for(cn=MAX_CONNECTIONS;cn--;) {
if(conns[cn].state == CST_READ) {
FD_SET(conns[cn].fd, &rd);
n = MAX(n, conns[cn].fd);
} else if(conns[cn].state == CST_WRITE) {
FD_SET(conns[cn].fd, &wr);
n = MAX(n, conns[cn].fd);
}
}
n = select(n + 1, &rd, &wr, (fd_set *) NULL, (struct timeval *) 0);
if(n < 0)
error("select() failed...");
if(n == 0)
continue;
/* Something happend, handle it :) */
if(FD_ISSET(l, &rd)) { /* new connection */
/* get free slot, if one */
newid = -1;
for(cn=MAX_CONNECTIONS;cn--;)
if(conns[cn].state == CST_FREE) {
newid = cn; break;
}
if(newid < 0)
printf(" *WARNING: Too many connections\n");
else {
/* accept the connection */
clilen = sizeof(cliaddr);
memset(&cliaddr, 0, clilen);
clifd = accept(l, (struct sockaddr *) &cliaddr, &clilen);
if(clifd < 0)
error("Can't accept connection");
printf(" [%d] We have a connection!!\n", newid);
conns[newid].state = CST_WRITE;
if((conns[newid].buf = malloc(READ_BUFFER_SIZE)) < 0)
error("Can't allocate memory");
sprintf(conns[newid].buf, "Hello world!\n");
conns[newid].fd = clifd;
}
}
/* checking active sockets */
for(cn=MAX_CONNECTIONS;cn--;) {
/* we can write */
if(conns[cn].state == CST_WRITE && FD_ISSET(conns[cn].fd, &wr)) {
if(write(conns[cn].fd, conns[cn].buf, strlen(conns[cn].buf)) <= 0)
close_and_free(cn);
printf(" [%d] Sent: %s", cn, conns[cn].buf);
conns[cn].state = CST_READ;
}
/* we can read */
if(conns[cn].state == CST_READ && FD_ISSET(conns[cn].fd, &rd)) {
memset((void *) conns[cn].buf, 0, READ_BUFFER_SIZE);
if(read(conns[cn].fd, conns[cn].buf, READ_BUFFER_SIZE) <= 0)
close_and_free(cn);
printf(" [%d] G0t: %s", cn, conns[cn].buf);
conns[cn].state = CST_WRITE;
if(strstr(conns[cn].buf, "exit") == conns[cn].buf) {
printf(" [%d] Closing connection\n", cn);
close_and_free(cn);
} else if(strstr(conns[cn].buf, "die()") == conns[cn].buf) {
printf("Got die() from connection #%d, dying!\n", cn);
stop = 1;
}
}
}
}
/* close all connections before dying */
for(cnum=MAX_CONNECTIONS;cnum--;)
if(conns[cnum].state != CST_FREE)
close_and_free(cnum);
close(l);
return 0;
}
void close_and_free(int cn) {
close(conns[cn].fd);
conns[cn].state = CST_FREE;
free(conns[cn].buf);
}
void error(const char *msg) {
perror(msg);
exit(1);
}

View file

@ -0,0 +1,248 @@
#!/usr/bin/perl
# grenamr v0.1
# 2008-08-01
# Yoran Heling
# License: MIT
use warnings;
use strict;
use Gtk2 -init;
our $VERSION = '0.1';
my %w;
my $m;
use constant {
C_OLD => 0,
C_NEW => 1,
C_FLG => 2,
F_REG => 0x01,
F_MAN => 0x02, # not implemented yet...
F_CON => 0x04,
};
create();
Gtk2->main;
sub create {
$w{win} = Gtk2::Window->new('toplevel');
$w{win}->signal_connect(destroy => \&close);
$w{win}->resize(500, 500);
$w{win}->move(300, 300);
$w{win}->set(title => 'GRenamR v'.$VERSION);
$w{vbGlobal} = Gtk2::VBox->new(0, 0);
$w{win}->add($w{vbGlobal});
$w{hbDir} = Gtk2::HBox->new(0, 0);
$w{vbGlobal}->pack_start($w{hbDir}, 0, 1, 0);
$w{lbDir} = Gtk2::Label->new('_Directory');
$w{hbDir}->pack_start($w{lbDir}, 0, 0, 5);
$w{fcDir} = Gtk2::FileChooserButton->new('Select a directory', 'select-folder');
$w{fcDir}->signal_connect('current-folder-changed', \&fetchdir);
$w{hbDir}->pack_start($w{fcDir}, 1, 1, 0);
$w{lbDir}->set(mnemonic_widget => $w{fcDir}, use_underline => 1);
$w{swFiles} = Gtk2::ScrolledWindow->new;
$w{swFiles}->set_policy('automatic', 'automatic');
$w{vbGlobal}->pack_start($w{swFiles}, 1, 1, 0);
$w{tvFiles} = Gtk2::TreeView->new;
$w{swFiles}->add($w{tvFiles});
$m = $w{lsFiles} = Gtk2::ListStore->new('Glib::String', 'Glib::String', 'Glib::Int');
$w{tvFiles}->set_model($w{lsFiles});
$w{tvFiles}->insert_column_with_data_func(0, '', Gtk2::CellRendererPixbuf->new, \&column_func, 0);
my $c = Gtk2::CellRendererText->new;
$w{tvFiles}->insert_column_with_data_func(1, 'Old', $c, \&column_func, 1);
$w{tvFiles}->insert_column_with_data_func(2, 'New', $c, \&column_func, 2);
$w{tvFiles}->get_column(1)->set(sizing => 'autosize');
$w{tvFiles}->get_column(2)->set(sizing => 'autosize');
$w{hbPerl} = Gtk2::HBox->new(0, 0);
$w{vbGlobal}->pack_start($w{hbPerl}, 0, 1, 0);
$w{lbPerl} = Gtk2::Label->new('_Expression');
$w{hbPerl}->pack_start($w{lbPerl}, 0, 0, 5);
$w{enPerl} = Gtk2::Entry->new;
$w{enPerl}->signal_connect('changed', \&applyfilter);
$w{hbPerl}->pack_start($w{enPerl}, 1, 1, 0);
$w{lbPerl}->set(mnemonic_widget => $w{enPerl}, use_underline => 1);
$w{imPerl} = Gtk2::Image->new_from_stock('gtk-yes', 'menu');
$w{hbPerl}->pack_start($w{imPerl}, 0, 1, 0);
$w{hbBottom} = Gtk2::HBox->new(0, 0);
$w{vbGlobal}->pack_start($w{hbBottom}, 0, 1, 0);
$w{alStatus} = Gtk2::Alignment->new(0,0.8,0,0);
$w{hbBottom}->pack_start($w{alStatus}, 1, 1, 5);
$w{lbStatus} = Gtk2::Label->new('');
$w{alStatus}->add($w{lbStatus});
$w{alBottom} = Gtk2::Alignment->new(1,1,0,1);
$w{hbBottom}->pack_start($w{alBottom}, 0, 1, 0);
$w{bbBottom} = Gtk2::HButtonBox->new;
$w{bbBottom}->set(spacing => 5);
$w{alBottom}->add($w{bbBottom});
$w{btApply} = Gtk2::Button->new('_Rename');
$w{btApply}->signal_connect('clicked', \&dorename);
$w{bbBottom}->pack_start($w{btApply}, 0, 0, 5);
$w{btClose} = Gtk2::Button->new('_Close');
$w{btClose}->signal_connect('clicked', \&close);
$w{bbBottom}->pack_start($w{btClose}, 0, 0, 5);
$w{win}->show_all;
$w{enPerl}->grab_focus;
if($ARGV[0] && -d $ARGV[0]) {
$w{fcDir}->set_current_folder($ARGV[0]);
} else {
fetchdir();
}
}
sub column_func {
my ($column, $cell, $model, $iter, $col) = @_;
my $flags = $model->get($iter, 2);
$cell->set(
$col > 0 ? (
text => $model->get($iter, $col-1),
) : (
'stock-id' => $flags & F_CON ? 'gtk-dialog-error'
: $flags & F_REG ? 'gtk-edit'
: $flags & F_MAN ? 'gtk-apply'
: 'gtk-file',
),
$flags & F_CON ? ( cell_background => '#ffcccc' ) :
$flags & F_REG ? ( cell_background => '#ccffcc' ) :
$flags & F_MAN ? ( cell_background => '#ffffcc' ) :
( cell_background_set => 0 ),
);
}
sub close {
Gtk2->main_quit;
}
sub fetchdir {
Gtk2->main_iteration_do(0);
my $d = $w{fcDir}->get_current_folder;
$w{lbStatus}->set(label => 'Loading...');
my @lst;
opendir(my $D, $d)
|| return $w{lbStatus}->set(label => 'Unable to open the selected directory');
-f $d.'/'.$_ and push @lst, $_ for (readdir $D);
closedir $D;
$m->clear;
$m->set($m->append, C_OLD, $_, C_NEW, $_, C_FLG, 0)
for (sort @lst);
$w{lbStatus}->set(label => sprintf '%d files found.', scalar @lst);
applyfilter();
}
sub applyfilter {
my $p = $w{enPerl}->get_text;
# create a list of files
my @list;
my $i = $m->get_iter_first;
do {
push @list, $m->get($i, C_OLD)
} while ($i = $m->iter_next($i));
# eval using a for loop
$i=-1;
eval 'no strict; no warnings; for (@list) { ++$i; '.$p.' }';
my $e = $@;
$w{imPerl}->set(stock => $e ? 'gtk-no' : 'gtk-yes');
# compare and update the list
my $j=0; my $matched=0;
$i = $m->get_iter_first;
do {{
next if $m->get($i, C_FLG) & F_MAN;
my $match = $e || $m->get($i, C_OLD) eq $list[$j] ? 0 : 1;
$m->set($i, C_NEW, $list[$j++], C_FLG, $match);
$matched += $match;
}} while ($i = $m->iter_next($i));
# update status
$w{lbStatus}->set(label => $e
? 'Invalid expression'
: sprintf 'Matched %d/%d files.', $matched, scalar @list);
findconflicts();
}
sub findconflicts {
# create a list of old filenames
my @old;
my $i = $m->get_iter_first;
do {
push @old, $m->get($i, C_OLD);
} while ($i = $m->iter_next($i));
# search for modified items having a new filename in that list
my $e=0;
$i = $m->get_iter_first;
do {{
next if !$m->get($i, C_FLG);
my $new = $m->get($i, C_NEW);
my $match = $new eq '' || $new =~ /\// || grep $_ eq $new, @old;
$m->set($i, C_FLG, $m->get($i, C_FLG) | F_CON)
if $match;
$e++ if $match;
}} while ($i = $m->iter_next($i));
$w{lbStatus}->set(label => 'Errors found!') if $e;
}
sub dorename {
my $d = $w{fcDir}->get_current_folder;
# count number of renamable files
my $i = $m->get_iter_first;
my $count=0;
do {
$count++ if $m->get($i, C_FLG) && !($m->get($i, C_FLG) & F_CON);
} while ($i = $m->iter_next($i));
return $w{lbStatus}->set(label => 'Nothing to do...') if !$count;
$w{lbStatus}->set(label => 'Renaming...');
my $j=0;
$i = $m->get_iter_first;
do {{
next if !$m->get($i, C_FLG) || $m->get($i, C_FLG) & F_CON;
rename $d.'/'.$m->get($i, C_OLD), $d.'/'.$m->get($i, C_NEW);
$m->set($i, C_OLD, $m->get($i, C_NEW), C_FLG, 0);
$w{lbStatus}->set(label => sprintf 'Renaming file %d/%d...', ++$j, $count);
Gtk2->main_iteration_do(0);
}} while ($i = $m->iter_next($i));
$w{lbStatus}->set(label => sprintf 'Renamed %d files.', $j);
}

View file

@ -0,0 +1,150 @@
#!/usr/bin/perl
# mdc3-parse.pl
# June 2007
# Yoran Heling
# License: MIT
use strict;
use warnings;
use Storable 'store', 'retrieve';
use POSIX;
use POSIX::strptime;
my $log = 'log'; # the microdc2 log file
my $result = 'transferred.html'; # the resulting html file
my $cache = 'logparse.pl_cache'; # file for the Storable cache
my %ts = -s $cache ? ( %{retrieve($cache)} ) : ();
my $totalsent = 0;
# using STDIN/OUT -> lazy and ugly :-)
open(STDIN, '<', $log) || die $!;
open(STDOUT, '>', $result) || die $!;
while(<>) {
s/\r?\n//;
# 28.04.2007 20:15:25
next if !s/^([0-9]{2}\.[0-9]{2}\.[0-9]{4}\s+[0-9]{2}:[0-9]{2}:[0-9]{2})\s//;
my $date = $1;
# plesnivec: Upload of `Ghost in the Shell - Stand Alone Complex - 25.avi' succeeded (transfer complete). 1.5MiB transferred in 53s (29KiB/s).
# [Anime]Spank: Upload of `Rozen Maiden - Traumend - 07.avi' succeeded (transfer complete). 177MiB transferred in 2h46m35s (19KiB/s).
# [izms]Inkognito: Upload of `Ultra Maniac TV - 16.avi' failed (communication error). 1.7MiB transferred in 3m4s (9KiB/s).
if(/^(.+): Upload of `(.+)' (succeeded|failed) \(([^)]+)\)\. ([0-9\.]+[GMK]?i?B) transferred in ([0-9dhms]+) \(([0-9]+)KiB\/s\)/) {
my($nick, $file, $sf, $msg, $sent, $time, $speed) = ($1, $2, $3, $4, $5, $6);
$file =~ s/\\'/'/g;
my $epoch = POSIX::mktime(POSIX::strptime($date, '%d.%m.%Y %T'));
$sent = calcsize($sent);
$time = calctime($time);
$totalsent += $sent;
my $k = $nick.$file;
next if $ts{$k} && grep { +$_ == $epoch } @{$ts{$k}{epoch}};
if($ts{$k}) {
$ts{$k}{sent} += $sent;
$ts{$k}{time} += $time;
$ts{$k}{chunks}++;
$ts{$k}{failed}++ if $sf eq 'failed';
$ts{$k}{succeeded}++ if $sf eq 'succeeded';
push(@{$ts{$k}{epoch}}, $epoch);
} else {
$ts{$k} = {
file => $file,
nick => $nick,
sent => $sent,
time => $time,
date => $date,
epoch => [ $epoch ], # only used for identification and sorting
# msg => $msg, # unused
chunks => 1,
failed => $sf eq 'failed' ? 1 : 0,
succeeded => $sf eq 'succeeded' ? 1 : 0,
};
}
}
}
store \%ts, $cache;
printf "\nSent %d files and %s\n", scalar keys %ts, calcsize($totalsent);
print qq|
<html>
<head>
<style>
table { font-size: 13px; }
td { padding: 0 5px 0 5px; border: 1px solid #ccc; white-space: nowrap; }
thead td { font-weight: bold; }
.tc4, .tc5, .tc7 { text-align: right }
</style>
</head>
<body>
<table cellspacing=0 cellpadding=0>
<thead><tr>
<td class="tc1">Date/time</td>
<td class="tc4">Transfered</td>
<td class="tc5">Time</td>
<td class="tc7">Speed</td>
<td class="tc6">Chunks</td>
<td class="tc2">User</td>
<td class="tc3">Filename</td>
</tr></thead>\n|;
printf(qq|<tr>
<td class="tc1">%s</td>
<td class="tc4">%s</td>
<td class="tc5">%s</td>
<td class="tc7">%.2f KiB/s</td>
<td class="tc6">%d/%d/%d</td>
<td class="tc2">%s</td>
<td class="tc3">%s</td>
</tr>\n|,
$ts{$_}{date},
calcsize($ts{$_}{sent}),
calctime($ts{$_}{time}),
$ts{$_}{sent}/($ts{$_}{time}||1),
$ts{$_}{chunks}, $ts{$_}{succeeded}, $ts{$_}{failed},
$ts{$_}{nick},
$ts{$_}{file},
)
for (sort { $ts{$b}{epoch}[0] <=> $ts{$a}{epoch}[0] } keys %ts);
print qq|</table>
</body>
</html>|;
sub calcsize { # in KBytes by default, to avoid a 32bit int overflow
if($_[0] =~ /^([0-9\.]+)(GiB|MiB|KiB|B)$/) {
return $2 eq 'B' ? $1/1024 :
$2 eq 'KiB' ? $1 :
$2 eq 'MiB' ? $1*1024 :
$1*1024*1024;
} else {
my $r = $_[0]; my $x = 'KiB';
if($r > 1024) { $r/=1024; $x='MiB' }
if($r > 1024) { $r/=1024; $x='GiB' }
return sprintf "%.1f %s", $r, $x;
}
}
sub calctime {
if($_[0] =~ /[dhms]/) {
my @t = reverse split(/[dhms]/, $_[0]);
return ($t[3]||0)*86400 + ($t[2]||0)*3600 + ($t[1]||0)*60 + $t[0];
} else {
my $r = $_[0]; my $x = '';
if($r > 24*3600) { $x .= int($r/(24*3600)).' d '; $r%=24*3600; }
$x .= sprintf '%d:%02d:%02d',
int($r/3600),
int(($r%3600)/60),
($r%3600) % 60;
return $x;
}
}

View file

@ -0,0 +1,99 @@
/* nccolour.c - Print out some ncurses colours.
*
* Compile using:
* gcc nccolour.c -o nccolour -lncurses
*
* Written by Yoran Heling <projects@yorhel.nl>
*
* Date: 2011-06-11
* License: MIT
* Web: http://dev.yorhel.nl/dump/nccolour
*/
#include <stdlib.h>
#include <curses.h>
struct colour {
int code; char *desc;
} colours[] = {
{ -1, "default" },
{ COLOR_BLACK, "BLACK" },
{ COLOR_RED, "RED" },
{ COLOR_GREEN, "GREEN" },
{ COLOR_YELLOW, "YELLOW" },
{ COLOR_BLUE, "BLUE" },
{ COLOR_MAGENTA, "MAGENTA" },
{ COLOR_CYAN, "CYAN" },
{ COLOR_WHITE, "WHITE" },
};
void print_colourpart(int attr, int i) {
addstr(" ");
attron(attr | COLOR_PAIR(i*6+1));
addstr("FD");
addstr(" ");
attron(attr | COLOR_PAIR(i*6+2));
addstr("FB");
attroff(attr | COLOR_PAIR(i*6+2));
addstr(" ");
attron(attr | COLOR_PAIR(i*6+3));
addstr("FW");
attroff(attr | COLOR_PAIR(i*6+3));
addstr(" ");
attron(attr | COLOR_PAIR(i*6+4));
addstr("BG");
attroff(attr | COLOR_PAIR(i*6+4));
addstr(" ");
attron(attr | COLOR_PAIR(i*6+5));
addstr("BD");
attroff(attr | COLOR_PAIR(i*6+5));
}
int main(int argc, char **argv) {
if(!initscr()) {
printf("Error initializing screen.\n");
exit(1);
}
if(!has_colors()) {
printf("This terminal does not support colours.\n");
exit(1);
}
start_color();
// this prevents ncurses from forcing a white-on-black colour scheme,
// regardless of what scheme is used by the terminal.
use_default_colors();
attron(A_BOLD);
mvaddstr(0, 0, "Colour FD FB FW BG BD BFD BFB BFW BBG BBN");
attroff(A_BOLD);
int i;
for(i=0; i<sizeof(colours)/sizeof(struct colour); i++) {
init_pair(i*6+1, colours[i].code, -1);
init_pair(i*6+2, colours[i].code, COLOR_BLACK);
init_pair(i*6+3, colours[i].code, COLOR_WHITE);
init_pair(i*6+4, colours[i].code, colours[i].code);
init_pair(i*6+5, -1, colours[i].code);
mvaddstr(i+2, 1, colours[i].desc);
move(i+2, 8);
print_colourpart(0, i);
print_colourpart(A_BOLD, i);
}
mvaddstr(i+3, 2, "FD = Front colour on default background");
mvaddstr(i+4, 2, "FB = Front colour on black background");
mvaddstr(i+5, 2, "FW = Front colour on white background");
mvaddstr(i+6, 2, "BG = Front and background colour");
mvaddstr(i+7, 2, "BD = Background colour with default front colour");
mvaddstr(i+8, 2, "B?? = As above, with A_BOLD enabled");
mvaddstr(i+10, 0, "Hit any key to exit.");
refresh();
getch();
endwin();
return 0;
}

326
pub/download/code/vinfo.c Normal file
View file

@ -0,0 +1,326 @@
/* vinfo - A small commandline visual novel info display thingy
Last modified: 2009-11-16
This is just a simple example program using the public VNDB API,
this program is neither useful nor actively maintained. Feel free
to extend it to suit your needs.
Requirements:
- A POSIX-compatible system
- GNU getopt()
- json-c (http://oss.metaparadigm.com/json-c/)
Compile:
gcc vinfo.c `pkg-config --cflags --libs json` -o vinfo
Usage:
vinfo -u <username> -p <password> <vnid>
TODO:
- Giving password on the commandline is a really bad idea,
need to fix an alternative method.
- Display more info on VN info output (links/description)
- Make host/port configurable
- VN searching
- More error checking on the received JSON data
- Producers/releases?
Copyright (c) 2009 Yoran Heling
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#define PROGRAM "vinfo"
#define VERSION 0.1
#define SERVER "81.204.242.156" /* beta, you may want to change this to whatever api.vndb.org resolves to */
#define PORT 19534
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <json.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#define WS "\011\012\015\040"
#define DIE(str) { perror(str); exit(1); }
char *user, *pass;
int sock;
/* sends command and returns reply */
char *docmd(char *cmd) {
char *res, *fmt;
unsigned int start, end, read = 0, size = 1024;
int r;
json_object *json;
if(send(sock, cmd, strlen(cmd), 0) < 0)
DIE("send");
/* receive data */
res = malloc(size);
while(memchr(res, 4, read) == NULL) {
if(read > 102400) {
printf("ERROR: Too long reply.\n");
exit(1);
}
if(size-read < 500) {
size *= 2;
res = realloc(res, size);
}
if((r = recv(sock, res+read, size-read, 0)) < 0)
DIE("recv");
read += r;
}
/* remove leading and trailing whitespace */
end = ((char *)memchr(res, 4, read))-res;
res[end--] = 0;
while(strspn(res+end, WS))
end--;
start = strspn(res, WS);
if(start == 0)
fmt = res;
else {
fmt = malloc(end-start+1);
strcpy(fmt, res+start);
free(res);
}
/* check for error response */
if(!strncmp(fmt, "error", strlen("error"))) {
res = fmt+strlen("error");
res += strspn(res, WS);
json = json_tokener_parse(res);
if(json != NULL && json_object_is_type(json, json_type_object)) {
printf("ERROR(%s): %s\n",
json_object_get_string(json_object_object_get(json, "id")),
json_object_get_string(json_object_object_get(json, "msg")));
json_object_put(json);
} else {
printf("Received something strange...\n> %s\n", fmt);
}
free(fmt);
exit(1);
}
return fmt;
}
/* opens the TCP socket and logs in */
void login() {
struct sockaddr_in addr;
json_object *arg;
const char *json;
char *cmd, *res;
/* connect */
if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
DIE("socket");
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_aton(SERVER, &addr.sin_addr);
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
DIE("connect");
/* construct login command */
arg = json_object_new_object();
json_object_object_add(arg, "protocol", json_object_new_int(1));
json_object_object_add(arg, "client", json_object_new_string(PROGRAM));
json_object_object_add(arg, "clientver", json_object_new_double(VERSION));
json_object_object_add(arg, "username", json_object_new_string(user));
json_object_object_add(arg, "password", json_object_new_string(pass));
json = json_object_to_json_string(arg);
cmd = malloc(strlen(json) + 10);
sprintf(cmd, "login %s\04", json);
json_object_put(arg);
/* login */
res = docmd(cmd);
free(cmd);
if(strncmp("ok", res, 2)) {
printf("ERROR: Received something strange.\n> %s\n", res);
free(res);
exit(1);
}
free(res);
}
void vninfo(int vid) {
char cmd[50], *res, *tmp, *tmp2;
const char *str;
int i, n;
json_object *json, *vn, *itm;
login();
sprintf(cmd, "get vn basic,details (id=%d)\04", vid);
res = docmd(cmd);
if(strncmp("results", res, 7)) {
printf("ERROR: Received something strange.\n> %s\n", res);
exit(1);
}
tmp = res+7;
tmp += strspn(tmp, WS);
if((json = json_tokener_parse(tmp)) == NULL || !json_object_is_type(json, json_type_object)) {
printf("ERROR: Received something strange.\n> %s\n", res);
exit(1);
}
/*printf("\n%s\n\n", tmp);*/
/* note: may want to put in some checks on whether the data indeed confirms to what we expect */
if(json_object_get_int(json_object_object_get(json, "num")) < 1) {
printf("No VN with that ID.\n");
exit(1);
}
vn = json_object_array_get_idx(json_object_object_get(json, "items"), 0);
/* header + titles */
printf("------------------------------ v%-5d ----------------------------\n", vid);
printf(" Title : %s\n", json_object_get_string(json_object_object_get(vn, "title")));
if((str = json_object_get_string(json_object_object_get(vn, "original"))) != NULL)
printf(" Official : %s\n", str);
/* aliases (string processing in C, meh) */
str = json_object_get_string(json_object_object_get(vn, "aliases"));
if(str != NULL) {
printf(" Aliases : ");
tmp = strdup(str);
tmp2 = tmp;
i = -1;
do {
i++;
if(!tmp[i] || tmp[i] == ',' || tmp[i] == '\n') {
if(tmp2 != tmp)
printf(" ");
tmp2 += strspn(tmp2, ", \n");
n = tmp[i];
tmp[i] = 0;
printf("%s\n", tmp2);
if(n) {
i++;
tmp2 = tmp+i;
}
}
} while(tmp[i]);
free(tmp);
}
/* release date */
str = json_object_get_string(json_object_object_get(vn, "released"));
printf(" First release : %-10s\n", str != NULL ? str : "-");
/* length */
itm = json_object_object_get(vn, "length");
if(json_object_is_type(itm, json_type_int)) {
printf(" Length : ");
switch(json_object_get_int(itm)) {
case 1: printf("Very short\n"); break;
case 2: printf("Short\n"); break;
case 3: printf("Medium\n"); break;
case 4: printf("Long\n"); break;
case 5: printf("Very long\n"); break;
}
}
/* languages */
itm = json_object_object_get(vn, "languages");
if(json_object_array_length(itm) > 0) {
printf(" Available in : ");
for(i=0; i<json_object_array_length(itm); i++) {
if(i)
printf(", ");
printf("%s", json_object_get_string(json_object_array_get_idx(itm, i)));
}
printf("\n");
}
/* platforms */
itm = json_object_object_get(vn, "platforms");
if(json_object_array_length(itm) > 0) {
printf(" ...for : ");
for(i=0; i<json_object_array_length(itm); i++) {
if(i)
printf(", ");
printf("%s", json_object_get_string(json_object_array_get_idx(itm, i)));
}
printf("\n");
}
json_object_put(json);
free(res);
}
void usage() {
printf("%s -u username -p password query\n", PROGRAM);
exit(1);
}
int main(int argc, char **argv) {
char *query;
int r;
user = pass = query = NULL;
while((r = getopt(argc, argv, "-u:p:")) >= 0) {
switch(r) {
case 'u':
user = optarg;
break;
case 'p':
pass = optarg;
break;
case '\1':
query = optarg;
break;
default:
usage();
}
}
if(!pass || !user || !query)
usage();
if(sscanf(query, "%d", &r) == 1 && r > 0) {
vninfo(r);
} else {
printf("Sorry, searching is not supported yet\n");
exit(1);
}
return 0;
}

View file

@ -0,0 +1,342 @@
/*
* YAPong.c 0.01 - Yet Another pong clone, made by //YorHel
*
* Copyright 2006 Y.Heling.
* 2006-02-22
* License: MIT
*/
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <signal.h>
#include <sys/time.h>
#define DI_UP 1
#define DI_DOWN 2
#define DI_RIGHT 3
#define DI_LEFT 4
void movepadel(char, char);
void startgame();
void drawpadels();
void updatescore();
void drawframe();
void updatedot();
void movedot(int);
int print_help(char *);
int winrows, wincols, padsize, padposL, padposR, scoreL,
scoreR, dotX, dotY, delay, padstep, dotstep;
char direX, direY, started, paused, scored, autosize;
WINDOW *win;
int main(int argc, char *argv[]) {
/* defaults */
autosize = 0;
padstep = 1;
dotstep = 1;
winrows = 25; wincols = 80;
padsize = ((winrows-3)/10);
delay = 50 * 1000;
/* args */
{
char *name = *argv++;
char *ch;
while(ch = *argv++) {
if(!strcmp(ch, "-h"))
return print_help(name);
else if(!strcmp(ch, "-l")) {
int level = atoi(*argv++);
switch(level) {
case 1 : delay = 100*1000; padsize = 6; padstep = 2; dotstep = 1; break;
case 2 : delay = 80*1000; padsize = 6; padstep = 2; dotstep = 1; break;
case 3 : delay = 65*1000; padsize = 5; padstep = 1; dotstep = 1; break;
case 4 : delay = 50*1000; padsize = 3; padstep = 1; dotstep = 1; break;
case 5 : delay = 80*1000; padsize = 3; padstep = 1; dotstep = 2; break;
default :
printf("ERROR: unknown level %d\n", level);
return 0; break;
}
}
else if(!strcmp(ch, "-d")) {
delay = atoi(*argv++) * 1000;
if(delay >= 1000*1000 || delay == 0) {
printf("ERROR: delay should be an integer between 0 and 1000\n");
return 1;
}
}
else if(!strcmp(ch, "-p")) {
padsize = atoi(*argv++);
if(padsize > wincols-3 || padsize == 0) {
printf("ERROR: padel size should at least be 1 and should not be too high\n");
return 1;
}
}
else if(!strcmp(ch, "-s")) {
if(!strcmp(*argv, "auto")) {
autosize = 1; *argv++;
} else {
wincols = atoi(*argv++);
winrows = atoi(*argv++);
autosize = 0;
if(wincols < 20 || winrows < 5) {
printf("ERROR: Window size should at least be 20x5\n");
return 1;
}
}
}
else if(!strcmp(ch, "-ps")) {
padstep = atoi(*argv++);
if(padstep > padsize || padstep <= 0) {
printf("ERROR: padstep should at least be 0 and should not be larger than padsize\n");
return 1;
}
}
else if(!strcmp(ch, "-ds")) {
dotstep = atoi(*argv++);
if(dotstep <= 0) {
printf("ERROR: dotstep should be a positive integer\n");
return 1;
}
}
else {
printf("ERROR: no such option: %s\n", ch);
return print_help(name);
}
}
}
/* initialize */
if( (win = initscr()) == NULL) {
fprintf(stderr, "ERROR: Can't initialize ncurses\n");
return(1);
}
cbreak(); /* imidiatly get input chars */
noecho(); /* don't print input chars */
keypad(stdscr, TRUE); /* also get other keys */
curs_set(0); /* hide cursor */
if(autosize)
getmaxyx(stdscr, winrows, wincols);
/* non-changable stuff */
padposL = padposR = ((winrows/2)-(padsize/2));
scoreL = scoreR = 0;
dotX = (wincols/2);
dotY = (winrows/2)-1;
direX = DI_RIGHT;
direY = DI_DOWN;
started = paused = 0;
mvaddstr(0, 0, "Initializing, please wait...");
refresh();
clear();
/* draw stuff */
drawframe();
drawpadels();
mvaddch(dotY, dotX, '0');
refresh();
/* get keyboard input */
int ch;
while(1) {
ch = getch();
switch(ch) {
case KEY_UP :
movepadel('r', 'u'); break;
case KEY_DOWN :
movepadel('r', 'd'); break;
case 'a' :
movepadel('l', 'u'); break;
case 'z' :
movepadel('l', 'd'); break;
case ' ' :
if(!started)
startgame();
else if(scored) {
scored = 0;
mvaddch(dotY, dotX, ' ');
dotX = (wincols/2);
dotY = (winrows/2)-1;
refresh();
} else if(!paused)
paused = 1;
else if(paused)
paused = 0;
break;
case 'q' :
goto end;
break;
}
}
/* cleanup */
end:
erase();
mvaddstr(0, 0, "Thank you for playing Yet Another pong game. :)\nPlease visit http://yorhel.nl/ when your bored...\n");
refresh();
delwin(win);
endwin();
refresh();
return 0;
}
void movepadel(char which, char direct) {
if(paused || scored || !started)
return;
int *pos = which == 'r' ? &padposR : &padposL;
*pos += direct == 'u' ? -1*padstep : padstep;
if(*pos < 2)
*pos = 2;
if(*pos > winrows-padsize-2)
*pos = winrows-padsize-2;
drawpadels();
move(wincols-1, 0);
refresh();
}
void startgame() {
struct itimerval t;
t.it_interval.tv_sec = t.it_value.tv_sec = 0;
t.it_interval.tv_usec = t.it_value.tv_usec = delay;
setitimer(ITIMER_REAL, &t, NULL);
struct sigaction s;
s.sa_handler = movedot;
s.sa_flags = 0;
sigemptyset(&s.sa_mask);
sigaction(SIGALRM, &s, NULL);
started = 1;
}
void drawframe() {
mvaddstr(0, 3, "left");
mvaddstr(0, wincols-8, "right");
mvaddstr(0, ((wincols/2)-7), "YAPong by //YorHel");
move(1, 0);
hline(ACS_HLINE, wincols);
move(winrows-1, 0);
hline(ACS_HLINE, wincols);
updatescore();
}
void updatescore() {
char scl[3], scr[3];
sprintf(scl, "%02d", scoreL);
sprintf(scr, "%02d", scoreR);
mvaddstr(0, 0, scl);
mvaddstr(0, wincols-2, scr);
}
void drawpadels() {
int c;
for(c=winrows; c--; ) {
if(c < 2 || c >= winrows-1)
continue;
/* left paddel */
if(c >= padposL && c <= padposL+padsize)
mvaddch(c, 0, ' ' | A_REVERSE);
else
mvaddch(c, 0, ' ');
/* right paddel */
if(c >= padposR && c <= padposR+padsize)
mvaddch(c, wincols-1, ' ' | A_REVERSE);
else
mvaddch(c, wincols-1, ' ');
}
}
/* called from signal */
void movedot(int signal) {
if(signal != SIGALRM || !started || paused || scored)
return;
mvaddch(dotY, dotX, ' ');
dotX += direX == DI_LEFT ? -1*dotstep : dotstep;
dotY += direY == DI_UP ? -1*dotstep : dotstep;
if(direY == DI_UP && dotY <= 2) {
direY = DI_DOWN;
dotY = 2;
}
if(direY == DI_DOWN && dotY >= winrows-2) {
direY = DI_UP;
dotY = winrows-2;
}
if(direX == DI_RIGHT && dotX >= wincols-2) {
direX = DI_LEFT;
dotX = wincols-2;
if(dotY < padposR || dotY > padposR + padsize) {
scored = 1;
scoreL++;
direX = DI_LEFT;
updatescore();
}
}
if(direX == DI_LEFT && dotX <= 1) {
direX = DI_RIGHT;
dotX = 1;
if(dotY < padposL || dotY > padposL + padsize) {
scored = 1;
scoreR++;
direX = DI_RIGHT;
updatescore();
}
}
mvaddch(dotY, dotX, '0');
move(wincols-1, 0);
refresh();
}
int print_help(char *name) {
printf("Usage: %s [options]\n\n", name);
printf("Options:\n");
printf(" -h This help message.\n");
printf(" -d int Specifies the interval between every move\n");
printf(" of the dot. You can speed up the game by\n");
printf(" setting this to a lower value.\n");
printf(" -p int Specifies the size of each padel in pixels\n");
printf(" -s x y Specifies the size of the window, or set\n");
printf(" to 'auto' to use the size of your current\n");
printf(" terminal. Recommended and default size is\n");
printf(" 80x25.\n");
printf(" -ps int Specifies the amount of pixels the padels\n");
printf(" move each time\n");
printf(" -ds int The amount of pixels the dot moves each\n");
printf(" time, setting this to a larger value\n");
printf(" increases game speed a lot.\n");
printf(" -l level The game-level, higher levels are more\n");
printf(" difficult. See below for more information\n\n");
printf("Levels:\n");
printf(" option equals to\n");
printf(" -l 1 -d 100 -p 6 -ps 2 -ds 1\n");
printf(" -l 2 -d 80 -p 6 -ps 2 -ds 1\n");
printf(" -l 3 -d 65 -p 5 -ps 1 -ds 1\n");
printf(" -l 4 -d 50 -p 3 -ps 1 -ds 1\n");
printf(" -l 5 -d 80 -p 3 -ps 1 -ds 2\n");
printf(" Please note that all the levels are meant for a 80x25\n");
printf(" window size, level 5 might be very easy with a higher\n");
printf(" window size. In that case you should change the\n");
printf(" the options yourself.\n\n");
printf("Ingame keys:\n");
printf(" space Start/pause/resume game\n");
printf(" key_up Move right padel up\n");
printf(" key_down Move right padel down\n");
printf(" a Move left padel up\n");
printf(" z Move left padel down\n");
printf(" q Quit game\n");
return 0;
}

335
pub/download/code/yapong.c Normal file
View file

@ -0,0 +1,335 @@
/*
* YAPong.c 0.02 - Yet Another pong clone, made by //YorHel
*
* Copyright 2006 Y.Heling.
* 2006-02-23
* License: MIT
*/
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#define DI_UP 1
#define DI_DOWN 2
#define DI_RIGHT 3
#define DI_LEFT 4
void movepadel(char, char);
void drawpadels();
void updatescore();
void drawframe();
void updatedot();
void movedot();
int print_help(char *);
int winrows, wincols, padsize, padposL, padposR, scoreL,
scoreR, dotX, dotY, delay, padstep, dotstep;
char direX, direY, started, paused, scored, autosize, autopsize;
WINDOW *win;
int main(int argc, char *argv[]) {
/* defaults */
autosize = 1;
autopsize = 1;
padstep = 1;
dotstep = 1;
winrows = 25; wincols = 80;
padsize = 0;
delay = 50;
/* args */
{
char *name = *argv++;
char *ch;
while(ch = *argv++) {
if(!strcmp(ch, "-h"))
return print_help(name);
else if(!strcmp(ch, "-l")) {
int level = atoi(*argv++);
switch(level) {
case 1 : delay = 100; padsize = 6; padstep = 2; dotstep = 1; break;
case 2 : delay = 80; padsize = 6; padstep = 2; dotstep = 1; break;
case 3 : delay = 65; padsize = 5; padstep = 1; dotstep = 1; break;
case 4 : delay = 50; padsize = 3; padstep = 1; dotstep = 1; break;
case 5 : delay = 80; padsize = 3; padstep = 1; dotstep = 2; break;
default :
printf("ERROR: unknown level %d\n", level);
return 0; break;
}
}
else if(!strcmp(ch, "-d")) {
delay = atoi(*argv++);
if(delay >= 1000 || delay == 0) {
printf("ERROR: delay should be an integer between 0 and 1000\n");
return 1;
}
}
else if(!strcmp(ch, "-p")) {
if(!strcmp(*argv, "auto")) {
autopsize = 1; *argv++;
} else {
autopsize = 0;
padsize = atoi(*argv++);
if(padsize > wincols-3 || padsize == 0) {
printf("ERROR: padel size should at least be 1 and should not be too high\n");
return 1;
}
}
}
else if(!strcmp(ch, "-s")) {
if(!strcmp(*argv, "auto")) {
autosize = 1; *argv++;
} else {
wincols = atoi(*argv++);
winrows = atoi(*argv++);
autosize = 0;
if(wincols < 20 || winrows < 5) {
printf("ERROR: Window size should at least be 20x5\n");
return 1;
}
}
}
else if(!strcmp(ch, "-ps")) {
padstep = atoi(*argv++);
if(padstep <= 0) {
printf("ERROR: padstep should at least be 1\n");
return 1;
}
}
else if(!strcmp(ch, "-ds")) {
dotstep = atoi(*argv++);
if(dotstep <= 0) {
printf("ERROR: dotstep should be a positive integer\n");
return 1;
}
}
else {
printf("ERROR: no such option: %s\n", ch);
return print_help(name);
}
}
}
/* initialize */
if( (win = initscr()) == NULL) {
fprintf(stderr, "ERROR: Can't initialize ncurses\n");
return(1);
}
cbreak(); /* imidiatly get input chars */
noecho(); /* don't print input chars */
keypad(stdscr, TRUE); /* also get other keys */
curs_set(0); /* hide cursor */
nodelay(stdscr, TRUE);
if(autosize)
getmaxyx(stdscr, winrows, wincols);
if(autopsize)
padsize = ((winrows-3)/10)*2;
/* non-changable stuff */
padposL = padposR = ((winrows/2)-(padsize/2));
scoreL = scoreR = 0;
dotX = (wincols/2);
dotY = (winrows/2)-1;
direX = DI_RIGHT;
direY = DI_DOWN;
started = paused = 0;
/* draw stuff */
drawframe();
drawpadels();
mvaddch(dotY, dotX, '0');
refresh();
/* main loop */
delay = delay/15; /* assume napms() takes 50% more time */
int ch; int d = 0;
while(1) {
ch = getch();
switch(ch) {
case ERR : break;
case KEY_UP :
movepadel('r', 'u'); break;
case KEY_DOWN :
movepadel('r', 'd'); break;
case 'a' :
movepadel('l', 'u'); break;
case 'z' :
movepadel('l', 'd'); break;
case ' ' :
if(!started)
started = 1;
else if(scored) {
scored = 0;
mvaddch(dotY, dotX, ' ');
dotX = (wincols/2);
dotY = (winrows/2)-1;
refresh();
} else if(!paused)
paused = 1;
else if(paused)
paused = 0;
break;
case 'q' :
goto end;
break;
}
if(++d == delay) {
d = 0;
movedot();
}
napms(10);
}
/* cleanup */
end:
erase();
mvaddstr(0, 0, "Thank you for playing Yet Another pong game. :)\nPlease visit http://yorhel.nl/ when your even more bored...\n");
refresh();
delwin(win);
endwin();
refresh();
return 0;
}
void movepadel(char which, char direct) {
if(paused || scored || !started)
return;
int *pos = which == 'r' ? &padposR : &padposL;
*pos += direct == 'u' ? -1*padstep : padstep;
if(*pos < 2)
*pos = 2;
if(*pos > winrows-padsize-2)
*pos = winrows-padsize-2;
drawpadels();
move(wincols-1, 0);
refresh();
}
void drawframe() {
mvaddstr(0, 3, "left");
mvaddstr(0, wincols-8, "right");
mvaddstr(0, ((wincols/2)-7), "YAPong by //YorHel");
move(1, 0);
hline(ACS_HLINE, wincols);
move(winrows-1, 0);
hline(ACS_HLINE, wincols);
updatescore();
}
void updatescore() {
char scl[3], scr[3];
sprintf(scl, "%02d", scoreL);
sprintf(scr, "%02d", scoreR);
mvaddstr(0, 0, scl);
mvaddstr(0, wincols-2, scr);
}
void drawpadels() {
int c;
for(c=winrows; c--; ) {
if(c < 2 || c >= winrows-1)
continue;
/* left paddel */
if(c >= padposL && c <= padposL+padsize)
mvaddch(c, 0, ' ' | A_REVERSE);
else
mvaddch(c, 0, ' ');
/* right paddel */
if(c >= padposR && c <= padposR+padsize)
mvaddch(c, wincols-1, ' ' | A_REVERSE);
else
mvaddch(c, wincols-1, ' ');
}
}
void movedot() {
if(!started || paused || scored)
return;
mvaddch(dotY, dotX, ' ');
dotX += direX == DI_LEFT ? -1*dotstep : dotstep;
dotY += direY == DI_UP ? -1*dotstep : dotstep;
if(direY == DI_UP && dotY <= 2) {
direY = DI_DOWN;
dotY = 2;
}
if(direY == DI_DOWN && dotY >= winrows-2) {
direY = DI_UP;
dotY = winrows-2;
}
if(direX == DI_RIGHT && dotX >= wincols-2) {
direX = DI_LEFT;
dotX = wincols-2;
if(dotY < padposR || dotY > padposR + padsize) {
scored = 1;
scoreL++;
direX = DI_LEFT;
updatescore();
}
}
if(direX == DI_LEFT && dotX <= 1) {
direX = DI_RIGHT;
dotX = 1;
if(dotY < padposL || dotY > padposL + padsize) {
scored = 1;
scoreR++;
direX = DI_RIGHT;
updatescore();
}
}
mvaddch(dotY, dotX, '0');
move(wincols-1, 0);
refresh();
}
int print_help(char *name) {
printf("Usage: %s [options]\n\n", name);
printf("Options:\n");
printf(" -h This help message.\n");
printf(" -d int Specifies the interval between every move\n");
printf(" of the dot. You can speed up the game by\n");
printf(" setting this to a lower value.\n");
printf(" -p int Specifies the size of each padel in pixels,\n");
printf(" set to auto to automatically calculate the\n");
printf(" size using the window size.\n");
printf(" -s x y Specifies the size of the window, or set\n");
printf(" to 'auto' to use the size of your current\n");
printf(" terminal. Recommended size: 80x25, default:\n");
printf(" auto.\n");
printf(" -ps int Specifies the amount of pixels the padels\n");
printf(" move each time\n");
printf(" -ds int The amount of pixels the dot moves each\n");
printf(" time, setting this to a larger value\n");
printf(" increases game speed a lot.\n");
printf(" -l level The game-level, higher levels are more\n");
printf(" difficult. See below for more information\n\n");
printf("Levels:\n");
printf(" option equals to\n");
printf(" -l 1 -d 100 -p 6 -ps 2 -ds 1\n");
printf(" -l 2 -d 80 -p 6 -ps 2 -ds 1\n");
printf(" -l 3 -d 65 -p 5 -ps 1 -ds 1\n");
printf(" -l 4 -d 50 -p 3 -ps 1 -ds 1\n");
printf(" -l 5 -d 80 -p 3 -ps 1 -ds 2\n");
printf(" Please note that all the levels are meant for a 80x25\n");
printf(" window size, level 5 might be very easy with a higher\n");
printf(" window size. In that case you should change the\n");
printf(" the options yourself.\n\n");
printf("Ingame keys:\n");
printf(" space Start/pause/resume game\n");
printf(" key_up Move right padel up\n");
printf(" key_down Move right padel down\n");
printf(" a Move left padel up\n");
printf(" z Move left padel down\n");
printf(" q Quit game\n");
return 0;
}

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTGAAoJEGI5TGmMJzn61pUP/iW/oAXwmWcgxsLuibAsPX9l
H61EPdaL5PtBQwfXXwTm+JIUQV60kYzOzbUPCJhTA638Y34hepFSubzuEpECgtK5
34KNXlsCU0HjqwojNSNZNoneXTIEHsWM1hesrHiRoFY8i03Vzxr8CGuC/iJuD1FR
CVJmO765ytUSACo1SrOQQ3AxXMQIcFvN3GxSsoD8atxgfVCJfW+SCvRgJNMWmQP5
qB2l9hPQ5H+StqTjVAMb66wX1maLNqfUJinjZBvhL3RQ4AxBTnr0Z+SLa2o5G8r0
Wxh63Mla1mn2apEnR/bjClJmktxASpy+jR3iUGXfOPW1+b9WNF242v/e8AQEUxnt
RjqckaiNhR6nv/5s0XqOMniqq5/4IhMNEHvNKD62ByT1OR94idc1pdE4iOB15J4d
eQQc6YpHlgVYvTM2fjxvRU63Ce5exVwDe/CnmzDXVaAFJcrr26574LDCVLUZQAAR
iUPGRDj0x2MBsyByhC5UUhgDgI5gflHPhxDyXDY5D5ZR2uauo+YmRb0CW+XV0G1y
8u+m+jvP2XB8clOrM0hetR5JKgZlxkUVzzt5OgWzUzfDRExdXi5XBiWkjCH2zQ7d
IeL8kmU2xQ8w+id8K9msOQD2v4jmnAZPPhQMVPOXqrC9Ln2kayHluAWXBZvF1lLp
hkCa164lHVomJMNR5NKf
=ZHUU
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
40f1a469c62fec371455b8205370e147 ncdc-0.1.tar.gz

View file

@ -0,0 +1 @@
73b359260ca4fb6700c5d8db78a67757ec0cb20a ncdc-0.1.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTIAAoJEGI5TGmMJzn6HMwQALCnnoQbbZ8GlbOyJtZvc83V
l0eDaTC5fvAyWIzxJeYFXJxRL3m1Pqfdj+FyS15wo9xlQkpY0FveQycVvrTYn3hM
vFkSs51OW6B1TjkR9xdubWkBVa2WTVJ5XMrAG81NB6BBXHHNScjOb++KsEUtZAt0
DsCi5Ma1fokjm/22R2i6ls4g9iP992g8b56PmTTuVY2zOmK6JmCG4RAsLs0KDXld
oG4Lnfd0S86Uvff7QY6Jw51wun7Nkm5zRHVpv+ALEt6cRp2x46L5tzQ3gR+D7rRH
Y6ZcoVVoRBSWYyC18cs3AMXG/bL49iJvJ7tkRcIbaN5JGGnIHpK1OCmD4+i9e8ip
53HCdBJjxS07YucKfhocbEtNbAk+nmq89jM4Ycp9BJGwlP7Th+tB6ZgSCLjOYZt/
w14IGouhbAWBPJJV5Bnf8lPsG/9vrsanjrySi2BOl7NOHATPqra9gSyw1QMAvUy3
57UdWrzPuK66ntXX015Jo9hvQOB4Da8SmqAtP9CwUHJi5ScpJdZppoqLnYFy1qJJ
AW8C9a90Vh0ANivoHaLdhvgac5IZjazN4w58yZhCheJGtJArSrWs6p4Q9qps4s97
Izb5GWzG9ku6nnPg8ch2BUJ2SdGlUN5bABA3uhOj56Vr1fJxMmQ74gGtP/eJKkaU
KMKbur3hycS/C2F4cASf
=IHEk
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
4e547aff292ccb51c10f2cc25bdf3e94 ncdc-0.2.tar.gz

View file

@ -0,0 +1 @@
2b6da3531d36751c464a36e9b7d19bd87a13b884 ncdc-0.2.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTKAAoJEGI5TGmMJzn6gwwP/At8/10HO4LuPC5WtpJAkKtw
9E+t+ejK57vdeHN79KBZl+zd9BQhHP87EOQSOyLbmcIET915VMBUdayC2v4E8OWZ
1ysVjsqdXDk7ha3hliyciN3o9CMrAEAxlI8UBpDVEBGMVHpqMJOqrwQWgrBlvL86
oHoe1YERAZj0YaUzowghctSCUmwqgWxK11iVJT7Dr7fs1hQ8ZcFRvEup99uJJAGR
QMwLZmSL//Bv+Bg7UM2Bvytp/JGll8bdFMXUymj5SaQWzZi4Eyyhkj461VM7IkG8
qOER2OMXZ194vghbie22op8FckOzfkGIMhKBeT5MXyGEtIVk3FSjKw/JryGT0j/H
qu9Ndj/lKuphOaR3kW2YB/rWgvgJHDPuYXMmUx4qdyK1T8Fz/dOAfmtMqVMeoDIn
UGf+8wfnmHMdLjGgxTOkzlcacyNjFSRRmPUszUMAGwQLDY9HwmvgGH3Zds84hW66
b5m2b6dA/1h/TcztY9Wtd2zDy5Baiepr+hi4d4+DMnEhhM1vxpY6iL2ZDAf3Oj1O
7T8FBlZIwVin3tJ12EieF74Zws5adnLdvrlw4nsM5NEmvrxuJduoH4B5+ATMVfF7
JoJHj4dO1aTw1BidqMHeo+iJSFLxONj5NQRlXTi3464fKWMVwrmLzRaVMPSvMmVp
SFmyxxuUA+mS8bSm/Sar
=p6kV
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
f80a946aeade94024ad6c3ed918cde40 ncdc-0.3.tar.gz

View file

@ -0,0 +1 @@
55609b2e32e34e1996666ac5da1917ca0429a4b3 ncdc-0.3.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTMAAoJEGI5TGmMJzn6pDgQALhNTYUmctGfdM0JOvBtCPRF
1ElKquQRMNRXE1f40uaJMrrk7lJm/SqgAMMUkSE/yoOiBwlULDFBMeLNwRYkIQM4
QFhq1CI/YTqF7GpQm5caUieMWwIFPrsg9SGxmm1+U/QLWEcV15itoESe3qjGO8mH
dZJRP20mPf+cPCJgu4IbSuZ3zrxjGCMc4miBsX8Y13DWnMln01DGPPg9O8InTvP/
nGcrzDiycTeGyCWcJgqeg+uZp4ZOAH3wxJkGDaNJAPXPJkWdLgzKHRDgX9YNt7Qf
Iugdq111e1SFckPnyhhkFcfeGBG9SuGuqXBlEa6E4GJiUz1/O/nHi6wir38OlRw/
ubfWisO4Si5PueKNvfCgLUD5d0bD7Dgvzu0Lt4vhHlipFVngfc9NYN/xCTFn87DC
z0MqmbbxySMSXqx+XdnGvXOy57WwIwYq9lQzH/fbej9m4kAGs40Iyee/DKWoAUfd
97hSLuEWEyClc2ikkMncdMLx6mLZCF7UWtWraK4GzcsWF5D0nuAnYgjzIDwOytmW
3ZIMfyiAVxS9ndjBOFTpIKVyJVQcm93JC/29G6Pze08xvpl38IlzPjyup52rtMrT
1bTRoFVG2Ll2YK9TsEUa3mj6HIC3t8aWePvCfY3BGd+1+Ag++Qwez6ocxCm+ojej
L5eBYdFFdxSE9DqTc6Kp
=Qpvr
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
4a15b2bb4c7a82269c1ee2bf5d265284 ncdc-0.4.tar.gz

View file

@ -0,0 +1 @@
2c525792046d7e8c4c5fc390cfce666ce5c3c032 ncdc-0.4.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTNAAoJEGI5TGmMJzn6WBwP/3ZykjAwD9M8wjMTZDW0nYEA
Isuh1XKXC1TGc3+lrSUu9FqBiRC46nj9cChKVHwHEdAsa/nUOf/t2edQat7ORu5n
NMk39w1RXDmlJ8n7FKvsKQ1aOBt2+snLa1pNNbeCS7F4qDI/zYMJf9nBIeFuCDG1
iUE03qUTo/PSg7u9EgsQNKfRYyEdtv3vI4RRtMBb3jEyqin7ep9nQasI2LxBb9Oi
jwGvLnQ6z3WJ6E0aONZeNQiuZAwRCHht7A8xZW5GjYoIraKR/ttyF0qD0FHBzllC
fVt696B+NYhe9ZRVBp/8dhGcO5qk1Vd3AicKYq9UwmOvmzpeFgYhI2u7/wDPRct7
M+7560wwMDdvc9QY2Ww1IifTRzppwoVBPvIHH647hufto9gQpQaC2ZGgi6t1Qp5C
wkEih6Y/p7eyrbZ41kHXm2+MDk5f3aI7/os4h/Le2czaXfAKKzN7xKdq+35T8xS3
mipbc3ZFnskwummI1g+EbrW/nBVLEJyAhq8fTalwjU5ATmS4w+7u6kuDNrlL9Ng6
CYbaWRwmf2dIb6o0MVeyQenzTS5u1JG1QvP8VZ0JZVH+NZuoo8dzW7n5mshMemMq
DaYhRwlYKDg6kl6ADW00PUcNfVh4qfvpFueZOmaG2GX1/O9rwPcljP1lOdgTWiwr
TV1/yzLqbFFxumqQW7Nr
=1C4Q
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
877a43df175eb225f442e996534a5c84 ncdc-0.5.tar.gz

View file

@ -0,0 +1 @@
de88f2420f526add10838526ddb7c07b8555a510 ncdc-0.5.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTPAAoJEGI5TGmMJzn63j8P/ieuywx4RzPqIcfbZvIJoIdH
v5lu1fHBl09v6s++SdBcJA56hZcG/WIra3mB8+nstzLpr8VajwZelPnS4OSgzM1n
RU5Ni0i0Y3FBU3OFiHSALzhENQDuiJLtjL5UQHMoq1biwVBUdlQU2fXL/NXeGlPr
8iX9MmVQQVjiSbusnSgi6h61V1hBcjmNFagqKQM3OW6mnpQN2bx7ll4ERzD5ZR0/
C8G2YlvW8FWn9PeAFJimqAXO5/1aRabq6N/dwbii3wPQ+U6mFo9AyrRnINKWEzZY
6ueiUf9lmR9fo6jzuYjQU7zKZH5mHxrK8iYCoLL4sUu44SpTsbcIDhAQJfGdUIQ0
wBlVF7BbSdjh5ypw5rtAvp59pHvOr1bOyoe2WoT1xNCXg0aHvipwvDtTp6XUHV1i
84z0uZkwYWb6gRTzt7o3ZNiBNoCdA/YuQji27H1WXtib7goDjGUK0vSygzG8cLLG
EMbVtzNWpxqvADsFVkDx6c48nPcI36cN3tBkv+T1No4UM5+huRko2Y/+KebYcY04
io/uoqsR9vxPaY94NU2jz4U6TBg4kLLZ0T2+pPeHMpP8iTUor5qHAHGCRZZhRZvS
sJAvlb3dr5mwM7dz0vrLsG2yU2UUd8doamF4UsELsp1O5CXsDg/Ezhq7rBGQYCvS
15NK76QS6qXCcQ8QCRwT
=aCw8
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
0c2cd210ebf15f9382d4c2621bbda00c ncdc-0.6.tar.gz

View file

@ -0,0 +1 @@
24c79a5b1eb2db6c7840bc22bc0b26111c694544 ncdc-0.6.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTRAAoJEGI5TGmMJzn63K8P/ihbGlTEnz8OcGu0DVB8EmeQ
wSzCFQ+W5421nVhkUjoOB5yQRgT3oJAo8mtrN9rzCHRS5rMDqX1YtZx3/xqXpXDj
yMjegOGB0wIs1jiemMcGTmz6FZ2dS1aZCALmbnOq0pBTJwAtDov5XZfhYRcVWlmf
g0AA6uKwpNMhLhuX/TpoIWPZuQdkTrAv0K6uE8O0rsoPNPqSv3gIXjEmXPr61/y3
IciFsNfG7lDSsSW4j8IIv44/5QwKp32eJkv4AZm6sNJCRSaMDk88cDAaVaZtf7pi
gTywddluNiQRvSQEZafR/un/dB4h1sLTJt7xxlY570ituzIq5clyPZwL4MEKbfg4
wPI/g1rm3F1hSd0T1HXgOv/PWE5pV21oAOYyfE/0Fr912TO/FmLzxJKiXDhvML6j
mobXcubd4UTxvW68md0hClX1W0t9j+AlmeuCuL7bU1ohOhpjvUk06Kkstl/O3mfz
ELdJXig98eMO2yxYLe3dsINapqTEXAuPzBljH90Hm0OwxtDOkMlfBWR24Mnip2A+
QMmeJskLuLP2N3d7wLus7l4BosABCMClK6J814aftBmo2613+V8FnR+w5LWrS8Aj
MFsmbqtznATmTIjDhKELYhaZyn8nqWeufKkFahUjXqB5GAqcoM/cREd+05xrwmUp
Kf9b5ZRlrBZONwkCXiOH
=n2uq
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
753b3a3717eea19fd87aa495d22eb338 ncdc-0.7.tar.gz

View file

@ -0,0 +1 @@
6bea526eefd6ddf8d49f52d92d442e98c73cfb92 ncdc-0.7.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTSAAoJEGI5TGmMJzn6w4oP/i9hOuO6xNZZ1Mo3jA9JjXmX
Em0yQu65DtbiUDOXfLJaAO8ElxoiACkCTtyKoS9lKX+IDxd8JFTRXurUO7qGudMy
8JcHybRLxO5et1pus8pHAz5Qpbhkv61PdNF5qDJDEaRde/OxTj78WuSweVMUzlcK
QKkam3sAIXlerdcdVlKQCWhGe6yAMBPf0RXEkW+w5gwHWGljip7UIiWsqRY3QPaO
XRVHje675nZ/r2+6lsWugPz2QW0kaH65Nts7bginliMaon9h9lUButMjaBIi1yRb
MuY0spkBEzRj8Sz2DnzUUi2JloJiR4Lf6BtGEM35bKaTRbkv6QvY7ZBN9QmEazuC
+jbCpqfnP2ZwRPq5qBhx06Btyj5mKRObGa1JsBYXUE/XTH9ljkY65/7cCbmsg9TX
siEGn9s9euAYhQR94Firyvwm4j6/6Q0nMa0LJFv5gmBwugH3PnvoRKrFp6E+VwhK
3Z5+Twux880HXSEe2lto8Y2lm5b+upjiPLfLhJc5fHjM52IarhByb4jKpqb45AFT
Ae8rgEMLLwhEg9/W15pxZ5GtTWe6lkfINEwtxXdINtCO2pltLYozmRzJUqo0rxDL
WLhNRvez9fQfasP1lD9QN+WYCluOVKpLZGmvI3NOzq4MWmoNfImnwWYxy5xpQj0N
4TsnZX8DNMMKtdJ9e81Z
=xmeG
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
c8dceff912bd27697911178f656c3800 ncdc-0.8.tar.gz

View file

@ -0,0 +1 @@
c8e3a497db8dce6d35a948f481233eca58d77d79 ncdc-0.8.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTUAAoJEGI5TGmMJzn6tq0QAJ0ZQ0C6d8VC/9ngP/JG7C+6
PnN5d68LjArZpWCOG8Eo1RJ1MHYHKaibBx5qS2z/sR9FGRzqB5Oc9r1io/wu12eM
xQSZzTRl3VL5FmBnGNvkcPRp7JeGvqk3Wzxe440QRcjg+RaKHxUp7BXzyx8PELmZ
dic9Wf4MOaYclB3w+TVAj9PR4qRKps/yao01WFnX0PID7ZH+mIXYwL2HNWUnnaz4
a5mdeXHQqjqZ+tW7Rjo28B8IekPvqYHJfejrmZ5hAc1bfo+viMf1oNWdu/yQSOzz
/zyAVu/O9TMI+StJa2b2ngYGn4/CdRFk0iv29ydD/OH1kx56MvKl8F9rBVfgil/5
of0P0f7Wu3sQLcpGZCSba9kORU0Yb9xmNPIHYKUwsYvdhAMMQ8JtMPv51g7X0ycB
B/qHlhEeFHWVkPHBnYRtsdIcHc7fXOhsVR25x/mwIZIjPlELaI5/6t26CH+FRLSw
A0BJMXq/te8jlSSUtEZbG5nbCoSBAKhIG503IExv9c7Lywk7fSegFwXjDkrbdJBE
BkH28dPqvrdCmuZV6qiQq9LpTuFHL4KPVvWO/zxSl3CCC6kmAuOjet94s1hNdkDX
3WHH+PYONRAzQhzNlZJDIg+w0rgouv02S98sxo4/uDLMdk2CIYSEUlpQS9Z0UWLC
NC6FoyVVnnTFczC7mvbc
=5o2t
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
c61d0f0181f9a204f90fd0c101cf1703 ncdc-0.9.tar.gz

View file

@ -0,0 +1 @@
0db947b69db4b48b599b14081e75264844e9928b ncdc-0.9.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTVAAoJEGI5TGmMJzn6ueQQAIoX5uSfisaQ1yhIKJLDyusN
OwuMfID4mYSYdtsBpfgYgygFTK13APAiw7oM59lluLjiXwVFkaqCXqyfGOe7zuRX
0mKeboegrsuRdkTse17WCB2OuFx9yRv+SBmdWuxg0fvvNHUpNvIAowPIebaUqS6G
Doe+Wcy64E8U2ata4b0OifwwDrm8FaKowBkvBen9Fkqd7ihRyVRijs7p7zx9XdrL
qLcI/gj13An9SwTW6zy6iJZbFCubQvX7s8lEo6F3dc1WVkdgD3PYb7d2dvT5LvGj
Gsxw2sadY/cAlw/6wFqbk6BKOjyCgwuVgQWdpDF4Os3cNXb67gOWp+lzPZydheVM
8KJ0cs74HeAU1Np+B0kfsUbcFjav16M5z99Go5j+U4bwXdWeO+fATC3GJa18f0Mg
acO6PIDVtTKwxSWIEGokPFmg5m3AHITdWDMhcNdSoPzmtZpm9tMrCIwd/QvlH1Rl
S1hs2MN65MgfeHyIUZwOPqpJcdlICG4xFofxApVI4PplVWd2pxHuFpgyfCWppZ70
JF6xz/dBeZwaHorGnTjsDDOVoakhWG+wcrHFahyMI6MqJAtBBfWZc/KYsQJihGyn
gywrf2HcrkDYvYhkHn7Ms+0KXDkMRAE0voacxs13LfBzZMQkaChl0QSPSnchfbre
hqDRFN6ML+lTp8Cx0YVT
=2v3X
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
274d7fbe6a1c89bef30632d867fd4a93 ncdc-1.0.tar.gz

View file

@ -0,0 +1 @@
0c01910ad763060377cfdd99e109baa4c4f8c8d2 ncdc-1.0.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTXAAoJEGI5TGmMJzn6it0P/iVQnP/AnHuvFpVIit8FOd9Y
9jrShzoj6BAuGeihGQe97s2XaSahx4LOEzTUm87W3ptDcKMl7Lu25gC8LK3Jx3n7
fzAOsciU+WewlFv2Dx/1CvELBJtSGQD57UC+0NKC45FJZhEJMbWtstqmEhp99WT+
v66LODIWO3eBfMxKawcQRQsbLUEVevRtlFQYAbegDWNiQBYsvvUpT29Du7ZEmhW1
Y1SXOwUIUbEqSuDEC+rlIPk2U6AWD2nFz4pOPVrJBd1N0eIZGIWW/5wpztZfJ237
9hMNWZM9vrflO2qCGF1clMWy1Pnrz0FQHr0VWzuqN++B15algTNS3Bmpy38vqjOD
WSEI58fwHGEI1S+HAzRz7WgveN0dPPRNm3/nNXslxK68z3PeTsuSGAd79tW4pEql
eTNJ+ceXz2TvMFJ33khjNqIlr9MFDifs691+q8oNf2CyXDmK3OUzB4XPls8aeV6K
TU6RnV6WXoDMn/rBqVwPCQKDrohFKWkgKRgUOJK3L6wwn0+oeCm0ob69wo+4Gupm
lUwEnnzKlV6SW0OW4iTWHHZCeAfQKPBvaUzBKswYGt5g6NSVdGj1JyxHhmhu969b
sEdVOUW4Vsc+W5lbiDsjcOK3ScIxQAhY8NpliEpM8IVbG9hCRGxxSeS8d+sLW1hG
p5ilWEoH51ialACB0lT9
=A7cz
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
bfbc173f0c99186679e47fa01dce58b5 ncdc-1.1.tar.gz

View file

@ -0,0 +1 @@
7585bdb288e72cdc97c4e53c34afbdf639f20a68 ncdc-1.1.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iQIcBAABCgAGBQJPoqDdAAoJEGI5TGmMJzn6BnoP/jvDd5KfnQ4kHqq5jzm1XOc5
ncUhUqrb5S9VAT4IkDbiZ2ICop9tgiEws9q9sgHLq+HN9qaZgGCoCNBS+QhYWqPB
sDrSWJt74Vp3M0cXMrDllybC6OTbO1SQhseuC0o/239VdPOjB7XYNFnd5Ra7Q+iK
K9GQ2lpzo3C95cHNJbMotW0x1R9o/It/UGfeDdT3m5xTMStes3QhE1rifcnl14hM
SY2WnTJ+xOGz/l3tu774yFU1IggkImq6xVVI3zoD92ygUSSasntADPK+xHp5pf5T
gDJ0ySnLlfZEn4rO52zmvsPBhD7lfylaWVVppg7Aeh72R6IbNwfBkboeYQacoPzm
IJrx7OJDPPSKvVWVdCGR/Rg3mcf8mTYKp8l3eQ3m3cAXWsA6x9BCj+WBEapQUsrx
2NRpDeDa28dxHlQ+kskZkYKSOh41IRQX3omO/2rK0ChRde/2sTDeIGLRYwIZy4o+
lHG3tYEhKAWQKUK/cf/q6nlkfQtis6goI6iXuZOML4oe3ZrgGcTlAeeMQ4uSr1nL
8kygyZOEAkCRNW4xPLEnrB4sjaiR/q+2WueopLs6gEIKbSAGIUCQI1gLul8WTKn5
k7XPNoDd5ZuwKyGHb5Xc5+7X+VKeH27cZlFzcFuvyiT16eaRaHRMjLyvwBvZeWjK
+FxibLfoqqhqjBJ/aFgl
=6H5t
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
a56c5b16d2fd98157a70ab7eb0aea24d ncdc-1.10.tar.gz

View file

@ -0,0 +1 @@
06e3ad1de0353711b217ae9f1a456d9d0c3e403b ncdc-1.10.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iQIcBAABCgAGBQJPsj32AAoJEGI5TGmMJzn6/SQQANL4tlpzpQAef55/8w6/evKJ
qtfscdTpuIZlzg38GYuoYiQqtilYrIX0AaEBaMAEugVBazlFrtvpcyaTE4eZaYYn
c1/t5w48V6Vl0DSAUMLrMVl0cC/dp7vdg9rmdWvs5vhqc94wdvHZszLjGXPyU7fj
noKK3+zHp3IfbonDj8Fj6m/moqKeEDjbUC4ebWSto4rf3yGfU7hSFhHw0Dum7i6N
QNt1953O0qwA7a0xRXWc0y+luAqOMZQ/rZNIzpxFCdlg8y5jZKDdUcloVoensu2c
/3d3PSnVV9ettIG2iqysBogThQWNi+s2foyQoaIiv3Bi2r1MZomKlI1hnPy7yiEn
313VErhTO7eGwnE125ZVa7mh0LMiS9iQ9q+6bNwoHr/tusvQAVtQJ21MvT8uraFV
JHRntWL3IalVHgBykS8L7xDoqq85yS6SVZ0+tuBABfVUwBuRXkni+YPl9GFqREm7
wxICtyhgdbCAJx/xyvoXBhuejzLwqO57WkQJywWjETfMpg8KG4xPV/HVNQx1vARs
IZBqyR3L3RvvVFJn7uTFJ0vQCjyJ0/Ykzyte17H8sXJboGlChmfSPWPcYF1cNtMz
2fqt2vseLh901C5rNrXJjh3IqDqwzMh75QYIUHtKzlasTUpZOi9z+uXnXQ+9mXc+
Q/BuqcBd6vHdC3GznErK
=9YFi
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
bcfa3b0e4997ed5f433a5dd26f9a9c7f ncdc-1.11.tar.gz

View file

@ -0,0 +1 @@
b38881c795456696bb71de5a9a494f3e50275f58 ncdc-1.11.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iQIcBAABCgAGBQJP++W2AAoJEGI5TGmMJzn6u68P/1YScIt4bfv5N35c9/qJxtBf
CeHCjSAUEN+PlRbsKdgRIxd6Lj4RIYZvmJb1mVM9ZOCXLmvs+42+MwdrsRMafOob
TUd/OKZ6D0Cg/LqwP0dxMXiAk4JHeVWFwVHZomKIFNvY3dOT2mpDNs0ePrteMwwg
t7a0zT4Xxjqc423gthhZrSe1uBrIpHLR4TT2fnFEiuv+9vZ41m/Cre9eRN18B2Ke
eLGL8Kr/lK8RTsQDOLUs20jPKI1Fhi/ReTuI8qWDdQ7yPA1pqqmr1CmnKEZsEE0d
HU3LYntQ+6E6CRWjXppeB7XoVJ0c7SKk31ysZlOR/1A9pnTiLq+Ac34nnzH149Bt
JNVtnpBb24aUS9mj4ZYech2WRMrJonlNT/POK0BeA0RKrY9OW6gtA5MaBdPWLArx
Q1QDlmABlJu5rUcrC4TPTO2jHsKqO32fWjsrCd3YUoemS9hIMRiHiBN7VQjTJynv
GuHcZWNEnJdGSn9egpaNF88BQG4JHFl1aC1c/MKFffnwyRxD3/sdDxA+vdtSIGCD
vCP20ZVjIsKQ+LJNBp8FVVeQn4VgHmjcsE+Ee7mzYiq6SRRafk4zZGi1DXYrt55o
F2fr803IZbZUdxCKFIP7ohULmlMDDeEOtpcLvam29CTZRW5lZw/qOjMhEy1+mJHu
HRzC+NCi4JpuIQtRD8ef
=izUy
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
517e0dea66107d97d46be36c85151e79 ncdc-1.12.tar.gz

View file

@ -0,0 +1 @@
f25e1960ca1f1a5dc8a028debbb748d13382bfb0 ncdc-1.12.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iQIcBAABCgAGBQJQLNnBAAoJEGI5TGmMJzn6lgAP/ih34mF9DPoJ+FGGdIPWNbLG
qFg1JF4Wm2TY9orKxETNCTU0v77sA0w+cyMs/jCl1+V3zapMZ30k75c/lUH2vQlq
x3WnSdJqMtuDxo1EFPt6I5fZj1XmTzGx/qaOIe8AuYL9ij1s/yPKNOf2YQZ2KAvt
0pQfjQN21Y52njAUwMq9kRB8PUQfydPLcecmPAGRSsRdlHdnVdIFiVM4uWeAW1lS
AaPK4Suz0OlElTLRwd8XozKs/Er7gVi+UergGlWlWE92AcwLpaU+2dxqbL4ox3K1
+3LWqo044pUyevBP1B3vM75tcEUfNZYZAXac5sHhhoml5ysLnpDmV3fprdDOqpPW
HCy3JMdJn+MUtHL/KGe6ysn+7OnVIGwZp76DTmZAnV++LmFF3Qi8q2seAhqjXJoy
vChZ8FPyiBdmsoGfGsHtH9oQEdLFPMs1264ESWBNwRnvmINxd9NYITIx64snmW38
E3S9wsKd7kVJx9TSloPOYDeqZURO8mdrgLnyo/OMKDrlPDNmq7lESzWCouYzWXWX
jLb/+Xgm35cLoZKucovzS0HNsaf/nGOPuBo9+YwGmBJIpC1TKFzkZLSHTEaksOnT
95G/xg5e6cgdKKlJPYEwRfUHZwbDlhVGi7e5EpeJYR1j3UxIthEX4tnrI4xGeQp5
Uc6wznqnXM6r8nv8u5lk
=vDPK
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
523061427c041a4a079ea5ecbfd26742 ncdc-1.13.tar.gz

View file

@ -0,0 +1 @@
e919dfcf9ff11d48dd133cbd7709ebd317666295 ncdc-1.13.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iQIcBAABCgAGBQJQlkl2AAoJEGI5TGmMJzn6cHsQAL2Ck5RJ8WH8wVnSTaFJcNhO
4I0y59jv9WFSEM4/Q4+srga/vwJJLO0bKIYb8wgdjo+vaukONZsGsJc10L745asM
0uoxSaAnkkbcHmnwW+VU3NyNe+wj3W6s1wXj5MM1WbA4oZrBjolsKmxcLpyjYwC4
d70RPWvOl7ktNrAMqLl5MSp531ouwXkiHg+LH8Ls+LjXGgm7WMCivZH5DQHKA7xc
X6oUuMOZ3hXV5JKypRVtIfWxLZjShi159i67ZprZCQBoBqCEt1rOYvmU1Lhl9RA5
FcgkG568J5kLp6fo0fetqkAh3b5sB+b94MMhInluTNGjLHvYNUg/p2TRiLY4uuMz
9oKWIJzp58DrD1dqVt3FtSLXvQAMz0LAwWvwMhiCXed/ozjkQCRIhPRRmRL3wJwr
uEp5Bx08PnQAqpDVAaO3Jzp9/hIAqhcfYl6g53DLh8yZdRa7JhgtUreHF3uZ2Drt
NBbgqfjPYZ49IykJiZT+fqudD1/Tx9U1FpA3fxPptnjAbfkFh2NYDTjBCHtaYs0V
3W3yMkYXLMH3KftpmBBFFwgoRFCQ/OhRXqZo3UfExSsdlHytf221qNsoNvQ+2uvC
PQsAvDLZCCeL46il7vhG9qBj9ChnQxlnLb5N/tHthmwsp61UVP2fJU88BUkDVrP/
+211TnHYzdrzKxnx9vJN
=C/XX
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
c7a9f4ae51a561c1196456ae0b5718c3 ncdc-1.14.tar.gz

View file

@ -0,0 +1 @@
ff2ae3107097ce4cd03862841421f157198217ea ncdc-1.14.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iQIcBAABCgAGBQJRMfAjAAoJEGI5TGmMJzn6cDgQALSIMeJ3nuy53tyPP3MHHJgP
xh7bu01Y1JzeBJWAqov+asGmPME2lMNM0cFT9zDEGFPYOS3/b98tIyF9xWGhj9FG
mQUO59z6fSXXKkK5fIBpIhVco1iMbj4xTsRXplqf5b2iIFxlTBW7HKeP05YapF6s
vwTZLyLl9RWOeNw0BdZN7/+IQZYWjbgwX4aOkk8owA3HkCgF/hgDwjYuaWjURa2o
Z1QnrWGgXmH9a7iRCkv1hxP+SflhwXAoALuGXW3huyj9ld6MInhacT3L/qAcECQ6
nMuZLWqtb/JnWUsF0HHy+X6JiLE6NYY+zVLl7WU2u/hC3/5aAZSPtMotbhVFEEdo
mCLokKoyBLsagrB4SVXJKCgA7I7DgT9tMIBLGXyoniQBkU5NC1ldoKylIygA32ps
s2XByI7haGstUjeoO84YOGzZdJ+ej2hRR63PXiDfRM9tqtk158Hcvg8TbRG7659l
Nsy8Tndv/uGE79wLYzOD8rh5JeEMqF4yq0jMUIw+lSZhPBbGpkgJH2rohxWRwDbL
7E0jVEY6jJ1JXQe4JDpPOgQOlztwzETW7Lq392or0Yvub7G1RZZOfduZjLHdcCCT
/hjJ1mcswqUHcZcrZFBG0Wtu+mVZNzOs/wS10KG8RxOpIrHy1Hzc+XiYHB+1dA8C
AvWc7yLKODUt/C7ebiA4
=/6Nn
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
d9b1fc06116e84c60c6ad174fa043d44 ncdc-1.15.tar.gz

View file

@ -0,0 +1 @@
2070d5e24201079445be15845a5f36cba874c0a5 ncdc-1.15.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iQIcBAABCgAGBQJRTfHRAAoJEGI5TGmMJzn66j4QALkWJ9+LmTzJjQit4uyygX7b
2t3zWwilE8+b6dt28WpuUsFZXVaRyZpnY8RzLvdHzVXf6G2XLyDaGh35onoEeAW9
dVcsM34ZnqYHEb0CKMgZBAwqXOy/Tjw/TjAVZ3xBBCqgAiA32OWttMI3OaJ/nUSa
/PfMxfRfR5Y/x8FJdixSxULMBi1QKqhnaexMg7x0Z/2oL6EHx30ujvm0iLcc4Zji
emVZw31+TRy5zUiv8smaJ2jF/yyvcNLG1Sweb20g3OHqQuvlt2lW8tqpiGnItwlq
W9HqqnsN2g1zW6zg2gurLkWY02cCFBZ6S7ahQpTd2UiwrRHqZr4vvdjbapPvg78s
6JZmybzYCvxgQJcDBf1qaSvQW0j2INo8dey0pz1XBv5XoBT06K75kOh5Jh5aSGCt
jomyVyNvUcN/mZhcGEtHKfmDCS6nvLgvwmb8Tvyxsb09bPIZKA7Em74+/AeHuB2g
HlTxalh/wHc/jTipaT2rFNpe69itLPE0IrXPUs02XzJ2YgVGxRv68Lbtl0gMSKwW
ZlxVb9LTW8JS3BJTZgKEzWWG6w6DOrZMp7BLQ1QtlcCwUGfx/19VLVddyhZVD/Uf
p+DUndNECQoky/O9gAGx9d3g7MZ07GB1eMLCbssvvJDBO2426reDrOIXfcNG1dOd
AqVffZ3hu9ZC533tAvq7
=6pLs
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
baf3478e31616fc28827fc3641bfbe53 ncdc-1.16.1.tar.gz

View file

@ -0,0 +1 @@
3bdbf8c58a95eab2dc318bd853be991343f88fe9 ncdc-1.16.1.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iQIcBAABCgAGBQJRSvRBAAoJEGI5TGmMJzn6+2wP/3+j76MN1j699KoO9oc7gM89
VUV58WWgvrgj3tEc5LtQQxOjgTuluKJmNYauLxAuQXj+X1cPusNCvX4JXHTxLdZe
+9eEdeoA+IduX8zWzmp4nALK9G1oMBiHALN4hNuf80k5uHAZGp53WSEaKNqXiXBq
jkmp3VO1Tz7RdvIpmN9CSH8JdlEb8m+cSvYbfh4pMXsg7ucoXQyd8VZrd8iitjWL
PVMQ0ceZZCIiQugd0YtbtH00iKxKeVBPhtG/sfOWU2QjYBn9vZ4sPwhEaV+isjN/
cvn+bmcmkwgK3P7t288WsRHrqQqq+FLKJYGNXTsrqe+8HFYsgk+MkvktpH7lz346
nou/MXekZUC5jLLaTOTcy/tT1XSkHYDWmCdXjFQd06hdGbX0HPJZHS51rqDys+Kx
PuilgR3NKSoS5f29ytuIGsNO6lWZd0WWD73S7kkr1Bp6OgNb6KqZLVCsFGIASirR
pjMoHXCtCBNuH6Fd/QWrFsg9TKHtKiKPthdEnK+snVWIpvoD070HxhgrCw3qoYWy
SWWPtjky12TMKPx7B4XHRmP6kUU3YJJrmxESHHpF2DK2bD7wdyN2XHzGC+PQQPCM
SRsTnBr0eNNgXOt8TLDaWnI1jmgUR3iQpWTvjwnfSo2fZkJ0TM4R2E3bUsTG9z4k
k9Bfq9BVojyFRpMU+qsT
=5cYU
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
4a33c6f5393c31d17f36ec871f799e16 ncdc-1.16.tar.gz

View file

@ -0,0 +1 @@
4b3ab1c38557af1edb480b7c694bd28a08af6da8 ncdc-1.16.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.20 (GNU/Linux)
iQIcBAABCgAGBQJRvC1/AAoJEGI5TGmMJzn6xWgQANoAJbOPobz/TGnEA+f0icoa
oZ5GjXtnvxbN2JuPEewKqBO4lKLmjBFWZowFfuvWtB9mzmNuJSceWUa5CPCDiJq+
ZM2WkWFTX1lVAnPdQBtUQWP0q79QHKS/1U2CyDRMI15rN8qB2yWTMj/6e2gydxsc
HRsXHZXbLVHHcX1g8g6smYnaC1FAo2U0Bp9o+EKcQYveH+KtMJsdx7V7IiyvNAW0
zc9mxyjwfv3ZT0GbbAOmaE2feKnPvGWPEynuKXnuj66Ze9Oxj66EHEaJEbxKs2vD
WijkTUfZeZ2g+iqsWWhSrVdJwRKJXy4l+JWsZKAmLUgTNx5vdCZ3UnSfh9q5IaNW
V655Xx++SUO7rk5ekit2Dhbh31d+lDFU2O90OMw6+RbNW7vIwIZQH3OuiFBe3OIx
znx/DLkDDa3M0/40g92D1U8w1L93+U7icoCf5SJ1TuNqkrtdYS51M1HoAklU7VpB
GTlOZqISQY8qB5m1w4L1//QXjX/WZPyBP2bNVEQC1LE0cfV/srniW0YXRYA9bRoy
izv9tWz6as6guZkAQ8OEW2I7IXuDJXKnu/yzmNTvj5uDXvW9hJpCTfztxaIzOA3h
pRw9Z4T3FlXEkB4oZhouf0DBDBsl9hX6x3ibijEyEUkIBUWAUOkncboXlQ8Baa5p
TKrRCoO3Q8Js2DJttysw
=ZHrm
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
cba07d44fa90759477053457e9fd8906 ncdc-1.17.tar.gz

View file

@ -0,0 +1 @@
8a2a24c064997b0dd772e25d17a05f1baeb17c56 ncdc-1.17.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.20 (GNU/Linux)
iQIcBAABCgAGBQJSUBb8AAoJEGI5TGmMJzn6wlAQANWirjw2yB5MLBVJlj5WfCOH
ky6giyilDJnn8C2PPOXmvI8ddTUm6OSNCpGrK2gQ82bUqurx10aIYQfy+GZHvSgj
5pi8GIQiQ1Js4b9BdX54zgeE6GhCk10mN0R4+xoMgszN+5mwRrg66WGsF2A6dZiB
vvm3rQnpk3ydDb9kn/vGun8CT9e2xX43aXZ4EJtheHXkdx+o76Pb7LmORElZnKqm
10Dw+SGZQ272xuiwnj1UROvMUnbs8yhq8ADpRONL7L1UGlORUpFjmAkB3UE8kLFE
4CjTgYLKG6X3L8CFRMttQWmGNTMuvCBxGjqASUQunC1HV10B87ItbuHIiNbjxsEB
pj+6dGye4gSI7J3piAXrIe4PG27UhQ9BnbQbhv7NtVM9IPSlb3hyMjzqZOethnRX
PgTdwdEy53TI50hJf8tZAC8ZEOyPKtxFqufm7dx8NgoVsX0Si6NLwaAEpxu4h/Ny
2QSWB3zGFZinaQ0QWuvXbzJMqjyzYvXGDpPGCUaGx4vcdE/Rz85ywzYeuBIiEH24
N7NFD+nVaIpRQthH7GRqOwzgn1qHFPvm6DDj+jv3gzpUSkOz16iWVcIyatXPFJg1
BFvlaZm8e2/lQXEyTu8QW6soGq4Pp+nxvow7xpMBSKNAk9gw7GBRPn1TaDQaD83t
BLtM/ZkDdqrJMqQnWq9n
=CwkC
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
c0070916c8bb8a0409d01f6663ca0c6a ncdc-1.18.1.tar.gz

View file

@ -0,0 +1 @@
184dce59b5b51563f869a43d81971a1537cdc438 ncdc-1.18.1.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.20 (GNU/Linux)
iQIcBAABCgAGBQJSQuCkAAoJEGI5TGmMJzn64c4QAML+Tyh+OdljrKG2deU4RS1p
Gmy+dXvYnPmjAat4JXhfTKS6diFeu0CiFzK22FjtUYhZixRx0pt9yiXXumGQ3WTp
LGK6rSEGl6NTHunVX2KRjYbGwc1vqszk8GwjvLwFB+5//t2ojGIeBqji3Tea2+sH
ZwLzKqWuo/BMhKsE4EWH/A5EEi6jhOtrPqC/zI0s6j3cUH0HAvMPPfCmakBHcIQx
pMt6U+gkOl2a+aP0dwbq4ct7YKgidzSnAqE/RR+k5nHSZK64j0aUA4/5Po9wgOl7
9AXuASYatMFT6T92OEIcEz0/r814X1F30LQIH62xwh2xk7mYb5Y8JKQ7Bex7uCHf
0dfH/ug215VwoVRBUkAnCvYKAaYM62DOZCrMNaIqLcupDsbPIuHUVwhH8AGQoHYH
gKZ9NxBcCTVshebM1ee2gDjLOPt0wqU920LiXYH3g6OeLnUSQh9kdWOjSglfzWxR
EGnv4h2TtYQjBkPguxPRvF0bs7WKIMKKd+px+kmCzdIp2lsV5ChM1EeKKtKs7Kmy
zFR5X63RLZZr//ANeP7MUvZueEwbgnrrkl/BH8K8sSfNclVZ7ccHdIz9WfSf+A5y
01kskhiLS58IJf8vYg/wnuyhS7pIeaK6NJvhI/NXTqJozGsoK7xO+/8MU5Mx6/aB
wNl26DGtO8UjmBO/gx8/
=kdtR
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
2d8d7d4cd8f0ddb9b3d93b24f1c61ecd ncdc-1.18.tar.gz

View file

@ -0,0 +1 @@
407515d187403492372b4f22625bc403393e51fb ncdc-1.18.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)
iQIcBAABCgAGBQJTV4OTAAoJEGI5TGmMJzn6gR8QAJIld8yIHZC2JBciiX05q+JA
REsqgESY74U4OSCIXHxykXHT+lHjgs3nZeObz8CV/NRF1CYzNIsIVJ/CHCyUEQtE
tVRpBx8yF+v9VvnsOVzEVPRQTUw12VjRznFXFtpGkVHRQXkzxRRrB4X6e0M9xaDU
Q3xuPBwP0aC2SI8tV6imwdsrWE8Ez8eHChPyl2fjwBME21RpyYxWrygh5jvpR/G8
Rz/nOwK5AeMIjZqmWOL5BssvIi0BjalvtrZ8V1hvNPatajGOlceTrJU44R2l93oG
WHA9vczoOpgkgiC4NkC4i0aGHsc+2P5GAp/p83bu3HnNWaJm9QwTzacqfByoTpmn
jlMeKSxiZfz+pxx6BcSheR2n3FGS/+W+X4YTAEG+XU3lCDolW3zfLwISEXlRWtbK
ZodJX4yHGX2i6d5OjOsya5proJhSNv/jbct6W5pNpoR2TYaUV4+o0pOjD+SiICZz
iyN1JzMMWjbPmF9TeJk1OoouqZGz5XPzUcD7JbJfVBPN6Q6q6+jvjAA2HenX/XPR
NRwR+kTdJVDpCmX+yN+RrmxUr9ifMvpTJSwJgJUzbmUGhAPOjqch4gBmgSRgou/7
lzr3s7+nUgR4dmVT+q7fhhEd8AsC1TsGdoBdqYiJSDmAzpNtZwnJM3J2uLjgxy5D
Pt9u5bS1tps9tk1m0vFH
=0uVC
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
a7d23df7d0e291d1e3c8fb2a9a69f7a9 ncdc-1.19.1.tar.gz

View file

@ -0,0 +1 @@
a02fcb67fb54ac739325db64f83d796647c98834 ncdc-1.19.1.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)
iQIcBAABCgAGBQJS+ewKAAoJEGI5TGmMJzn6QTAQAMY3p8imfuiWoVNgdFgm/ica
UzCEQDj6rJ+1khPBLRoLnDAnkTCDRAueY/4489vcm8TwpsunmsnDd9+LdwHup7CF
5OtnQyQD89BYMvrGqzA7iLLh3wOqibpT5B9PbffhZS1vRfi9NdBUBgvENKLxMuJ6
dyQ6wMxeDSiVCwHj1M+6U4dCQXyyirfNbgwl/QQaN9Gwc/z+Qu0CSi6B+iQFC+qz
zf8oH8fM1R7mryOExj0WQ8tY/Qa2V8NKBCC6PO3Zv9xgKSH8fVvwJZ4mbBn0EQxz
4juQjPGwFcdbHYFob5/YCsuZiSIeOFjcrI0ub18C+Xekw8TuEU3FPdIyhLmBhDkA
/XGcXpgDllMKDyjEMGXaDUBPDkgrr26WqeqniL92Hxtiy135OXX+2I/SB8Yny3Lr
xupOsxeoG42eIzFFf2qJ8XUDeeppw49jhTFjk++pqKFe0o21elFeEx5FdHd6TufA
x43DpfCVHfApQdD6nMaMMBab4kTbzeODbu7bPt4kUDm26oBfMhsxfM8Ev03ANnsB
8UxFFec7N5QQEniSwDGfCxPCb7eciexhWT/rmxfv9B881FT12T4KGV8tJJHPzx5x
BIMcI+J4yor105KbYPY7Sz3zPEzzOyva1ab30g+G4fozbV1tlIgEmyyLzUcGH3ny
CICq6slRAymeoVnX3sWL
=f1iZ
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
e6b0f22e57c79e879f112ed574393848 ncdc-1.19.tar.gz

View file

@ -0,0 +1 @@
7f478b7daf09202586b40899cc6beabeb0d23178 ncdc-1.19.tar.gz

View file

@ -0,0 +1,17 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABCgAGBQJOnxTZAAoJEGI5TGmMJzn6Jy0P/1g2nwT6dtsXqsg9FsorEKEk
mBHv/0xyK6wljBzQABjjdDVKeUtVW72jdtkxjx672U3DMbOnQljNsNb/LmO1i8kJ
WSa7DzZqMT3edu5R2YVo+qaEyjVQoA4xOj7SYMik0khgNgvgKY5hS+0dRkB8sYgV
rkn0cQUrLs+ghYhs72SI2JLL7Tgr3FM53taoLRTwkIL7jYun15NVNgXuhXbqfpXo
i6nCD8Awu+kOAhVXi6VBp0beaVBn+/iM8ww5E3blLPHxos03wtFlyk/wKwdBA26Q
X0KvSVeAuV3HppYt0gWmsmQgmkaGOeVY2c9gKNFNm2i58y/Ll5YzS5laubXN7ihe
eYtMnlvnR5Zn+9b1TRTLvQkxtJABYcPkJPnCx05gwa2IcDW2NQCVlypFDm+Uctv+
7bZNn5iy1RA7ho4eFxqnhqNwxDMFVgMnDyFA6pT+Vtn6XjJZWd5dB28Qm4LlETiU
mOmji09BCFXSQ+hscB/uJDZaE2XBbHUbGOOtB4t3vNkR9USLYRYR6r32AscjNYqT
4Dx6nTrJSmgVW930/K/Jxcs5QdSy23DEkHiExtVoc1AxdTL5cCgjjKWTvBNvHlNY
rzoyMNOQPBjPypvuWr7taTChWF27dBgwhjf5euXvXID0iKB+YXJM74RMEKDVsb7x
Ius7qsfUF/dnurhjD1ux
=9wI1
-----END PGP SIGNATURE-----

View file

@ -0,0 +1 @@
d99678479df72b450eee86501394584f ncdc-1.2.tar.gz

View file

@ -0,0 +1 @@
6166c124d0b636ab6bfb6873bcb97b5ab3c7e4e8 ncdc-1.2.tar.gz

View file

@ -0,0 +1,16 @@
-----BEGIN PGP SIGNATURE-----
iQIcBAABCgAGBQJYZkvqAAoJEGI5TGmMJzn653IQAJmPCbJOYMzObXGY+HvLM719
ZzTT060NWBMJzLMNTa1wygpSrnYva/v1/T1VLHL9/PcLqV6no+J0mJmw+BpNX1Zg
HIdJIEBgL76JfsCqOheKV3mPWbCI9KoFRnd7lAHOfMSW/yuzQ+H+wJTFamO6op2y
8M4FGHxVxUqe9QNs++QGS3mPVTTd75vB7Whv0iHU+mLB5fldxgyf11LEowouJb9Z
khdYRWLChzbG7ycKRYjd3VXRrDybAI8gsBuc9i37AtTQnhCnymipSF3O2X+vYApX
Dgq9SoLbpsJB9cZU93qrpBQVmD8yBVlLcUxS255V+iszvtDVPG+BliQxiKlz+CxL
wL0KAtMqu5kPOd1B+R1pBcitXRlZ/p/UfUKliUsTxIn8m8sJApt5WDb7ino/kWwb
BqQ7dS5gVKeY+zP4ksNABQHseAmDdXlGMZSXR6iK5ucbCWc/pVOnIczYY+IIyu3T
jTPhttaxDzg7+Bjn8owdu8I/rxFgNPs779R8JYp3iTahmYf73epHs870g8vOJDAt
j+6Pn0u/MGpwJsAM5lrev0djv2RhULq84pWeESIuCIO1PX0EIS+3G6A6kPD2k3D9
ceIaj9gjLv5aRwnFolEKYgp/ChOdDFqW4tLOT7RvE2htRu10HkNJT1QWmrZvzBrt
/R+0i5+oRip1E3HNsbcq
=//tc
-----END PGP SIGNATURE-----

Some files were not shown because too many files have changed in this diff Show more