]> git.mdlowis.com Git - proto/libbk.git/commitdiff
Initial commit
authorMichael D. Lowis <mike@mdlowis.com>
Sat, 31 Oct 2015 00:37:06 +0000 (20:37 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Sat, 31 Oct 2015 00:37:06 +0000 (20:37 -0400)
.gitignore
build.ninja [new file with mode: 0644]
source/alg.c [new file with mode: 0644]
source/bk.h [new file with mode: 0644]
source/bktrace.h [new file with mode: 0644]
source/drc.c [new file with mode: 0644]
source/main.c [new file with mode: 0644]
tests/input.log [new file with mode: 0644]
tests/main.c [new file with mode: 0644]

index bbf313b25987d0d61b1cea33a8e6188501e221ac..d58f66012aee95452b52fb836304097ba117510e 100644 (file)
@@ -30,3 +30,8 @@
 
 # Debug files
 *.dSYM/
+.ninja_deps .ninja_log
+*.d
+.ninja_deps
+.ninja_log
+tests/tests
diff --git a/build.ninja b/build.ninja
new file mode 100644 (file)
index 0000000..0c6cf85
--- /dev/null
@@ -0,0 +1,43 @@
+###############################################################################
+# Build Variables
+###############################################################################
+CC = gcc
+DEPSUFFIX = .d
+CPPFLAGS = -Isource/
+CFLAGS = -pg -g -O3 -Wall -Wextra --std=c99 --pedantic -DBK_DEBUG_TRACE
+LD = gcc
+LDFLAGS = -pg
+AR = ar
+ARFLAGS = rcs
+
+###############################################################################
+# Build Rule Definitions
+###############################################################################
+rule cc
+    command = $CC -MMD -MF $out$DEPSUFFIX $CPPFLAGS $CFLAGS -c -o $out $in
+    depfile = $out$DEPSUFFIX
+
+rule ld
+    command = $LD $LDFLAGS -o $out $in
+
+rule ar
+    command = $AR $ARFLAGS $out $in
+    depfile = $out$DEPSUFFIX
+
+rule run
+    command = ./$in
+
+###############################################################################
+# Build Targets
+###############################################################################
+# LibBK Static Library
+build source/main.o: cc source/main.c
+build source/alg.o: cc source/alg.c
+build source/drc.o: cc source/drc.c
+build libbk.a: ar source/main.o source/alg.o source/drc.o
+
+# Garbage Collection Test Application
+build tests/main.o: cc tests/main.c
+build tests/tests: ld tests/main.o libbk.a
+build gctrace.out: run tests/tests
+
diff --git a/source/alg.c b/source/alg.c
new file mode 100644 (file)
index 0000000..420fbdb
--- /dev/null
@@ -0,0 +1,4 @@
+#include <bk.h>
+
+const GCAPI* GC_Algorithm = &DeferredRC;
+
diff --git a/source/bk.h b/source/bk.h
new file mode 100644 (file)
index 0000000..c0547da
--- /dev/null
@@ -0,0 +1,142 @@
+#ifndef BK_H
+#define BK_H
+
+#include <stddef.h>
+
+#ifdef BK_DEBUG_TRACE
+    #include <bktrace.h>
+#else
+    /* Macros to log collector startup */
+    #define TRACE_INIT_START()
+    #define TRACE_INIT_END()
+
+    /* Macros to log collector shutdown */
+    #define TRACE_DEINIT_START()
+    #define TRACE_DEINIT_END()
+
+    /* Macros to log collection cycle */
+    #define TRACE_COLLECT_START()
+    #define TRACE_COLLECT_END()
+
+    /* Macros to log an allocation using the collector */
+    #define TRACE_ALLOC_START(ptr,size)
+    #define TRACE_ALLOC_END(ptr,size)
+
+    /* Macros to log an allocation using the collector */
+    #define TRACE_DEALLOC_START(ptr)
+    #define TRACE_DEALLOC_END(ptr)
+
+    /* Macros to log an reference increment using the collector */
+    #define TRACE_ADDREF_START(ptr)
+    #define TRACE_ADDREF_END(ptr)
+
+    /* Macros to log an reference decrement using the collector */
+    #define TRACE_DELREF_START(ptr)
+    #define TRACE_DELREF_END(ptr)
+#endif
+
+/* Destructor function pointer type. */
+typedef void (*dtor_t)(void*);
+
+/* Collector API definition structure */
+typedef struct {
+    void (*init)(void** stkbtm);
+    void (*deinit)(void);
+    void (*collect)(void);
+    void* (*alloc)(size_t sz, dtor_t dtor);
+    void (*dealloc)(void* ptr);
+    void (*addref)(void* ptr);
+    void (*delref)(void* ptr);
+} GCAPI;
+
+/* Single-threaded naive reference counting algorithm */
+extern const GCAPI NaiveRC;
+
+/* Single-threaded deferred reference counting algorithm */
+extern const GCAPI DeferredRC;
+
+/* Atomic reference counting algorithm */
+extern const GCAPI AtomicRC;
+
+/* The currently selected GC algorithm */
+extern const GCAPI* GC_Algorithm;
+
+/* Initialize the garbage collector */
+static inline void gc_init(void** stkbtm) {
+    TRACE_INIT_START();
+    GC_Algorithm->init(stkbtm);
+    TRACE_INIT_END();
+}
+
+/* Deinitialize the garbage collector */
+static inline void gc_deinit(void) {
+    TRACE_DEINIT_START();
+    GC_Algorithm->deinit();
+    TRACE_DEINIT_END();
+}
+
+/* Trigger a garbage collection cycle immediately */
+static inline void gc_collect(void) {
+    TRACE_COLLECT_START();
+    GC_Algorithm->collect();
+    TRACE_COLLECT_END();
+}
+
+/* Allocate a garbage collected object */
+static inline void* gc_alloc(size_t sz, dtor_t dtor) {
+    void* ptr;
+    TRACE_ALLOC_START((ptr = GC_Algorithm->alloc(sz, dtor)),sz);
+    TRACE_ALLOC_END(ptr,sz);
+    return ptr;
+}
+
+/* Deallocate a garbage collected object */
+static inline void gc_dealloc(void* ptr) {
+    TRACE_DEALLOC_START(ptr);
+    GC_Algorithm->dealloc(ptr);
+    TRACE_DEALLOC_END(ptr);
+}
+
+/* Increment the reference count for a garbage collected object */
+static inline void gc_addref(void* ptr) {
+    TRACE_ADDREF_START(ptr);
+    GC_Algorithm->addref(ptr);
+    TRACE_ADDREF_END(ptr);
+}
+
+/* Decrement the reference count for a garbage colected object */
+static inline void gc_delref(void* ptr) {
+    TRACE_DELREF_START(ptr);
+    GC_Algorithm->delref(ptr);
+    TRACE_DELREF_END(ptr);
+}
+
+/* Replace the value of a reference and adjust the reference counts accordingly */
+static inline void gc_swapref(void** var, void* val) {
+    void* oldref = *var;
+    gc_addref(val);
+    *var = val;
+    gc_delref(oldref);
+}
+
+/* Allocate a new garbage collected object */
+#define alloc(obj,dtor) gc_alloc(obj,dtor)
+
+/* Increment the reference count for a garbage collected object */
+#define retain(obj) (gc_addref(obj), obj)
+
+/* Decrement the reference count for a garbage colected object */
+#define release(obj) (gc_delref(obj), (void*)0)
+
+/* Replace the value of a reference and adjust the reference counts accordingly */
+#define assign(var,val) gc_swapref((void**)&(var), val)
+
+/*
+ * Make sure we use the built-in main which initializes the collector and calls user_main
+ */
+#ifndef NO_MAIN_WRAPPER
+    #define main user_main
+#endif
+int user_main(int, char**);
+
+#endif
diff --git a/source/bktrace.h b/source/bktrace.h
new file mode 100644 (file)
index 0000000..fd36a65
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef BKTRACE_H
+#define BKTRACE_H
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <time.h>
+
+static void debugtrace(char* fmtstr, ...) {
+    FILE* file = fopen("gctrace.out", "a");
+    va_list args;
+    va_start(args, fmtstr);
+    vfprintf(file, fmtstr, args);
+    va_end(args);
+    fclose(file);
+}
+
+/* Macros to log collector startup */
+#define TRACE_INIT_START() \
+    debugtrace("init_start, %ld, %d\n", clock(), CLOCKS_PER_SEC)
+
+#define TRACE_INIT_END() \
+    debugtrace("init_end, %ld\n", clock())
+
+/* Macros to log collector shutdown */
+#define TRACE_DEINIT_START() \
+    debugtrace("deinit_start, %ld\n", clock())
+
+#define TRACE_DEINIT_END() \
+    debugtrace("deinit_end, %ld\n", clock())
+
+/* Macros to log collection cycle */
+#define TRACE_COLLECT_START() \
+    debugtrace("collect_start, %ld\n", clock())
+
+#define TRACE_COLLECT_END() \
+    debugtrace("collect_end, %ld\n", clock())
+
+/* Macros to log an allocation using the collector */
+#define TRACE_ALLOC_START(ptr,size) \
+    debugtrace("alloc_start, %ld, %p, %ld\n", clock(), ptr, size)
+
+#define TRACE_ALLOC_END(ptr,size) \
+    debugtrace("alloc_end, %ld, %p, %ld\n", clock(), ptr, size)
+
+/* Macro to log an allocation using the collector */
+#define TRACE_DEALLOC_START(ptr) \
+    debugtrace("dealloc_start, %ld, %p\n", clock(), ptr)
+
+#define TRACE_DEALLOC_END(ptr) \
+    debugtrace("dealloc_end, %ld, %p\n", clock(), ptr)
+
+/* Macro to log an reference increment using the collector */
+#define TRACE_ADDREF_START(ptr) \
+    debugtrace("addref_start, %ld, %p\n", clock(), ptr)
+
+#define TRACE_ADDREF_END(ptr) \
+    debugtrace("addref_end, %ld, %p\n", clock(), ptr)
+
+/* Macro to log an reference decrement using the collector */
+#define TRACE_DELREF_START(ptr) \
+    debugtrace("delref_start, %ld, %p\n", clock(), ptr)
+
+#define TRACE_DELREF_END(ptr) \
+    debugtrace("delref_end, %ld, %p\n", clock(), ptr)
+
+#endif
diff --git a/source/drc.c b/source/drc.c
new file mode 100644 (file)
index 0000000..e3e6bc9
--- /dev/null
@@ -0,0 +1,302 @@
+#include <bk.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <setjmp.h>
+#include <assert.h>
+#include <string.h>
+
+typedef struct obj_t {
+    uintptr_t refs;
+    dtor_t dtor;
+} obj_t;
+
+typedef struct hash_entry_t {
+    obj_t* object;
+    unsigned int hash;
+    struct hash_entry_t* next;
+} hash_entry_t;
+
+typedef struct {
+    size_t size;
+    size_t bkt_count;
+    hash_entry_t** buckets;
+} hash_t;
+
+static void hash_set(hash_t* hash, hash_entry_t* entry);
+
+/*****************************************************************************/
+
+#define NUM_PRIMES (sizeof(Primes)/sizeof(unsigned int))
+
+static unsigned int Primes[] = {
+    5, 13, 23, 53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593,
+    49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469,
+    12582917, 25165843, 50331653, 100663319, 201326611, 402653189,
+    805306457, 1610612741
+};
+
+static unsigned int num_buckets(unsigned int idx) {
+    assert(idx < NUM_PRIMES);
+    return Primes[idx];
+}
+
+static void hash_init(hash_t* hash)
+{
+    hash->size      = 0;
+    hash->bkt_count = 0;
+    hash->buckets   = (hash_entry_t**)calloc(sizeof(hash_entry_t*), num_buckets(hash->bkt_count));
+}
+
+static void find_entry(hash_entry_t** parent, hash_entry_t** current, hash_entry_t* entry)
+{
+    while(*current != NULL) {
+        if (((*current)->hash == entry->hash) &&
+            ((*current)->object == entry->object))
+            break;
+        *parent  = *current;
+        *current = (*current)->next;
+    }
+}
+
+static void rehash(hash_t* hash)
+{
+    unsigned int oldcount, i;
+    hash_entry_t** oldbuckets;
+    hash_entry_t *node, *entry;
+    if ((hash->bkt_count+1) < NUM_PRIMES) {
+        oldcount = hash->bkt_count++;
+        oldbuckets = hash->buckets;
+        hash->buckets = (hash_entry_t**)calloc(sizeof(hash_entry_t*), num_buckets(hash->bkt_count));
+        hash->size = 0;
+        /* Iterate over all of the old buckets */
+        for (i = 0; i < num_buckets(oldcount); i++) {
+            node = oldbuckets[i];
+            /* re-insert all entries in the bucket into the new bucket table */
+            while (node != NULL) {
+                entry = node;
+                node = entry->next;
+                hash_set(hash, entry);
+            }
+        }
+        /* Free the old bucket table */
+        free(oldbuckets);
+    }
+}
+
+static uint64_t hash64(uint64_t key)
+{
+    key = (~key) + (key << 21);
+    key = key ^ (key >> 24);
+    key = (key + (key << 3)) + (key << 8);
+    key = key ^ (key >> 14);
+    key = (key + (key << 2)) + (key << 4);
+    key = key ^ (key >> 28);
+    key = key + (key << 31);
+    return key;
+}
+
+static size_t hash_size(hash_t* hash)
+{
+    return hash->size;
+}
+
+static void hash_set(hash_t* hash, hash_entry_t* entry)
+{
+    unsigned int index;
+    hash_entry_t *parent, *node, *deadite;
+    if (hash->size >= num_buckets(hash->bkt_count))
+        rehash(hash);
+    entry->hash = hash64((uint64_t)(entry->object));
+    index   = (entry->hash % num_buckets(hash->bkt_count));
+    parent  = NULL;
+    node    = hash->buckets[index];
+    deadite = NULL;
+    find_entry(&parent, &node, entry);
+    if ((parent == NULL) && (node == NULL)) {
+        hash->buckets[index] = entry;
+        entry->next = NULL;
+        hash->size++;
+    } else if (node == NULL) {
+        parent->next = entry;
+        entry->next = NULL;
+        hash->size++;
+    }
+}
+
+static hash_entry_t* hash_del(hash_t* hash, hash_entry_t* entry)
+{
+    unsigned int index;
+    hash_entry_t *parent, *node, *ret = NULL;
+    entry->hash = hash64((uint64_t)(entry->object));
+    index = (entry->hash % num_buckets(hash->bkt_count));
+    parent = NULL;
+    node = hash->buckets[index];
+    find_entry(&parent, &node, entry);
+    if (node != NULL) {
+        ret = node;
+        node = node->next;
+        if (parent != NULL)
+            parent->next = node;
+        else
+            hash->buckets[index] = node;
+        hash->size--;
+    }
+    return ret;
+}
+
+/*****************************************************************************/
+
+static bool Shutdown;
+static void** Stack_Bottom;
+static hash_t Zero_Count_Table;
+static hash_t Multi_Ref_Table;
+static hash_t Working_Table;
+
+static void drc_mark_region(void** start, void** end) {
+    hash_entry_t lookup = {0, 0, 0};
+    hash_entry_t* entry;
+    for (; start <= end; start++) {
+        lookup.object = *start;
+        entry = hash_del(&Working_Table, &lookup);
+        if (entry != NULL) {
+            hash_set(&Zero_Count_Table, entry);
+        }
+    }
+}
+
+static void drc_mark_stack(void) {
+    void* stack_top = NULL;
+    /* Determine which way the stack grows and scan it for pointers */
+    if (&stack_top < Stack_Bottom) {
+        drc_mark_region(&stack_top, Stack_Bottom);
+    } else {
+        drc_mark_region(Stack_Bottom, &stack_top);
+    }
+}
+
+static void drc_mark(void) {
+    jmp_buf env;
+    volatile int noinline = 1;
+    /* Flush Registers to Stack */
+    if (noinline) {
+        memset(&env, 0x55, sizeof(jmp_buf));
+        (void)setjmp(env);
+    }
+    /* Avoid Inlining function call so that we scan the registers along with
+     * the stack */
+    (noinline ? drc_mark_stack : NULL)();
+}
+
+static void drc_sweep_table(hash_t* table) {
+    unsigned int i;
+    /* Delete all the entries in the hash */
+    for (i = 0; i < num_buckets(table->bkt_count); i++) {
+        hash_entry_t* node = table->buckets[i];
+      table->buckets[i] = NULL;
+        while (node != NULL) {
+            hash_entry_t* deadite = node;
+            node = node->next;
+            obj_t* obj = ((obj_t*)(deadite->object)-1);
+            if (obj->dtor != NULL)
+                obj->dtor(deadite->object);
+            gc_dealloc(deadite);
+        }
+    }
+    free(table->buckets);
+}
+
+static void drc_init(void** stack_bottom)
+{
+    Stack_Bottom = stack_bottom;
+    hash_init(&Zero_Count_Table);
+    hash_init(&Multi_Ref_Table);
+    Shutdown = false;
+}
+
+static void drc_deinit(void)
+{
+    Shutdown = true;
+    drc_sweep_table(&Zero_Count_Table);
+    drc_sweep_table(&Multi_Ref_Table);
+}
+
+static void drc_collect(void) {
+#ifdef GC_DEBUG_MSGS
+    printf("BEFORE - ZCT: %ld MRT: %ld TOT: %ld\n",
+        hash_size(&Zero_Count_Table),
+        hash_size(&Multi_Ref_Table),
+        hash_size(&Zero_Count_Table) + hash_size(&Multi_Ref_Table));
+#endif
+    Working_Table = Zero_Count_Table;
+    hash_init(&Zero_Count_Table);
+    drc_mark();
+    drc_sweep_table(&Working_Table);
+#ifdef GC_DEBUG_MSGS
+    printf("AFTER - ZCT: %ld MRT: %ld TOT: %ld\n\n",
+        hash_size(&Zero_Count_Table),
+        hash_size(&Multi_Ref_Table),
+        hash_size(&Zero_Count_Table) + hash_size(&Multi_Ref_Table));
+#endif
+}
+
+static void* drc_alloc(size_t size, dtor_t dtor)
+{
+    hash_entry_t* entry = (hash_entry_t*)malloc(sizeof(hash_entry_t) + sizeof(obj_t) + size);
+    obj_t* p_obj = (obj_t*)(entry+1);
+    void* p_data = (void*)(p_obj+1);
+    entry->object = p_data;
+    p_obj->refs = 0;
+    p_obj->dtor = dtor;
+    hash_set(&Zero_Count_Table, entry);
+    if (hash_size(&Zero_Count_Table) >= 500) {
+        gc_collect();
+    }
+    return p_data;
+}
+
+static void drc_addref(void* ptr)
+{
+    hash_entry_t lookup = {0, 0, 0};
+    hash_entry_t* entry;
+    obj_t* obj = ((obj_t*)ptr-1);
+    if ((ptr != NULL) && !Shutdown) {
+        obj->refs++;
+        if (obj->refs == 1) {
+            lookup.object = ptr;
+            entry = hash_del(&Zero_Count_Table, &lookup);
+            assert(entry != NULL);
+            hash_set(&Multi_Ref_Table, entry);
+        }
+    }
+}
+
+static void drc_delref(void* ptr)
+{
+    hash_entry_t lookup = {0, 0, 0};
+    hash_entry_t* entry;
+    obj_t* obj = ((obj_t*)ptr-1);
+    if ((ptr != NULL) && !Shutdown) {
+        obj->refs--;
+        if (obj->refs == 0) {
+            lookup.object = ptr;
+            entry = hash_del(&Multi_Ref_Table, &lookup);
+            assert(entry != NULL);
+            hash_set(&Zero_Count_Table, entry);
+        }
+    }
+}
+
+/*****************************************************************************/
+
+const GCAPI DeferredRC = {
+    .init    = drc_init,
+    .deinit  = drc_deinit,
+    .collect = drc_collect,
+    .alloc   = drc_alloc,
+    .dealloc = free,
+    .addref  = drc_addref,
+    .delref  = drc_delref
+};
+
diff --git a/source/main.c b/source/main.c
new file mode 100644 (file)
index 0000000..dca7432
--- /dev/null
@@ -0,0 +1,11 @@
+#define NO_MAIN_WRAPPER
+#include <bk.h>
+#include <stdlib.h>
+
+int main(int argc, char** argv)
+{
+    void* stack_bottom = NULL;
+    gc_init(&stack_bottom);
+    atexit(gc_deinit);
+    return user_main(argc, argv);
+}
diff --git a/tests/input.log b/tests/input.log
new file mode 100644 (file)
index 0000000..5c85fa8
--- /dev/null
@@ -0,0 +1,1500 @@
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
+10,Mal,Temple of the Jade Serpent
+10,Wash,Temple of the Jade Serpent
+10,Zoe,Temple of the Jade Serpent
+10,Jayne,Temple of the Jade Serpent
+10,Kaylee,Temple of the Jade Serpent
+-3,Mal,Pistol
+-3,Wash,Hawaiian Shirt
+-8,Jayne,Grenade Launcher
+-1,Kaylee,Wrench
+10,Zoe,Shando-Pan Monastery
+10,Wash,Shando-Pan Monastery
+10,Mal,Shando-Pan Monastery
+10,Jayne,Shando-Pan Monastery
+10,Shepherd,Shando-Pan Monastery
+-2,Wash,Cargo Shorts
diff --git a/tests/main.c b/tests/main.c
new file mode 100644 (file)
index 0000000..734f99e
--- /dev/null
@@ -0,0 +1,130 @@
+#include <bk.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+/******************************************************************************
+ * GC Algorithm Setup
+ *****************************************************************************/
+const GCAPI* GC_Algorithm = &DeferredRC;
+
+/******************************************************************************
+ * Utility Functions
+ *****************************************************************************/
+static char* strclone(char* str) {
+    char* newstr = (char*)alloc(strlen(str)+1, NULL);
+    strcpy(newstr, str);
+    return newstr;
+}
+
+/******************************************************************************
+ * Pairs and Lists
+ *****************************************************************************/
+typedef struct {
+    void* car;
+    void* cdr;
+} Pair;
+
+static void pair_free(void* ptr) {
+    Pair* p = (Pair*)ptr;
+    release(p->car);
+    release(p->cdr);
+}
+
+Pair* cons(void* a, void* b) {
+    Pair* pair = (Pair*)alloc(sizeof(Pair), pair_free);
+    pair->car = retain(a);
+    pair->cdr = retain(b);
+    return pair;
+}
+
+static void* car(Pair* p) { return p->car; }
+static void* cdr(Pair* p) { return p->cdr; }
+
+static Pair* reverse(Pair* p) {
+    Pair* newlist = NULL;
+    while (p != NULL) {
+        newlist = cons(car(p), newlist);
+        p = cdr(p);
+    }
+    return newlist;
+}
+
+//static void foreach(Pair* list, void (*fn)(void*)) {
+//    while(list != NULL) {
+//        fn(car(list));
+//        list = cdr(list);
+//    }
+//}
+
+/******************************************************************************
+ * Record Definition
+ *****************************************************************************/
+typedef struct {
+    int amount;
+    char* person;
+    char* thing;
+} Record;
+
+static void record_free(void* ptr) {
+    Record* rec = (Record*)ptr;
+    assign(rec->person, NULL);
+    assign(rec->thing, NULL);
+}
+
+Record* record(int amt, char* p, char* t) {
+    Record* rec = (Record*)alloc(sizeof(Record), record_free);
+    rec->amount = amt;
+    rec->person = retain(p);
+    rec->thing  = retain(t);
+    return rec;
+}
+
+Record* parse_record(char* line) {
+    char* amount = strtok(line, ",");
+    char* person = strtok(NULL, ",");
+    char* thing  = strtok(NULL, ",");
+    thing[strlen(thing)-1] = '\0';
+    return record(atoi(amount), strclone(person), strclone(thing));
+}
+
+/******************************************************************************
+ * Record Definition
+ *****************************************************************************/
+/*
+    The main is a close analogue of this Ruby code:
+
+    dkp_log = File.foreach("dkp.log").map { |line|
+      amount, person, thing = line.strip.split(",")
+      [ amount.to_i, person, thing ]
+    }
+    standings = dkp_log.group_by { |trans| trans[1] }.map { |person, history|
+      [ person, history.reduce(0) { |sum, trans| sum + trans[0] } ]
+    }.sort { |a, b| b[1] <=> a[1] }
+*/
+#include <stdbool.h>
+
+//void printrec(void* ptr) {
+    //Record* rec = (Record*)ptr;
+    //printf("%d : %s : %s\n", rec->amount, rec->person, rec->thing);
+//}
+
+int main(int argc, char** argv) {
+    const char* infile = (argc == 2 && argv[1]) ? argv[1] : "tests/input.log";
+    /* Read the data in from the file */
+    char linebuf[1024];
+    FILE* data = fopen(infile, "r");
+    Pair* entries = NULL;
+    bool discard = false;
+    while(fgets(linebuf, 1023, data)) {
+        Record* rec = parse_record(linebuf);
+        if (!discard)
+            entries = cons(rec, entries);
+        discard = !discard;
+    }
+    entries = reverse(entries);
+    //foreach(entries, printrec);
+    fclose(data);
+    /* */
+    return 0;
+}