breakpoints = (
 			69868C9D14618450004C5D9B /* packet.c:9 */,
 			69868EE41461AA6F004C5D9B /* packet.c:207 */,
-			69269F4E14620FC200F69705 /* packet.c:167 */,
+			69269F4E14620FC200F69705 /* packet.c:175 */,
 		);
 		codeSenseManager = 69868AD51460E35F004C5D9B /* Code sense */;
 		perUserDictionary = {
 				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
 				PBXFileTableDataSourceColumnWidthsKey = (
 					20,
-					852,
+					648,
 					20,
 					48,
 					43,
 			69269FA01462137A00F69705 /* PBXTextBookmark */ = 69269FA01462137A00F69705 /* PBXTextBookmark */;
 			69269FA71462140200F69705 /* PBXTextBookmark */ = 69269FA71462140200F69705 /* PBXTextBookmark */;
 			69269FAE1462141200F69705 /* PBXTextBookmark */ = 69269FAE1462141200F69705 /* PBXTextBookmark */;
+			69269FB1146237EA00F69705 /* PBXTextBookmark */ = 69269FB1146237EA00F69705 /* PBXTextBookmark */;
+			69269FB2146237EA00F69705 /* PBXTextBookmark */ = 69269FB2146237EA00F69705 /* PBXTextBookmark */;
+			69269FB3146237EA00F69705 /* PBXTextBookmark */ = 69269FB3146237EA00F69705 /* PBXTextBookmark */;
+			69269FBD14623A5A00F69705 /* PBXTextBookmark */ = 69269FBD14623A5A00F69705 /* PBXTextBookmark */;
+			69269FBE14623A5A00F69705 /* PBXTextBookmark */ = 69269FBE14623A5A00F69705 /* PBXTextBookmark */;
+			69269FBF14623A5A00F69705 /* PBXTextBookmark */ = 69269FBF14623A5A00F69705 /* PBXTextBookmark */;
+			69269FC014623A5A00F69705 /* PBXTextBookmark */ = 69269FC014623A5A00F69705 /* PBXTextBookmark */;
+			69269FC414623C6700F69705 /* PBXTextBookmark */ = 69269FC414623C6700F69705 /* PBXTextBookmark */;
+			69269FC514623C6700F69705 /* PBXTextBookmark */ = 69269FC514623C6700F69705 /* PBXTextBookmark */;
+			69269FC614623C6700F69705 /* PBXTextBookmark */ = 69269FC614623C6700F69705 /* PBXTextBookmark */;
+			69269FCA14623E3800F69705 /* PBXTextBookmark */ = 69269FCA14623E3800F69705 /* PBXTextBookmark */;
+			69269FD014623EB800F69705 /* PBXTextBookmark */ = 69269FD014623EB800F69705 /* PBXTextBookmark */;
+			69269FD214623F6800F69705 /* PBXTextBookmark */ = 69269FD214623F6800F69705 /* PBXTextBookmark */;
+			69269FD814623F8800F69705 /* PBXTextBookmark */ = 69269FD814623F8800F69705 /* PBXTextBookmark */;
+			69269FE61462402B00F69705 /* PBXTextBookmark */ = 69269FE61462402B00F69705 /* PBXTextBookmark */;
+			69269FE71462402B00F69705 /* PBXTextBookmark */ = 69269FE71462402B00F69705 /* PBXTextBookmark */;
+			69269FEB1462413F00F69705 /* PBXTextBookmark */ = 69269FEB1462413F00F69705 /* PBXTextBookmark */;
+			69269FF21462414C00F69705 /* PBXTextBookmark */ = 69269FF21462414C00F69705 /* PBXTextBookmark */;
+			69269FF91462423A00F69705 /* PBXTextBookmark */ = 69269FF91462423A00F69705 /* PBXTextBookmark */;
+			6926A0001462426D00F69705 /* PBXTextBookmark */ = 6926A0001462426D00F69705 /* PBXTextBookmark */;
+			6926A007146242ED00F69705 /* PBXTextBookmark */ = 6926A007146242ED00F69705 /* PBXTextBookmark */;
+			6926A00E146243CA00F69705 /* PBXTextBookmark */ = 6926A00E146243CA00F69705 /* PBXTextBookmark */;
+			6926A0151462445400F69705 /* PBXTextBookmark */ = 6926A0151462445400F69705 /* PBXTextBookmark */;
+			6926A01C1462449200F69705 /* PBXTextBookmark */ = 6926A01C1462449200F69705 /* PBXTextBookmark */;
+			6926A0231462454F00F69705 /* PBXTextBookmark */ = 6926A0231462454F00F69705 /* PBXTextBookmark */;
+			6926A02A1462457A00F69705 /* PBXTextBookmark */ = 6926A02A1462457A00F69705 /* PBXTextBookmark */;
+			6926A033146245AE00F69705 /* PBXTextBookmark */ = 6926A033146245AE00F69705 /* PBXTextBookmark */;
+			6926A03A1462D95600F69705 /* PBXTextBookmark */ = 6926A03A1462D95600F69705 /* PBXTextBookmark */;
+			6926A0411462D98D00F69705 /* PBXTextBookmark */ = 6926A0411462D98D00F69705 /* PBXTextBookmark */;
+			6926A0461462D9B900F69705 /* PBXTextBookmark */ = 6926A0461462D9B900F69705 /* PBXTextBookmark */;
+			6926A04A1462DAB900F69705 /* PBXTextBookmark */ = 6926A04A1462DAB900F69705 /* PBXTextBookmark */;
+			6926A0501462DAE200F69705 /* PBXTextBookmark */ = 6926A0501462DAE200F69705 /* PBXTextBookmark */;
+			6926A0571462DC7E00F69705 /* PBXTextBookmark */ = 6926A0571462DC7E00F69705 /* PBXTextBookmark */;
+			6926A0641462DCB200F69705 /* PBXTextBookmark */ = 6926A0641462DCB200F69705 /* PBXTextBookmark */;
+			6926A06B1462DCD300F69705 /* PBXTextBookmark */ = 6926A06B1462DCD300F69705 /* PBXTextBookmark */;
+			6926A0721462DEE000F69705 /* PBXTextBookmark */ = 6926A0721462DEE000F69705 /* PBXTextBookmark */;
+			6926A0791462DF3A00F69705 /* PBXTextBookmark */ = 6926A0791462DF3A00F69705 /* PBXTextBookmark */;
+			6926A0801462DF6000F69705 /* PBXTextBookmark */ = 6926A0801462DF6000F69705 /* PBXTextBookmark */;
+			6926A0871462DF7800F69705 /* PBXTextBookmark */ = 6926A0871462DF7800F69705 /* PBXTextBookmark */;
+			6926A0901462DFB200F69705 /* PBXTextBookmark */ = 6926A0901462DFB200F69705 /* PBXTextBookmark */;
+			6926A09D1462E09C00F69705 /* PBXTextBookmark */ = 6926A09D1462E09C00F69705 /* PBXTextBookmark */;
+			6926A09E1462E09C00F69705 /* PBXTextBookmark */ = 6926A09E1462E09C00F69705 /* PBXTextBookmark */;
+			6926A09F1462E09C00F69705 /* PBXTextBookmark */ = 6926A09F1462E09C00F69705 /* PBXTextBookmark */;
+			6926A0B01462E1BE00F69705 /* PBXTextBookmark */ = 6926A0B01462E1BE00F69705 /* PBXTextBookmark */;
+			6926A0B11462E1BE00F69705 /* PBXTextBookmark */ = 6926A0B11462E1BE00F69705 /* PBXTextBookmark */;
+			6926A0B21462E1BE00F69705 /* PBXTextBookmark */ = 6926A0B21462E1BE00F69705 /* PBXTextBookmark */;
+			6926A0BB1462E1D900F69705 /* PBXTextBookmark */ = 6926A0BB1462E1D900F69705 /* PBXTextBookmark */;
+			6926A0C21462E20500F69705 /* PBXTextBookmark */ = 6926A0C21462E20500F69705 /* PBXTextBookmark */;
+			6926A0C71462E29800F69705 /* PBXTextBookmark */ = 6926A0C71462E29800F69705 /* PBXTextBookmark */;
 			69868BD11460F42D004C5D9B = 69868BD11460F42D004C5D9B /* PBXTextBookmark */;
 			69868BD91460F468004C5D9B = 69868BD91460F468004C5D9B /* PBXTextBookmark */;
 			69868C931460F7C3004C5D9B = 69868C931460F7C3004C5D9B /* PBXTextBookmark */;
 			sepNavVisRange = "{0, 1356}";
 		};
 	};
+	69269F2214620D0F00F69705 /* packet_test.h */ = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {826, 591}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRange = "{0, 291}";
+		};
+	};
 	69269F2314620D0F00F69705 /* packet.c */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1030, 8294}}";
-			sepNavSelRange = "{4835, 0}";
-			sepNavVisRange = "{4194, 1805}";
+			sepNavIntBoundsRect = "{{0, 0}, {826, 8879}}";
+			sepNavSelRange = "{15034, 0}";
+			sepNavVisRange = "{14619, 1552}";
 		};
 	};
 	69269F2414620D0F00F69705 /* packet.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1030, 1729}}";
-			sepNavSelRange = "{1161, 7}";
-			sepNavVisRange = "{313, 1144}";
+			sepNavIntBoundsRect = "{{0, 0}, {826, 1820}}";
+			sepNavSelRange = "{960, 0}";
+			sepNavVisRange = "{264, 985}";
 		};
 	};
-	69269F4E14620FC200F69705 /* packet.c:167 */ = {
+	69269F4E14620FC200F69705 /* packet.c:175 */ = {
 		isa = PBXFileBreakpoint;
 		actions = (
 		);
 		functionName = "spgp_decode_message()";
 		hitCount = 0;
 		ignoreCount = 0;
-		lineNumber = 167;
+		lineNumber = 175;
 		location = duckdog;
-		modificationTime = 341971971.281257;
+		modificationTime = 342024710.159102;
 		originalNumberOfMultipleMatches = 1;
 		state = 2;
 	};
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 168";
 		rLen = 0;
-		rLoc = 4835;
+		rLoc = 5131;
 		rType = 0;
 		vrLen = 1715;
 		vrLoc = 3704;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 168";
 		rLen = 0;
-		rLoc = 4835;
+		rLoc = 5131;
 		rType = 0;
 		vrLen = 1715;
 		vrLoc = 3704;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 168";
 		rLen = 0;
-		rLoc = 4835;
+		rLoc = 5131;
 		rType = 0;
 		vrLen = 1715;
 		vrLoc = 3704;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 171";
 		rLen = 0;
-		rLoc = 4921;
+		rLoc = 5217;
 		rType = 0;
 		vrLen = 1762;
 		vrLoc = 3553;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 171";
 		rLen = 0;
-		rLoc = 4921;
+		rLoc = 5217;
 		rType = 0;
 		vrLen = 1762;
 		vrLoc = 3553;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 168";
 		rLen = 0;
-		rLoc = 4835;
+		rLoc = 5131;
 		rType = 0;
 		vrLen = 1766;
 		vrLoc = 3553;
 		fRef = 69269F2414620D0F00F69705 /* packet.h */;
 		name = "packet.h: 59";
 		rLen = 7;
-		rLoc = 1161;
+		rLoc = 1307;
 		rType = 0;
 		vrLen = 1144;
 		vrLoc = 313;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 209";
 		rLen = 0;
-		rLoc = 6071;
+		rLoc = 6367;
 		rType = 0;
 		vrLen = 1536;
 		vrLoc = 4539;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 197";
 		rLen = 0;
-		rLoc = 5617;
+		rLoc = 5913;
 		rType = 0;
 		vrLen = 1317;
 		vrLoc = 5272;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 200";
 		rLen = 0;
-		rLoc = 5757;
+		rLoc = 6053;
 		rType = 0;
 		vrLen = 1337;
 		vrLoc = 5272;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 235";
 		rLen = 0;
-		rLoc = 6521;
+		rLoc = 7104;
 		rType = 0;
 		vrLen = 1333;
 		vrLoc = 5302;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 211";
 		rLen = 0;
-		rLoc = 6031;
+		rLoc = 6327;
 		rType = 0;
 		vrLen = 1370;
 		vrLoc = 5279;
 		fRef = 69269F2314620D0F00F69705 /* packet.c */;
 		name = "packet.c: 167";
 		rLen = 0;
-		rLoc = 4835;
+		rLoc = 5131;
 		rType = 0;
 		vrLen = 1805;
 		vrLoc = 4194;
 	};
+	69269FB1146237EA00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2414620D0F00F69705 /* packet.h */;
+		name = "packet.h: 48";
+		rLen = 0;
+		rLoc = 946;
+		rType = 0;
+		vrLen = 849;
+		vrLoc = 781;
+	};
+	69269FB2146237EA00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 379";
+		rLen = 0;
+		rLoc = 11582;
+		rType = 0;
+		vrLen = 1458;
+		vrLoc = 10100;
+	};
+	69269FB3146237EA00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 382";
+		rLen = 0;
+		rLoc = 12216;
+		rType = 0;
+		vrLen = 1447;
+		vrLoc = 10529;
+	};
+	69269FBD14623A5A00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2414620D0F00F69705 /* packet.h */;
+		name = "packet.h: 51";
+		rLen = 0;
+		rLoc = 961;
+		rType = 0;
+		vrLen = 872;
+		vrLoc = 870;
+	};
+	69269FBE14623A5A00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2214620D0F00F69705 /* packet_test.h */;
+		name = "packet_test.h: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 291;
+		vrLoc = 0;
+	};
+	69269FBF14623A5A00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 369";
+		rLen = 0;
+		rLoc = 11344;
+		rType = 0;
+		vrLen = 1552;
+		vrLoc = 10245;
+	};
+	69269FC014623A5A00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 390";
+		rLen = 0;
+		rLoc = 11582;
+		rType = 0;
+		vrLen = 1554;
+		vrLoc = 10245;
+	};
+	69269FC414623C6700F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2414620D0F00F69705 /* packet.h */;
+		name = "packet.h: 51";
+		rLen = 0;
+		rLoc = 961;
+		rType = 0;
+		vrLen = 1003;
+		vrLoc = 162;
+	};
+	69269FC514623C6700F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 376";
+		rLen = 0;
+		rLoc = 11640;
+		rType = 0;
+		vrLen = 1419;
+		vrLoc = 10245;
+	};
+	69269FC614623C6700F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 383";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1448;
+		vrLoc = 10536;
+	};
+	69269FCA14623E3800F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 156";
+		rLen = 0;
+		rLoc = 4522;
+		rType = 0;
+		vrLen = 1441;
+		vrLoc = 10487;
+	};
+	69269FD014623EB800F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 389";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1430;
+		vrLoc = 10361;
+	};
+	69269FD214623F6800F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 389";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1431;
+		vrLoc = 10361;
+	};
+	69269FD814623F8800F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 389";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1431;
+		vrLoc = 10361;
+	};
+	69269FE61462402B00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 389";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1658;
+		vrLoc = 14213;
+	};
+	69269FE71462402B00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 389";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1658;
+		vrLoc = 14213;
+	};
+	69269FEB1462413F00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 500";
+		rLen = 0;
+		rLoc = 15909;
+		rType = 0;
+		vrLen = 1664;
+		vrLoc = 14213;
+	};
+	69269FF21462414C00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 500";
+		rLen = 0;
+		rLoc = 15909;
+		rType = 0;
+		vrLen = 1664;
+		vrLoc = 14213;
+	};
+	69269FF91462423A00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 500";
+		rLen = 0;
+		rLoc = 15909;
+		rType = 0;
+		vrLen = 1377;
+		vrLoc = 10784;
+	};
+	6926A0001462426D00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 377";
+		rLen = 0;
+		rLoc = 11380;
+		rType = 0;
+		vrLen = 1425;
+		vrLoc = 10784;
+	};
+	6926A007146242ED00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 158";
+		rLen = 0;
+		rLoc = 4522;
+		rType = 0;
+		vrLen = 1595;
+		vrLoc = 3882;
+	};
+	6926A00E146243CA00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 386";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1542;
+		vrLoc = 10812;
+	};
+	6926A0151462445400F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 385";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1588;
+		vrLoc = 10812;
+	};
+	6926A01C1462449200F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 385";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1590;
+		vrLoc = 10812;
+	};
+	6926A0231462454F00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 385";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1591;
+		vrLoc = 10812;
+	};
+	6926A02A1462457A00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 385";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1591;
+		vrLoc = 10812;
+	};
+	6926A033146245AE00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 380";
+		rLen = 0;
+		rLoc = 11657;
+		rType = 0;
+		vrLen = 1542;
+		vrLoc = 10812;
+	};
+	6926A03A1462D95600F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 387";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1543;
+		vrLoc = 10812;
+	};
+	6926A0411462D98D00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 387";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1542;
+		vrLoc = 10812;
+	};
+	6926A0461462D9B900F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 385";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1578;
+		vrLoc = 10812;
+	};
+	6926A04A1462DAB900F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 386";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1542;
+		vrLoc = 10812;
+	};
+	6926A0501462DAE200F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 15";
+		rLen = 0;
+		rLoc = 259;
+		rType = 0;
+		vrLen = 1433;
+		vrLoc = 10541;
+	};
+	6926A0571462DC7E00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 379";
+		rLen = 0;
+		rLoc = 11344;
+		rType = 0;
+		vrLen = 1398;
+		vrLoc = 10541;
+	};
+	6926A0641462DCB200F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 390";
+		rLen = 0;
+		rLoc = 11931;
+		rType = 0;
+		vrLen = 1408;
+		vrLoc = 10541;
+	};
+	6926A06B1462DCD300F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 387";
+		rLen = 0;
+		rLoc = 11778;
+		rType = 0;
+		vrLen = 1395;
+		vrLoc = 10541;
+	};
+	6926A0721462DEE000F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 387";
+		rLen = 0;
+		rLoc = 11778;
+		rType = 0;
+		vrLen = 1400;
+		vrLoc = 10541;
+	};
+	6926A0791462DF3A00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 388";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1398;
+		vrLoc = 10541;
+	};
+	6926A0801462DF6000F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 388";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1412;
+		vrLoc = 10541;
+	};
+	6926A0871462DF7800F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 388";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1412;
+		vrLoc = 10541;
+	};
+	6926A0901462DFB200F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 388";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1442;
+		vrLoc = 10541;
+	};
+	6926A09D1462E09C00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2414620D0F00F69705 /* packet.h */;
+		name = "packet.h: 48";
+		rLen = 0;
+		rLoc = 960;
+		rType = 0;
+		vrLen = 1047;
+		vrLoc = 204;
+	};
+	6926A09E1462E09C00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 388";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1442;
+		vrLoc = 10541;
+	};
+	6926A09F1462E09C00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 394";
+		rLen = 0;
+		rLoc = 11889;
+		rType = 0;
+		vrLen = 1443;
+		vrLoc = 10541;
+	};
+	6926A0B01462E1BE00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2414620D0F00F69705 /* packet.h */;
+		name = "packet.h: 48";
+		rLen = 0;
+		rLoc = 960;
+		rType = 0;
+		vrLen = 985;
+		vrLoc = 264;
+	};
+	6926A0B11462E1BE00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 233";
+		rLen = 0;
+		rLoc = 6814;
+		rType = 0;
+		vrLen = 1202;
+		vrLoc = 5740;
+	};
+	6926A0B21462E1BE00F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 408";
+		rLen = 0;
+		rLoc = 12122;
+		rType = 0;
+		vrLen = 1545;
+		vrLoc = 11119;
+	};
+	6926A0BB1462E1D900F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 408";
+		rLen = 0;
+		rLoc = 12207;
+		rType = 0;
+		vrLen = 1553;
+		vrLoc = 11119;
+	};
+	6926A0C21462E20500F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 520";
+		rLen = 0;
+		rLoc = 15909;
+		rType = 0;
+		vrLen = 1557;
+		vrLoc = 14733;
+	};
+	6926A0C71462E29800F69705 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 69269F2314620D0F00F69705 /* packet.c */;
+		name = "packet.c: 498";
+		rLen = 0;
+		rLoc = 15034;
+		rType = 0;
+		vrLen = 1552;
+		vrLoc = 14619;
+	};
 	69868AD41460E35F004C5D9B /* Source Control */ = {
 		isa = PBXSourceControlManager;
 		fallbackIsa = XCSourceControlManager;
 		ignoreCount = 0;
 		lineNumber = 9;
 		location = duckdog;
-		modificationTime = 341971971.279537;
+		modificationTime = 342024710.1573;
 		originalNumberOfMultipleMatches = 1;
 		state = 2;
 	};
 		hitCount = 0;
 		ignoreCount = 0;
 		lineNumber = 207;
-		modificationTime = 341971971.280463;
+		modificationTime = 342024710.158496;
 		originalNumberOfMultipleMatches = 0;
 		state = 2;
 	};
    
 #include <stdio.h>
 #include <setjmp.h>
 #include "gcrypt.h"
+#include <wchar.h>
+#include <locale.h>
 
 
 /**********************************************************************
 
 static uint8_t spgp_parse_header(uint8_t *msg, uint32_t *idx, 
 														uint32_t length, spgp_packet_t *pkt);
-                            
+
+static uint8_t spgp_parse_user_id(uint8_t *msg, uint32_t *idx, 
+          												uint32_t length, spgp_packet_t *pkt);
+                                                              
 static uint8_t spgp_parse_secret_key(uint8_t *msg, uint32_t *idx, 
           													 uint32_t length, spgp_packet_t *pkt);
                                      
     
     // Decode packet contents based on the type marked in its header
     switch (pkt->header->type) {
+    	case PKT_TYPE_USER_ID:
+      	spgp_parse_user_id(message, &idx, length, pkt);
+        break;
       case PKT_TYPE_SECRET_KEY:
       case PKT_TYPE_SECRET_SUBKEY:
         spgp_parse_secret_key(message, &idx, length, pkt);
     	free((*pkt)->c.secret->iv);
       (*pkt)->c.secret->iv = NULL;
     }
+    free((*pkt)->c.secret);
+    (*pkt)->c.secret = NULL;
+  }
+  else if ((*pkt)->header->type == PKT_TYPE_USER_ID &&
+  				 (*pkt)->c.userid->data != NULL) {
+  	free((*pkt)->c.userid->data);
+    (*pkt)->c.userid->data = NULL;
+    
+    free((*pkt)->c.userid);
+    (*pkt)->c.userid = NULL;
   }
   
   // release header
 	return 0;
 }
 
+static uint8_t spgp_parse_user_id(uint8_t *msg, uint32_t *idx, 
+          												uint32_t length, spgp_packet_t *pkt) {
+	spgp_userid_pkt_t userid;
+
+  LOG_PRINT("Parsing user id.\n");
+
+	// Make sure we have enough bytes remaining for the copy
+  if (length - *idx < pkt->header->contentLength) RAISE(BUFFER_OVERFLOW);
+  
+  // Allocate space for buffer, plus one byte for NUL terminator
+	userid.data = malloc(sizeof(*(userid.data))*pkt->header->contentLength + 1);
+  if (NULL == userid.data) RAISE(OUT_OF_MEMORY);
+  
+  // Copy bytes from input to structure, and add a NUL terminator
+  memcpy(userid.data, msg+*idx, pkt->header->contentLength);
+  userid.data[pkt->header->contentLength] = '\0';
+  *idx += pkt->header->contentLength - 1;
+  
+  // Copy local structure into packet
+  pkt->c.userid = malloc(sizeof(*(pkt->c.userid)));
+  if (NULL == pkt->c.userid) RAISE(OUT_OF_MEMORY);
+  memcpy(pkt->c.userid, &userid, sizeof(userid));
+
+  setlocale(LC_CTYPE, "en_US.UTF-8");
+  wprintf(L"USER ID: %s\n", pkt->c.userid->data);
+  
+	return 0;                                     
+}
+
 static uint8_t spgp_parse_secret_key(uint8_t *msg, uint32_t *idx, 
           													 uint32_t length, spgp_packet_t *pkt) {
   spgp_secret_pkt_t secret;
   
   // If it's not encrypted, we can just read the secret MPIs
   if (!secret.s2kEncryption) {
-  	spgp_read_all_public_mpis(msg, idx, length, &secret);
+  	spgp_read_all_secret_mpis(msg, idx, length, &secret);
   }
   // If it is encrypted, just store it for now.  We'll decrypt later.
   else {
     LOG_PRINT("Stored %u encrypted bytes.\n", remaining);
     // This is the end of the data, so we do NOT do a final idx increment
   }
+  
+  pkt->c.secret = malloc(sizeof(*(pkt->c.secret)));
+  if (NULL == pkt->c.secret) RAISE(OUT_OF_MEMORY);
+  memcpy(pkt->c.secret, &secret, sizeof(secret));
+  
 	return 0;
 }
 
    
 typedef struct spgp_packet_struct spgp_packet_t;
 typedef struct spgp_mpi_struct spgp_mpi_t;
 typedef struct spgp_secret_packet_struct spgp_secret_pkt_t;
+typedef struct spgp_userid_packet_struct spgp_userid_pkt_t;
 
 struct spgp_packet_header_struct {
 	spgp_packet_t *parent;
 	spgp_pkt_header_t *header;
   union {
   	spgp_secret_pkt_t *secret;
+    spgp_userid_pkt_t *userid;
   } c;
 	spgp_packet_t *next;	
 };
 	spgp_mpi_t *next;
 };
 
+struct spgp_userid_packet_struct {
+	uint8_t *data;
+};
+
 struct spgp_secret_packet_struct {
 // This is public key stuff
 	uint8_t version;