document.write('<script src="https://cdn.jsdelivr.net/highlight.js/9.0.0/highlight.min.js" type="text/javascript"></script>');
document.write('<link media="all" type="text/css" rel="stylesheet" href="https://cdn.jsdelivr.net/highlight.js/9.0.0/styles/default.min.css">');
document.write('<link media="all" type="text/css" rel="stylesheet" href="https://cdn.jsdelivr.net/highlight.js/9.0.0/styles/tomorrow.min.css">');
document.write('<style>#pastee-ADfMSBU2llpZabD0-content { margin-top: 0px !important; background-color: #f7f7f9; border: 1px solid #e1e1e8; white-space: pre-wrap; } #pastee-ADfMSBU2llpZabD0-content > code { margin-top: 0px !important; }</style>');
document.write('Paste provided by <a href="https://paste.ee">Paste.ee</a> - <a href="https://paste.ee/p/5KOG5">View Original</a> - <a href="https://paste.ee/r/5KOG5/0">View Raw</a> - <a href="https://paste.ee/d/5KOG5/0">Download</a><br />');
document.write('<pre id="pastee-ADfMSBU2llpZabD0-content"><code>pico-8 cartridge // http://www.pico-8.com\nversion 16\n__lua__\n--advanced micro platformer\n--@matthughson\n\n--if you make a game with this\n--starter kit, please consider\n--linking back to the bbs post\n--for this cart, so that others\n--can learn from it too!\n--enjoy! \n--@matthughson\n\n-- 1-1 features remaing:\n--\n-- [!]lives/game over/press start\n-- [!]transition to next level\n-- [!]flag pole\n-- [!]items in blocks\n--		[!]mushroom\n--		[!]flower\n--	 [!]star\n--  [!]coin blocks\n--	 [!]default coin\n--	 [!]dont smash bricks that contain stuff.\n--		[!]1up\n-- [!]flower power\n-- [!]star\n-- [!]pipe travel\n-- [!]turtle enemy\n-- [!]coins\n-- checkpoints\n-- [!]hidden blocks\n-- [?]points\n-- [!]palette swap level tiles\n-- [!]bounce mushrooms\n--\n-- offscreen markers for pits\n--	offscreen markers for items\n-- jump height tuning\n-- [!]prevent movement off edge of map\n-- [!]prevent walking backwards too far\n\n-- 1-2 features remaining:\n--\n-- [!] pipes\n-- level end\n-- warp zone (maybe later?)\n--	[!]turtle should collide at shell level.\n-- shell should kill other shells\n-- [!]turtle should turn when walking into other shells.\n-- elevator\n-- [!]red turtle\n-- [!]8x8 collision (landing at feet) for all enemies.\n--	[!]	remember to remove extra logic for stomping bottom half\n\n--[[ \npossible optimizations:\n* store level data in map\n* [!]convert player to m_obj\n--]]\n\n--log\n--printh(&quot;\n\n-------\n-start-\n-------&quot;)\n\n--redefine\n--------------------------------\n\n-- { tile, flipx, flipy }\nlocal map_data = { }\n\n_mget=mget\nfunction mget(x,y)\n	x=flr(x)\n	y=flr(y)\n	if map_data[x] and map_data[x][y] then\n		return map_data[x][y].tile\n	end\n	return 0\nend\n\n_mset=mset\nfunction mset(x,y,t)\n	if not map_data[x] then\n		map_data[x] = {}\n	end\n	if not map_data[x][y] then\n		map_data[x][y] = {}\n	end\n	--printh(&quot;mset: &quot; .. x .. &quot;,&quot; .. y .. &quot;, &quot; .. t)\n	map_data[x][y].tile = t\n	--_mset(x,y,t)\nend\n\n_map=map\nfunction map( celx, cely, sx, sy, celw, celh, layer )\n	--local cam_x,cam_y = cam:cam_pos()\n	local cam_x=peek(0x5f29)\n	cam_x=bor(shl(cam_x,8),peek(0x5f28))\n	local cam_y=peek(0x5f2b)\n	cam_y=bor(shl(cam_y,8),peek(0x5f2a))\n	--printh(&quot;camx/y:&quot; .. cam_x .. &quot;,&quot; .. cam_y)\n	--printh(#map_data[1])\n	local start_x=flr(cam_x/8)\n	local start_y=flr(cam_y/8)\n	local end_x=start_x+16\n	local end_y=flr(cam_y/8)+16\n	\n	--30% below\n	--local cell=map_data[26][26]\n for i=start_x,end_x do\n		local ct=map_data[celx+i]\n		if ct then\n			for j=start_y,end_y do\n				--30% below\n				local cell=ct[cely+j]\n				if cell then\n					if cell.tile!=0 then\n						local dx=sx+(i*8)\n						local dy=sy+(j*8)\n						local pop=false\n						--pal==3%\n						if fget(cell.tile,7) then \n							set_coin_pal()\n							pop=true\n						elseif cell.bgpal!=nil then\n							push_pal(pals[cell.bgpal])\n							pop=true\n						end\n						spr(cell.tile,dx,dy,1,1,cell.flipx,cell.flipy) --13%\n						if(pop)pop_pal()\n					end\n				end\n			end\n		end\n	end\nend\n\n--config\n--------------------------------\n\n--level pals\npals=\n{\n	{1,0,4,1,15,13},	--underground\n	--{4,3,15,12,},\n	{7,11,12,3}, --bush\n}\n\nmus={0,19,28}--overworld,under,castle\n\ncore_lvls={1,3}\n\n--begin lvls\nlvls={\n{\nw=446,\nh=30,\ncls=12,\nmus=1,\nbg=&quot;ff00d2000101010201030e000101020201031b000101010201030e000101020201031b000101010201030e000101020201031b000101010201030e000101020201030e0001040c0001010102010311000101010201030800010501060107050001010302010304000105020601071000010101020103080001050106010705000101030201030400010502060107100001010102010308000105010601070500010103020103040001050206010710000101010201030800010501060107050001010302010304000105020601070e0001080100010101020103080001050106010705000101030208000105010601071000010503060107180001050106010710000105030601071800010501060107100001050306010718000105010601071000010503060107160001080100010501060107100001050306160001093900080a0300030a01090e0001090b00030a0400010a0209010a3800020b08000108d300030b08000108d200040b08000108d100050b080001081a000109010002090a0001090300010a0109010a0109010a1500010c010d0900010c010d1200010a0109010a0e00010a0500020a0400010902000109020001090500010a0a00020a0600010b0200010b0a00020b0200010b0c00020a0109010a0c00060b080001081a00010e2300010c010d0600010f01100200010e0600010f01102700010e2500020b0200020b0400010e0300030b0200020b1a00070b0400010e030001081900011101120113010a0c00010e0a00010c010d0800010f01100600010f011001000111011201130500010f01100600010e1f000111011201130d00010e1500030b0200030b02000111011201130100040b0200030b0300010e0100010c010d0e00010c010d0100080b0300011101120113020001080a00010e0d0001110112011401150113060001010302010301110112011304000101010201030200010f01100800010f011001000101020201030100010f0110011101120114011501130400010f011001010302010301110112011304000101010201030f00010102020103030001110112011401150113060001010302010301110112011304000101010201030c00040b0202040b0111011201140115050b0200040b0103011101120113010f011002000101010201030900010f0110090b0200011101120114011501130100010b090001110112011304000101010201030500451602000f16030040160200891602000f160300401602004416&quot;,\nlookup=&quot;000000000000007b6c6d6b6b00007c0000007575008b00008c8d00007d000000767676766768777863636464696a797a818291928384939400008787a1a2a1a2a3a4a3a4008686a3a385a3a38600a386a3a3a3a385a3a3a361627172&quot;,\nbgflip=&quot;98c00598c00698c00798c00898c00998c00a98c00b98c00c98c00d98c00e98c00f98c01098c01198c01298c01398c0148050158650158c501592501598501598c0158060168660168c601692601698601698c0168070178230178670178830178c70178e301792701794301798701798c0179a30178080188240188680188840188c80188e40189440189880189a40188090198250198690198850198c90198e50199450199890199a5019&quot;,\nobjs=&quot;18b006650a00080c0a40080c0da00a9400a00f2f08001095004012940060129500a0129702a0129409c012940bc012990ca012970100172d0d60172d02c0180c0500180c0660180c0690180c0c20180c0c50180c0e40180c0e70180c0f80180c0fb0180c1000180c1030180c15c0180c15f0180c00e01ab0&quot;,\npipes={\n{116,18,2,4,0,0},\n},\nbgpal=&quot;0171882202f18422053186220771882208f184220b3186220d7188220ef184221141842214f184221af1842213e19112&quot;,\n},\n{\nw=34,\nh=30,\npal=1,\nmus=2,\nbg=&quot;01000301070004010102010301000301070004010102010301000301070004010102010301000e010102010301000e010102010301000401050405010102010301000e010102010301000301070404010102010301000e010102010301000301070404010102010301000301070504010102010301000301070002010106010701020103010003010700020101080109010201030d0a01080109010201030d0a0108010901020103&quot;,\nlookup=&quot;6464646400000000a4a3a4a3a2a1a2a1999aa9aa636364648182919283849394a1a2a1a2a3a4a3a461627172&quot;,\nbgflip=&quot;81e00081f00082000082100081e00181f00182000182100181e00281f00282000282100281e00381f00382000382100381e00481f00482000482100481e00581f00582000582100581e00681f00682000682100681e00781f00782000782100781e00881f00882000882100881e00981f00982000982100981e00a81f00a82000a82100a81e00b81f00b82000b82100b81e00c81f00c82000c82100c81e00d81f00d82000d82100d81e00e81f00e82000e82100e81e00f81f00f82000f82100f81e01081f01082001082101081e01181f01182001182101181e01281f01282001282101281e01381f01382001382101381e01481f01482001482101481e01581f01582001582101581e01681f01682001682101681e01781f01782001782101781e01881f01882001882101881e01981f01982001982101981e01a81f01a82001a82101a81e01b81f01b82001b82101b81e01c81f01c82001c82101c81e01d81f01d82001d82101d&quot;,\nobjs=&quot;&quot;,\npipes={\n{28,22,1,328,22,2},\n},\n},\n{\nw=384,\nh=30,\npal=1,\nmus=2,\nbg=&quot;ff00810001010500840117000701010201031101030003013500020102000601020004010600040158000102010307010d0003013500020102000601020004010600040158000102010307010d00030128000404070002010800020103000101040002010a0006044e000102010307010d000301330002010800020103000101040002015e000102010307010d000301260001010100040101000101050002010800020103000101040002010a0006014e000102010307010d0003011c00010109000101010401010200010101040101050002010400040402010300010101040101020002010a000601370006010f00010501060102010307010d0003010900050708000108010001080d0003010200030105000401020006010300030102000201020004011d0001050106190002081c00010201030102010307010d000301030001011000010801000108010001080100010803000108160002012f00010501060400010201030b0002010b00030816000601010201030102010307010100010501060200010501060200010501060200030112000108010001080100010801000108010001080300010801000108140002012f0001020103040001020103040001050106050002010a000408160006010102010301020103070101000102010302000102010302000102010302000301100001080100010801000108010001080100010801000108030001080100010845000102010304000102010304000102010305000201090005081600060101020103010201030701010001020103020001020103020001020103020002015009030025090200020902000c09070008090700060901020103010201036609030025090200020902000c09070008090700060901020103010201031609&quot;,\nlookup=&quot;0000000064646464a1a2a1a2a3a4a3a4999aa9aa818291928384939467687778696a797a61627172&quot;,\nbgflip=&quot;&quot;,\nobjs=&quot;0b2004950920080c05c00e9703a0109908a01094092010990980100c09b0100c1110100c12c01094014012940db012b010e0120c0cf014b00220160c0e7016b000c0172d0100172d0580172d05b0172d0760172d1240172f0200180c03a0180c07c0180c0800180c0c60180c0c90180c0cc0180c0e20180c&quot;,\npipes={\n{208,20,4,4,0,0},\n},\n},\n{\nw=34,\nh=30,\npal=1,\nmus=2,\nbg=&quot;01000e010102010301000e0101020103010002010c0001020103010002010c0001020103010002010c0001020103010002010c000102010301000c0102000102010301000c010200010201030100030108040101020001020103010002010c000102010301000c0102000102010301000e01010201030100020109040301010201030d0501060107010201030d050108010901020103&quot;,\nlookup=&quot;6464646400000000a4a3a4a3a2a1a2a1999aa9aa616271728182919283849394a1a2a1a2a3a4a3a4&quot;,\nbgflip=&quot;81e00081f00082000082100081e00181f00182000182100181e00281f00282000282100281e00381f00382000382100381e00481f00482000482100481e00581f00582000582100581e00681f00682000682100681e00781f00782000782100781e00881f00882000882100881e00981f00982000982100981e00a81f00a82000a82100a81e00b81f00b82000b82100b81e00c81f00c82000c82100c81e00d81f00d82000d82100d81e00e81f00e82000e82100e81e00f81f00f82000f82100f81e01081f01082001082101081e01181f01182001182101181e01281f01282001282101281e01381f01382001382101381e01481f01482001482101481e01581f01582001582101581e01681f01682001682101681e01781f01782001782101781e01881f01882001882101881e01981f01982001982101981e01a81f01a82001a82101a81e01b81f01b82001b82101b81e01c81f01c82001c82101c81e01d81f01d82001d82101d&quot;,\nobjs=&quot;01801299&quot;,\npipes={\n{28,26,3,232,22,2},\n},\n},\n}\n--end lvls\n\n--states\ns_title=0\ns_lvl_intro=1\ns_gameplay=2\ns_gameover=3\n\nfunction set2by2(start_x,start_y,t)\n\n	if type(t)!=&quot;table&quot; then\n		t={t,t+1,t+16,t+17}\n	end\n	local count=1\n	for j=0,1 do\n		for i=0,1 do\n			mset(start_x+i,start_y+j,t[count])\n			count+=1\n		end\n	end\nend\n\nfunction hex_map_load(m)\n	\n	--w3,h2,pal1,clear1,mus1,\n	--[[\n	for i=1,#m.conf,8 do\n		m.w=parse_hex_num(m.conf,i,2)\n		i+=3\n		m.h=parse_hex_num(m.conf,i,1)\n		i+=2\n		m.pal=parse_hex_num(m.conf,i,0)\n		i+=1\n		m.cls=parse_hex_num(m.conf,i,0)\n		i+=1\n		m.mus=parse_hex_num(m.conf,i,0)\n		i+=1\n	end]]\n\n	for i=1,#m.objs,8 do\n		local x=parse_hex_num(m.objs,i,2)\n		i+=3\n		local y=parse_hex_num(m.objs,i,2)\n		i+=3\n		local id=parse_hex_num(m.objs,i,1)\n\n		local t=\n		{\n			[12]=m_goomba,\n			[176]=m_plant,\n			[45]=m_koopa,\n			[47]=m_koopa_red,\n			[101]=m_flag,\n			[148]=m_hidden_item,--mushroom\n			[149]=m_hidden_item,--1up\n			[151]=m_hidden_item,--star\n			[152]=m_hidden_item,--coin\n			[153]=m_hidden_item,--multi-coin\n		}\n		if t[id]!=nil then\n			local o = t[id](x*8,y*8,id)\n			o.x=x*8+(o:w_half())\n			o.y=y*8+(o:h_half())\n		end\n	end\n\n\n	local x=0\n	local y=0	\n	--load background\n	for i=1,#m.bg,4 do\n		local count=parse_hex_num(m.bg,i,1)\n		local lookup=parse_hex_num(m.bg,i+2,1)\n		lookup = (lookup * 8) + 1\n		--printh(count)\n		for j=0,count-1 do\n			local t={}\n			for k=0,6,2 do\n				local n=parse_hex_num(m.lookup,lookup+k,1)\n				add(t,max(0,n-1))\n			end\n			--printh(x .. &quot;,&quot; .. y)\n			set2by2(x,y,t)\n			if t[1]==102 and find_hidden_item(x*8,y*8)==nil then\n				o = m_hidden_item(x*8+8,y*8+8,152)\n			end\n			x+=2\n			if x&gt;=m.w then\n				x=0\n				y+=2\n			end\n		end\n	end\n	--load flip info\n	for i=1,#m.bgflip,6 do\n		--printh(&quot;str: &quot;..sub(m.bgflip,i,i+2))\n		local xfull=parse_hex_num(m.bgflip,i,2)\n		local yfull=parse_hex_num(m.bgflip,i+3,2)\n\n		--[0][000 0000 0000] &lt;-position of tile in question.\n		-- ^-flip tile in this direction\n		\n		--right 11 bits are used for position.\n		local x=band(xfull,0x7ff)\n		local y=band(yfull,0x7ff)\n		--left most bit is used for flip on/off.\n		map_data[x][y].flipx = band(xfull,0x800)!=0\n		map_data[x][y].flipy = band(yfull,0x800)!=0\n	end\n	\n	--load pal swap data\n	local bgpal=m.bgpal\n	if bgpal then\n		for i=1,#bgpal,8 do\n			--x3,y2,w1,h1,p1\n			local px=parse_hex_num(bgpal,i,2)\n			local py=parse_hex_num(bgpal,i+3,1)\n			local pw=parse_hex_num(bgpal,i+5,0)\n			local ph=parse_hex_num(bgpal,i+6,0)\n			local pp=parse_hex_num(bgpal,i+7,0)\n			for y=py,py+ph-1 do\n				for x=px,px+pw-1 do\n					map_data[x][y].bgpal=pp\n				end\n			end\n		end\n	end\n\n	for v in all(m.pipes) do\n	--(x,y,w,h,dest_lvl,dest_x,dest_y,dest_dir)\n		local dir=0\n		if v[6] == 1 then\n			dir=1\n		elseif v[6]==2 then\n			dir=-1\n		end\n		m_pipe(v,dir)\n	end\n\nend\n\nfunction parse_hex_num(str,i,l)\n	return tonum(&quot;0x&quot;..sub(str,i,i+l))\nend\n\n--math\n--------------------------------\n\nfunction intersects_obj_obj(a, b)\n	--return intersects_box_box(a.x,a.y,a.w,a.h,b.x,b.y,b.w,b.h)\n	local box_x_a,box_y_a,box_w_half_a,box_h_half_a=a:col_box()\n	local box_x_b,box_y_b,box_w_half_b,box_h_half_b=b:col_box()\n	return intersects_box_box(\n		box_x_a,box_y_a,box_w_half_a,box_h_half_a,\n		box_x_b,box_y_b,box_w_half_b,box_h_half_b)\nend\n\nfunction intersects_obj_box(a, x1, y1, w1, h1)\n	local box_x_a,box_y_a,box_w_half_a,box_h_half_a=a:col_box()\n	return intersects_box_box(box_x_a,box_y_a,box_w_half_a,box_h_half_a,x1,y1,w1,h1)\nend\n\nfunction intersects_point_obj(px,py,b)\n	local box_x_b,box_y_b,box_w_half_b,box_h_half_b=b:col_box()\n	return intersects_point_box(px,py,box_x_b,box_y_b,box_w_half_b,box_h_half_b)\nend\n\n--point to box intersection.\nfunction intersects_point_box(px,py,x,y,w,h)\n	if flr(px)&gt;=flr(x-(w)) and flr(px)&lt;flr(x+(w)) and\n				flr(py)&gt;=flr(y-(h)) and flr(py)&lt;flr(y+(h)) then\n		return true\n	else\n		return false\n	end\nend\n\n--box to box intersection\nfunction intersects_box_box(\n	x1,y1,\n	w1,h1,\n	x2,y2,\n	w2,h2)\n\n	local xd=x1-x2\n	local xs=w1+w2\n	if(abs(xd)&gt;=xs)return false\n\n	local yd=y1-y2\n	local ys=h1+h2\n	if(abs(yd)&gt;=ys)return false\n	\n	return true\nend\n\n--check if pushing into side tile and resolve.\n--requires self.dx,self.x,self.y, and \n--assumes tile flag 0 == solid\n--assumes sprite size of 8x8\nfunction collide_side(self)\n\n	local box_x,box_y,box_w_half,box_h_half=self:col_box()\n\n	local offset=box_w_half\n	local finaloffset=0\n	if self.dx&lt;0 then\n		offset*=-1\n		finaloffset=8\n	elseif self.dx==0 then\n		return\n	end\n	\n	local x=(box_x+offset)/8\n	\n	for yoffset=-(box_h_half)+1,(box_h_half)-1,2 do\n		local y=(box_y+yoffset)/8\n		--add(debug_points, {x*8,y*8})\n		if fget(mget(x,y),0) then\n			if self.on_collide_side!=nil then\n				self:on_collide_side()\n			else\n				self.dx=0\n				self.x=(flr((x))*8)+finaloffset-offset\n			end\n			return true\n		elseif self.dead_time==-1 and self.solid and self.bounces then\n			for v in all(objs) do\n				if v!=self and v.solid and v.bounces and v.is_enemy then\n					--[[(v.dx==0 or self.dx==0 or sgn(v.dx)!=sgn(self.dx)) and]] \n					if intersects_point_obj(x*8,y*8,v) then\n						self.dx*=-1\n						--v.dx*=-1\n						--self.x+=self.dx\n						return true\n					end\n				end\n			end\n		end\n	end\n			\n	return false\nend\n\n--check if pushing into floor tile and resolve.\n--requires self.dx,self.x,self.y,self.grounded,self.airtime and \n--assumes tile flag 0 or 1 == solid\nfunction collide_floor(self)\n	--only check for ground when falling.\n	if self.dy&lt;0 then\n		return false\n	end\n	\n	local box_x,box_y,box_w_half,box_h_half=self:col_box()\n	\n	local y=(box_y+box_h_half)/8\n	--local landed=false\n	--check for collision at multiple points along the bottom\n	--of the sprite: left, center, and right.\n	for i=-(box_w_half)+2,(box_w_half)-2,2 do\n	\n		--add(debug_points, { (box_x+i),(box_y+(box_h_half)) })\n		\n		local new_y=nil\n		if fget(mget((box_x+i)/8,y),0) then		\n			new_y=(flr(y)*8)-(self:h_half())\n		else\n			for v in all(objs) do\n				if v!=self and v.platform then\n					--[[(v.dx==0 or self.dx==0 or sgn(v.dx)!=sgn(self.dx)) and]] \n					if intersects_obj_obj(self,v) then\n						new_y=(flr(v.y-v:h_half()))-(self:h_half())+1\n						break\n					end\n				end\n			end\n		end\n		\n		if new_y then\n			if self.on_collide_floor!=nil then\n				self:on_collide_floor(new_y)\n			else\n				self.dy=0\n				self.y=new_y\n				self.grounded=true\n				self.airtime=0\n			end\n			return true\n		end\n	end\n	if self.stay_on then\n		self.dx*=-1\n		self.x+=self.dx\n	end\n	return false\nend\n\n--check if pushing into roof tile and resolve.\n--requires self.dy,self.x,self.y, and \n--assumes tile flag 0 == solid\nfunction collide_roof(self)\n\n	if self.dy&gt;=0 then\n		return\n	end\n	\n	hits={}\n	\n	local y=flr((self.y-(self:h_half()))/8)\n	\n	--check for collision at multiple points along the top\n	--of the sprite: left, center, and right.\n	for i=-(self:w_half())+2,(self:w_half())-2,2 do\n	\n		local x=flr((self.x+i)/8)\n		\n		--add(debug_points, {self.x+i,(self.y-(self:h_half()))})\n		\n		item=nil\n		if self==p1 then\n			item=find_hidden_item(x*8,y*8)\n		end		\n		\n		local map_item=mget(x,y)\n		\n		if fget(map_item,0) or item!=nil then\n			--printh(&quot;::adding tile: &quot; ..map_item..&quot;(&quot;..(item!=nil and &quot;true&quot; or &quot;false&quot;)..&quot;)&quot;)\n			add(hits,{map_item,x,y,item})\n		end\n	end\n	\n	if #hits&gt;0 then\n		self.dy=0\n		self.y=flr(y)*8+8+(self:h_half())\n		self.jump_hold_time=0\n		local item = hits[flr(#hits/2)+1]\n		if self==p1 then\n			if item[4]!=nil then\n				item[4]:on_reveal(self)\n			else\n				--return item[1], item[2], item[3]\n				map_item=item[1]\n				x=item[2]\n				y=item[3]\n				if (fget(map_item,1))bounce_tile(x,y,104)\n				if (fget(map_item,2)) then\n					if p1.isbig then\n						--printh(&quot;::destroying tile&quot;)\n						bounce_tile(x,y,0)\n					else\n						bounce_tile(x,y)\n					end\n				end\n			end\n		end\n		--printh(&quot;---&quot;)\n	else\n		return nil\n	end\nend\n\n--make 2d vector\nfunction m_vec(x,y)\n	local v=\n	{\n		x=x,\n		y=y,\n		\n  --get the length of the vector\n		get_length=function(self)\n			return sqrt(self.x^2+self.y^2)\n		end,\n		\n  --get the normal of the vector\n		get_norm=function(self)\n			local l = self:get_length()\n			return m_vec(self.x / l, self.y / l),l;\n		end,\n	}\n	return v\nend\n\n--square root.\nfunction sqr(a) return a*a end\n\n--round to the nearest whole number.\nfunction round(a) return flr(a+0.5) end\n\n--[[\nfunction backinquart(t,b,c,d)\n	t/=d\n	ts=(t)*t\n	tc=ts*t\n	return b+c*(-11.3475*tc*ts + 19.4475*ts*ts + -7.8*tc + 0.8*ts + -0.2*t)\nend\n--]]\n--[[\nfunction easeoutquint(t,b,c,d)\n	t/=d;\n	t-=1;\n	return c*(t*t*t*t*t+1)+b;\nend\n--]]\n--[[\nfunction easeoutelastic(t,b,c,d)\n	t/=d\n	ts=(t)*t;\n	tc=ts*t;\n	return b+c*(33*tc*ts+-106*ts*ts+126*tc+-67*ts+15*t);\nend\n--]]\n\n--utils\n--------------------------------\n\nfunction map_pos_to_16x16(x,y)\n	function temp(a)\n		return (a%2==0) and a or a-1\n	end\n	return temp(x),temp(y)\nend\n\nfunction find_hidden_item(x,y)\n	for v in all(objs) do\n		if v.is_hidden_item == true and intersects_point_obj(x,y,v) then\n			return v\n		end\n	end\n	return nil\nend\n\nfunction bounce_tile(x,y,tile)\n\n	----printh(&quot;btile a: &quot; ..x..&quot;,&quot;..y)\n	local start_x,start_y=map_pos_to_16x16(x,y)\n	--printh(&quot;btile b: &quot; ..x..&quot;,&quot;..y)\n\n	for v in all(objs) do\n		if v.on_bounce!=nil and intersects_obj_box(v,start_x*8+8,start_y*8+8-16,8,8) then\n			v:on_bounce({[&quot;x&quot;]=start_x*8+8,[&quot;y&quot;]=start_y*8+8 })\n		end\n	end\n	\n	if fget(mget(start_x,start_y-1),7) then\n		local coin_x,coin_y=map_pos_to_16x16(flr(start_x),flr(start_y-1))\n		set2by2(coin_x,coin_y,{0,0,0,0})\n		p1:on_get_coin()\n		m_fx_coin(coin_x*8+8,coin_y*8+8)\n	end\n	\n	--special case for smashing tiles.\n	if tile==0 then\n		for i=0,1 do\n			for j=0,1 do\n				m_part(\n					(start_x+i)*8+4,\n					(start_y+j)*8+4,\n					-1+(i*2),((1-j+1)*-3),mget(start_x+i,start_y+j))\n			end\n		end\n		set2by2(start_x,start_y,{0,0,0,0})\n		sfx(55)\n		return\n	end\n\n	--just bounce the tiles at x,y\n	if tile==nil then\n		tile={}\n		for y=0,1 do\n			for x=0,1 do\n				add(tile,mget(start_x+x,start_y+y))\n				--tile=mget(start_x,start_y)\n			end\n		end\n		--printh(&quot;btile tile[1]: &quot; ..tile[1])\n	end\n	\n	m_bounce_obj(start_x*8+8,start_y*8+8,tile)\n	sfx(52) \n	\n	set2by2(start_x,start_y,{127,127,127,127})\n	\nend\n\n--print string with outline.\nfunction printo(str,startx,\n															 starty,col,\n															 col_bg)\n	for y=-1,1 do\n		for x=-1,1 do\n			print(str,startx+x,starty+y,col_bg)\n		end\n	end\n\n	print(str,startx,starty,col)\nend\n\n--print string centered with \n--outline.\nfunction printc(\n	str,x,y,\n	col,col_bg,\n	special_chars)\n\n	local len=(#str*4)+(special_chars*3)\n	local startx=x-(len/2)\n	local starty=y-2\n	printo(str,startx,starty,col,col_bg)\nend\n\n--objects\n--------------------------------\n\nfunction m_obj(x,y)\n\n	local o =\n	{		\n		x=x,\n		y=y,\n\n		dx=0,\n		dy=0,\n\n		w=16,\n		h=16,\n		\n		w_half=function(self)\n			return self.w*0.5\n		end,\n		h_half=function(self)\n			return self.h*0.5\n		end,\n		\n		col_box=function(self)\n			if self.ch and self.cw then\n				return \n				self.x,\n				self.y+self:h_half()-self.ch/2,\n				self.cw/2,self.ch/2\n			else\n				return self.x,self.y,self.w/2,self.h/2\n			end\n		end,\n		\n		scaley=1,\n		\n		max_dx=9999,--max x speed\n		max_dy=9999,--max y speed\n\n		grav=0,\n		\n		flipx=false,--show sprite be flipped.\n		flipy=false,\n		\n		solid=true,\n		\n		squish=false,\n		\n		layer=1,\n		\n		--animation definitions.\n		--use with set_anim()\n		anims=\n		{\n			[&quot;idle&quot;]=\n			{\n				ticks=1,--how long is each frame shown.\n				frames={26},--what frames are shown.\n			},\n		},\n\n		curanim=&quot;idle&quot;,--currently playing animation\n		curframe=1,--curent frame of animation.\n		animtick=0,--ticks until next frame should show.\n		\n		--request new animation to play.\n		set_anim=function(self,anim)\n			if(anim==self.curanim)return--early out.\n			local a=self.anims[anim]\n			self.animtick=a.ticks--ticks count down.\n			self.curanim=anim\n			self.curframe=1\n		end,\n		\n		update_anim=function(self)\n			--anim tick\n			self.animtick-=1\n			if self.animtick&lt;=0 then\n				self.curframe+=1\n				local a=self.anims[self.curanim]\n				self.animtick=a.ticks--reset timer\n				if self.curframe&gt;#a.frames then\n					if self.on_anim_done!=nil then\n						self:on_anim_done()\n					end\n					self.curframe=1--loop\n				end\n			end		\n		end,\n		\n		--call once per tick.\n		update=function(self)\n	\n			--limit walk speed\n			self.dx=mid(-self.max_dx,self.dx,self.max_dx)\n			\n			--move in x\n			self.x+=self.dx\n			\n			if self.solid then\n				local old_dx=self.dx\n				if collide_side(self) then\n					self.dx=-1*old_dx\n				end\n			end\n			\n			--move in y\n			self.dy+=self.grav\n			self.dy=mid(-self.max_dy,self.dy,self.max_dy)\n			self.y+=self.dy\n			\n			if self.solid then\n				collide_floor(self)\n				collide_roof(self)\n			end		\n\n			self:update_anim()\n\n		end,\n\n		--draw the obj\n		draw=function(self)\n			local a=self.anims[self.curanim]\n			local frame=a.frames[self.curframe]\n			if(self.pal)push_pal(self.pal)\n			\n			if type(frame)==&quot;table&quot; then\n				local start_x=self.x-(self:w_half())\n				local start_y=self.y-(self:h_half())\n\n				local count=1\n				\n				local num_vert=flr(self.h/8)\n				local num_horz=flr(self.w/8)\n				local inc_x=8\n				local inc_y=8\n				\n				if self.flipx then\n					start_x=start_x+((num_horz-1)*8)\n					inc_x=-8\n				end\n				\n				if self.flipy then\n					start_y=start_y+((num_vert-1)*8)\n					inc_y=-8\n				end\n				\n				local y=start_y\n				for v_count=1,num_vert do\n					local x=start_x\n					for h_count=1,num_horz do\n						-- draw in frame order, but from\n						-- right to left.\n						local f=frame[count]\n						local flipx=self.flipx\n						local flipy=self.flipy\n						if f!=nil then\n							if f&lt;0 then\n								f=abs(f)\n								flipx=not flipx\n							end\n							if f&gt;=256 then\n								f-=256\n								flipy=not flipy\n							end\n							sspr((f*8)%128,flr((f/16))*8,8,8, \n								x,y,8,8, \n								flipx,flipy )			\n						end\n						count+=1\n						x += inc_x							\n					end\n					y += inc_y\n				end\n			else\n				local flipx=self.flipx\n				local flipy=self.flipy\n				if frame&lt;0 then\n					flipx=not flipx\n					frame=abs(frame)\n				end			\n				if frame&gt;=256 then\n					frame-=256\n					flipy=true\n				end\n				sspr((frame*8)%128,flr((frame/16))*8, self.w, self.h, \n					self.x-(self:w_half()), self.y+(self:h_half())-(self.h/self.scaley),  ---(self.h/4/2), \n					self.w, self.h/self.scaley, flipx, flipy )\n			end\n			if(self.pal)pop_pal()\n			--add(debug_points, {self.x,self.y})\n			local x,y,w,h=self:col_box()\n			--rect(x-w,y-h,x+w,y+h,9)\n		end,\n		\n		ext=function(self,t)\n			for k,v in pairs(t) do\n				self[k]=v\n			end\n			return self\n		end,\n	}\n	\n	add(objs_queue,o)\n	\n	return o\n\nend\n\n--make the player\nfunction m_player(x,y)\n	local p=m_obj(x,y)\n	local ext=\n	{\n		w=16,\n		h=16,\n		\n		max_dx=2,--max x speed\n		max_dy=4,--max y speed\n\n		ticks_since_run=9999,\n		ticks_since_fire=9999,\n\n		jump_speed=-4,--jump veloclity\n		acc=0.1,--acceleration\n		dcc=0.8,--decceleration\n		air_dcc=1,--air decceleration\n		grav=0.3,\n		\n		--helper for more complex\n		--button press tracking.\n		--todo: generalize button index.\n		jump_button=m_button(5),\n		fire_button=m_button(4),\n\n		jump_hold_time=0,--how long jump is held\n		min_jump_press=5,--min time jump can be held\n		max_jump_press=20,--max time jump can be held\n\n		jump_btn_released=true,--can we jump again?\n		grounded=false,--on ground\n\n		airtime=0,--time since grounded\n		\n		--animation definitions.\n		--use with set_anim()\n		anims=\n		{\n			[&quot;idle&quot;]=\n			{\n				ticks=1,--how long is each frame shown.\n				frames={10},--what frames are shown.\n			},\n			[&quot;run&quot;]=\n			{\n				ticks=2,\n				frames={6,4,2},\n			},\n			[&quot;jump&quot;]=\n			{\n				ticks=1,\n				frames={0},\n			},\n			[&quot;slide&quot;]=\n			{\n				ticks=1,\n				frames={8},\n			},\n			[&quot;dead&quot;]=\n			{\n				ticks=1,\n				frames={93},\n			},\n			[&quot;size_up&quot;]=\n			{\n				ticks=15,\n				frames={10,10,10,10,10,10,10,10,10},\n			},\n			[&quot;fire&quot;]=\n			{\n				ticks=15,\n				frames={{6,7,93,94,109,110,54,55}},			\n			},\n		},\n\n		hit_time=0,\n		size_time=0,\n		pipe_time=0,\n		pipe_dir=0,\n		pipe=nil,\n		lives=3,\n		coins=0,\n		on_flag=false,\n		on_flag_time=0,\n		\n		isbig=false,\n		has_flower=false,\n		star_time=0,\n		\n		offset_anims=function(self,amount)\n			for k,v in pairs(self.anims) do\n				for k2,v2 in pairs(v.frames) do\n					if type(v2)==&quot;table&quot; then\n						for k3,v3 in pairs(v2) do\n							self.anims[k].frames[k2][k3]+=amount\n						end\n					else\n						self.anims[k].frames[k2]+=amount\n					end\n				end\n			end		\n		end,\n		\n		go_big=function(self)\n			--printh(&quot;gobig: &quot; .. (self.isbig and &quot;true&quot; or &quot;false&quot;))\n			if self.isbig==false then\n				self:offset_anims(32)\n				self.h=32\n				self.y-=8\n				self.isbig=true\n				self.size_time=60\n			elseif self.has_flower==false then\n				self.has_flower=true\n				self.size_time=60\n			end\n			sfx(58)\n		end,\n		\n		go_small=function(self,instant)\n			if self.isbig==true then\n				self:offset_anims(-32)\n				self.h=16\n				self.y+=8\n				self.isbig=false\n				self.has_flower=false\n				if not instant then\n					self.size_time=60\n				end\n			end\n		end,\n		\n		on_instant_death=function(self)\n			self.hit_time=0\n			self:go_small(true)\n			self:on_take_hit(nil)\n		end,\n		\n		on_take_hit=function(self,killer)\n			if self.hit_time&lt;=0 then\n				if self.isbig then\n					self:go_small()\n					self.hit_time=120\n				else\n					--self:go_small()\n					self.is_dead=true\n					self.dx=0\n					self.dy=-10\n					self.flipy=false\n					self.grounded=false\n					self.py=self.y\n					self.dead_time=0\n					self.w=16\n					self.star_time=0\n					self:set_anim(&quot;dead&quot;)\n					music(24)\n				end\n			end\n		end,\n		\n		on_load=function(self,px,py)\n			self.x=px\n			self.y=py-self:h_half()\n			self.dx=0\n			self.dy=0\n			self.hit_time=0\n			self.size_time=0\n			self.pipe_time=0\n			self.pipe_dir=0\n			self.pipe=nil	\n			self.is_dead=false\n			self.on_flag=false\n			self.star_time=0\n			self:set_anim(&quot;idle&quot;)\n		end,\n		\n		on_reach_flag=function(self,flag)\n			self.dx=0\n			self.dy=0\n			self.on_flag=true\n			self.on_flag_time=0\n			music(-1)\n		end,\n		\n		on_get_star=function(self,star)\n			self.star_time=900\n			music(23)\n		end,\n		\n		on_get_coin=function(self)\n			self.coins+=1\n			if self.coins&gt;=100 then\n				self.lives+=1\n				self.coins=self.coins%100\n				sfx(59)\n			else\n				sfx(61)\n			end\n		end,\n	}\n	\n	p:ext(ext)\n	\n	p._update_player=p.update\n	p.update=function(self)\n		if self.star_time&gt;0 then\n			self.star_time-=1\n			if self.star_time==0 then\n				music(mus[lvls[cur_lvl].mus])\n			end\n		end\n		self.hit_time=max(0, self.hit_time-1)\n		if self.is_dead then\n			self.dead_time+=1\n			if self.dead_time&lt;30 then\n				return\n			end\n			local len = 120\n			local lerp = (self.dead_time-30) / len\n			if lerp&gt;0.5 then\n				self.y+=self.dy\n				if (self.y&gt;cam.pos_max.y+256) and self.dead_time&gt;200 then\n					self.lives-=1\n					if self.lives&lt;=0 then\n						goto_state(s_gameover)\n					else\n						--restart_lvl()\n						goto_state(s_lvl_intro)\n					end\n				end\n				return\n			end\n			--fy=easeoutquint(min(lerp,1),self.py,-16,1)\n			fy=(sin(lerp)*80)+self.py\n			if (lerp&gt;=0.5) then\n				self.dy=fy-self.y\n			end\n			self.y=fy\n			\n			return\n		end\n		\n		if self.pipe!=nil then\n			self.pipe_time-=1\n			if self.pipe_time==0 then\n				self.pipe:on_use()\n				self.pipe=nil\n				self.pipe_dir=0 \n			else\n				self.y+=1*self.pipe_dir\n			end\n			return\n		end\n		\n		if self.on_flag then\n			if self.on_flag_time==60 then\n				music(30)\n			end\n			self.on_flag_time+=1\n			if self.on_flag_time&gt;60 then\n				self.y+=1\n				if collide_floor(self) then\n					if (self.on_flag_time&gt;400) then \n						cur_core_lvl+=1\n						cur_lvl=core_lvls[cur_core_lvl]\n						goto_state(s_lvl_intro)\n					end\n				elseif ticks%4==0 then\n					p1:on_get_coin()\n					m_fx_coin(self.x+rnd(16)-8,self.y-rnd(8))\n				end				\n			end\n			return\n		end\n		\n		if (self.y&gt;cam.pos_max.y+64) then\n			self:on_instant_death()\n		end\n		\n		if self.size_time&gt;0 then\n			self.size_time-=1\n			return\n		end\n		\n		--track button presses\n		local bl=btn(0) and not self.is_dead--left\n		local br=btn(1) and not self.is_dead --right\n		\n		--move left/right\n		if bl==true then\n			self.dx-=self.acc\n			br=false--handle double press\n		elseif br==true then\n			self.dx+=self.acc\n		else\n			if self.grounded then\n				self.dx*=self.dcc\n			else\n				self.dx*=self.air_dcc\n			end\n		end\n		--[[\n		if btn(4) then\n			self.cur_max=min(self.cur_max+0.1,self.max_dx)\n		else\n			self.cur_max=max(self.cur_max-0.01,self.max_dx*0.5)\n		end\n		--]]\n		local cur_max=self.max_dx*0.5\n		if btn(4) then\n			self.ticks_since_run=0\n		else\n			self.ticks_since_run=min(999,self.ticks_since_run+1)\n		end\n		\n		if self.ticks_since_run&lt;15 then\n			cur_max=self.max_dx\n		end\n\n		--limit walk speed\n		self.dx=mid(-cur_max,self.dx,cur_max)\n		\n		--move in x\n		self.x+=self.dx\n		\n		--hit walls\n		collide_side(self)\n		\n		local camx,camy = cam:cam_pos()\n		if self.x-self:w_half() &lt; camx then\n			self.dx=0\n			self.x=camx+self:w_half()\n		elseif self.x+self:w_half() &gt; camx+128 then\n			self.dx=0\n			self.x=camx+128-self:w_half()\n		end\n		\n		--[[cam pos min]]\n\n		--jump buttons\n		self.jump_button:update()\n		\n		--jump is complex.\n		--we allow jump if:\n		--	on ground\n		--	recently on ground\n		--	pressed btn right before landing\n		--also, jump velocity is\n		--not instant. it applies over\n		--multiple frames.\n		if self.jump_button.is_down and not self.is_dead then\n			--is player on ground recently.\n			--allow for jump right after \n			--walking off ledge.\n			local on_ground=(self.grounded or self.airtime&lt;5)\n			--was btn presses recently?\n			--allow for pressing right before\n			--hitting ground.\n			local new_jump_btn=self.jump_button.ticks_down&lt;10\n			--is player continuing a jump\n			--or starting a new one?\n			if self.jump_hold_time&gt;0 or (on_ground and new_jump_btn) then\n				if(self.jump_hold_time==0)sfx(63)\n				self.jump_hold_time+=1\n				--keep applying jump velocity\n				--until max jump time.\n				if self.jump_hold_time&lt;self.max_jump_press then\n					self.dy=self.jump_speed--keep going up while held\n				end\n			end\n		else\n			self.jump_hold_time=0\n		end\n		\n		--move in y\n		self.dy+=self.grav\n		self.dy=mid(-self.max_dy,self.dy,self.max_dy)\n		self.y+=self.dy\n\n		--floor\n		if not self.is_dead and not collide_floor(self) then\n			self:set_anim(&quot;jump&quot;)\n			self.grounded=false\n			self.airtime+=1\n		end\n		\n		if self.grounded==true and btn(3) then\n			for v in all(objs) do\n				if v.dest_lvl!=nil then\n					if intersects_point_obj(self.x,self.y,v) then\n						self.pipe=v\n						self.pipe_time=60\n						self.pipe_dir=1\n						sfx(56)\n						music(-1)\n						return\n					end\n				end\n			end\n		end\n		\n		for j=-1,1 do\n			for i=-1,1 do\n				local x=(self.x-(i*self:w_half()))/8\n				local y=(self.y-(j*self:h_half()))/8\n				if fget(mget(x,y),3) then\n					--m_fx_explosion(self.x,self.y)\n					local start_x,start_y=map_pos_to_16x16(flr(x),flr(y))\n					set2by2(start_x,start_y,{0,0,0,0})\n					self:on_get_coin()\n					--[[\n					if self.on_flag then\n						for k=0,5 do\n							p1:on_get_coin()\n							m_fx_coin(start_x*8+rnd(8),start_y*8+rnd(8))\n						end\n					end\n					--]]\n				end\n			end\n		end\n\n		--roof\n		if(not self.is_dead)collide_roof(self)\n		\n		--handle playing correct animation when\n		--on the ground.\n		if self.ticks_since_fire&lt;5 then\n			self:set_anim(&quot;fire&quot;)\n		elseif self.grounded then\n			if (br and self.dx&lt;0) or (bl and self.dx&gt;0) then\n				self:set_anim(&quot;slide&quot;)\n			elseif bl or br then\n				self:set_anim(&quot;run&quot;)\n				self.anims[&quot;run&quot;].ticks=((self.max_dx-abs(self.dx))+1)*3			\n			else\n				self:set_anim(&quot;idle&quot;)\n			end\n		end\n\n		--flip\n		if self.grounded then\n			if(br)self.flipx=false\n			if(bl)self.flipx=true\n		end\n		\n		self.fire_button:update()\n		if self.fire_button.is_pressed and self.has_flower and #fireballs&lt;2 then\n			local dir=1\n			if(self.flipx)dir=-1\n			m_fireball(self.x,self.y,dir)\n			self:set_anim(&quot;fire&quot;)\n			self.ticks_since_fire=0\n		else\n			self.ticks_since_fire=min(9999,self.ticks_since_fire+1)\n		end\n\n		self:update_anim()\n\n	end\n		\n	p._draw_player=p.draw\n	p.draw=function(self)\n		if self.hit_time%2==0 then\n			if self.star_time&gt;0 then\n				local c={{9,7,5,9},{8,1,5,4,9,15},{8,3,5,9,9,7}}\n				local d=self.star_time&lt;120 and 8 or 2\n				local i=(flr(ticks/d)%4)\n				self.pal=c[i]\n			elseif self.has_flower then\n				self.pal={8,15,5,8}\n			else\n				self.pal=nil\n			end\n			self.scaley=1\n			if self.size_time%20&gt;10 then\n				if self.isbig then\n					self.scaley=2\n				else\n					self.scaley=0.5\n				end\n			end\n			self:_draw_player()\n		end\n	end	\n	return p\nend\n\nfunction m_fx(x,y)\n	local o=m_obj(x,y)\n	o.solid=false\n	o.on_anim_done=function(self)\n		del(objs,self)\n	end\n	return o\nend\n\nfunction m_fx_explosion(x,y)\n	local o=m_fx(x,y)\n	o.w=16\n	o.h=16\n	o.anims=\n	{\n		[&quot;idle&quot;]=\n		{\n			ticks=5,--how long is each frame shown.\n			frames={{135,-135,391,-391},\n				{136,-136,392,-392},\n				{137,-137,393,-393}},\n		},\n	}\n	--return o\nend\n\nfunction m_fx_coin(x,y)\n	local o=m_fx(x,y):ext(\n	{\n		w=8,\n		h=16,\n		dy=-6,\n		grav=0.3,\n		anims=\n		{\n			[&quot;idle&quot;]=\n			{\n				ticks=5,--how long is each frame shown.\n				frames={\n					{252,508},\n					{253,509},\n					{254,510},\n					{255,511},\n					{252,508},\n					{253,509},\n					{254,510},\n					{255,511},\n				}\n			},\n		},\n	})\n	--return o\nend\n\nfunction m_fireball(x,y,dirx)\n	sfx(53)\n	local o=m_obj(x,y)\n	local speed=2\n	o.w=8\n	o.h=8\n	o.grav=0.2\n	o.dx=dirx*speed*2\n	o.dy=speed\n	o.anims=\n	{\n		[&quot;idle&quot;]=\n		{\n			ticks=5,--how long is each frame shown.\n			frames={95,111,-351,-367},--what frames are shown.\n		},\n	}\n	--o.curframe=flr(rnd(#o.anims[&quot;idle&quot;].frames)+1)\n	o.on_collide_floor=function(self,y)\n		self.dy=-speed\n		self.y=y\n	end\n	o.on_collide_side=function(self)\n		m_fx_explosion(self.x,self.y)\n		del(fireballs,self)\n	end\n	o.test_hit=function(self,t)\n		for v in all(t) do\n			if v.is_enemy and v.dead_time==-1 then \n				if intersects_obj_obj(self,v) then\n					self:on_collide_side()\n					v:on_bounce(self)				\n					break\n				end\n			end\n		end			\n	end\n	o._update_fireball=o.update\n	o.update=function(self)\n		self:_update_fireball()\n		self:test_hit(objs)\n		local camx,camy = cam:cam_pos()\n		if self.x+self.w &lt; camx or self.x-self.w &gt; camx+128 or self.y-self.h &gt; camy+128 then\n			del(fireballs,self)\n		end\n	end\n	del(objs_queue,o)\n	add(fireballs,o)\n	--return o\nend\n\n\n\nfunction m_pipe(v,dest_dir)\n\n	local o = m_obj(v[1]*8,v[2]*8)\n	o.w=10\n	o.h=32\n	o.dest_lvl=v[3]\n	o.dest_x=v[4]*8\n	o.dest_y=v[5]*8\n	o.dest_dir=dest_dir\n	o.draw=function()end\n	--[[\n	o.draw=function(self)\n		--debug\n		--rect(o.x-o:w_half(),o.y-o:h_half(),o.x+o:w_half(),o.y+o:h_half(),15)\n		--printc(&quot;lvl:&quot; .. self.dest_lvl, self.x, self.y, 15, 1, 0)\n	end\n	--]]\n	o.on_use=function(self)\n		queue_lvl(self.dest_x,self.dest_y,self.dest_lvl,self.dest_dir)\n	end\n	--return o\nend\n\n--[[\nfunction m_platform(x,y)\n	local o=m_obj(x,y):ext({\n		w=48,\n		h=8,\n		--cw=48,\n		--ch=10,\n		platform=true,\n	})\n	o.anims[&quot;idle&quot;].frames={{114,114,114,114,114,114}}\n	o._update_platform=o.update\n	o.update=function(self)\n	\n		local start_touch=intersects_obj_obj(self,p1)\n		--printh(&quot;start_touch: &quot;..(start_touch and &quot;true&quot; or &quot;false&quot;))\n		self.y+=1--sin(ticks*0.01)\n		self:_update_platform()\n		if(start_touch)p1.y+=1--sin(ticks*0.001)\n		if(self.y&gt;128)self.y=0\n	end\n	--return o\nend\n--]]\n\nfunction m_hidden_item(x,y,t)\n	local o=m_obj(x,y)\n	o.t=t\n	o.coin_ticks=-1\n	o.is_hidden_item=true\n	o.on_reveal=function(self)\n		if self.t==148 or self.t==149 then\n			local o=m_mushroom(self.x,self.y)\n			if self.t==149 then\n				o.pal={4,3}\n				o.is_1up=true\n			elseif p1.isbig then\n					o.flash=true\n					o.anims[&quot;idle&quot;]=\n					{\n						ticks=0,\n						frames={ { 150, -150, 166, -166 } },\n					}\n					o.dx=0\n			end\n		elseif self.t==151 then\n			m_star(self.x,self.y)\n		elseif self.t==152 or self.t==153 then\n			m_fx_coin(self.x,self.y)\n			p1:on_get_coin()\n			if self.coin_ticks==-1 then\n				--first time\n				self.coin_ticks=60*4\n			end\n		end\n		local x,y=map_pos_to_16x16(self.x/8,self.y/8)\n		if self.t!=153 or self.coin_ticks&lt;=0 then\n			--printh(&quot;::bouncing tile in reveal&quot;)\n			bounce_tile(x,y,104)\n			del(objs,self)\n		else\n			bounce_tile(x,y)\n		end\n	end\n	o.update=function(self)	\n		if self.coin_ticks&gt;0 then\n			self.coin_ticks-=1\n		end\n	end\n	o.draw=function(self) end\n	return o\nend\n\nfunction m_item(x,y)\n	local o=m_obj(x,y)\n	o.ticks=0\n	o.solid=false\n	o.flash=false\n	o.pal={}\n	o.on_bounce=function(self,block)\n			self.dx=sgn(self.x-block.x)*abs(self.dx)\n			self.dy=-2\n	end\n	o._update_item=o.update\n	o.update=function(self)\n		self.ticks+=1\n		if intersects_obj_obj(self,p1) then\n			if self.on_touch then\n				self:on_touch()\n			end\n			del(objs,self)\n		end		\n		if self.ticks==32 then\n			self.layer=1	\n			self.solid=true\n		elseif self.ticks&lt;32 then\n			self.y-=0.5\n			return\n		end\n		self:_update_item()\n	end\n	o._draw_item=o.draw\n	o.draw=function(self)\n		if self.flash then\n			local c={{7,15,9,4,4,2},{7,9,9,3},{4,3}}\n			local i=(flr(ticks/2)%4)\n			self.pal=c[i]\n		end\n		self:_draw_item()\n	end\n	o.layer=0	\n	return o\nend\n\nfunction set_pal(t)\n	pal()\n	if t then\n		for i=1,#t,2 do\n			pal(t[i],t[i+1])\n		end\n	end\nend\n\nfunction push_pal(pal_table)\n	add(pal_stack,pal_table)\n	set_pal(pal_table)\nend\n\nfunction pop_pal()\n	del(pal_stack, pal_stack[#pal_stack])\n	set_pal(pal_stack[#pal_stack])\nend\n\nfunction set_coin_pal()\n	local c={{9,4},{},{9,10},{}}\n	local i=(flr(ticks/10)%4)+1\n	if c[i]!=nil then\n		push_pal(c[i])\n	end\nend\n\nfunction m_mushroom(x,y)\n	sfx(57)\n	local o=m_item(x,y)\n	o.dx=0.75\n	o.grav=0.1\n	o.anims[&quot;idle&quot;]=\n	{\n		ticks=0,--how long is each frame shown.\n		frames={148},--what frames are shown.\n	}\n	--[[\n	o._update_mushroom=o.update\n	o.update=function(self)\n		self:_update_mushroom()\n		if intersects_obj_obj(self,p1) then\n			p1:go_big()\n			del(objs,self)\n		end\n	end\n	--]]\n	o.on_touch=function(self)\n		if o.is_1up then\n			p1.lives+=1\n			sfx(59)\n		else\n			p1:go_big()\n		end\n		del(objs,self)\n	end\n	return o\nend\n\nfunction m_star(x,y)\n	sfx(57)\n	local o=m_item(x,y)\n	local ext=\n	{\n		dx=0.75,\n		dy=-3,\n		grav=0.1,\n		flash=true,\n		anims=\n		{\n			[&quot;idle&quot;]=\n			{\n				ticks=0,--how long is each frame shown.\n				frames={{151,-151,167,-167}},--what frames are shown.\n			}\n		},\n		on_collide_floor=function(self,new_y)\n			self.dy=-3\n			self.y=new_y\n		end,\n		on_touch=function(self)\n			p1:on_get_star(self)\n		end,\n	}\n	o:ext(ext)\n	--return o\nend\n\n--[[\nfunction m_flower(x,y)\n	local o=m_item(x,y)\n	o.anims[&quot;idle&quot;]=\n	{\n		ticks=0,\n		frames={ { 150, -150, 166, -166 } },\n	}\n	o._update_flower=o.update\n	o.update=function(self)\n		self:_update_flower()\n		if intersects_obj_obj(self,p1) then\n			p1:go_big()\n			del(bg_objs,self)\n		end\n	end\n	return o\nend\n--]]\nfunction m_bounce_obj(x,y,og_tile)\n	local o = m_obj(x,y)\n	o.t=0\n	o.py=y\n	o.og=og_tile\n	o.anims[&quot;idle&quot;].frames={og_tile}\n	if lvls[cur_lvl].pal!=nil then\n		o.pal=pals[lvls[cur_lvl].pal]\n	end\n	o.update=function(self)\n		self.t+=1\n		local lerp = self.t / 30\n		fy=(sin(self.t/30)*4)+self.py\n		self.y=fy\n		if (self.y&gt;=self.py) then\n			del(objs,self)\n			--flip_tile((self.x-8)/8,(self.py-8)/8,self.og)\n			set2by2((self.x-8)/8,(self.py-8)/8,self.og)\n		end\n	end\n	--return o\nend\n\nfunction m_enemy(x,y)\n	local o = m_obj(x,y)\n	o.dx=-0.5\n	o.grav=0.1\n	o.dead_time=-1\n	o.is_enemy=true\n	o.bounces=true\n	o.ch=10\n	o.cw=10\n	--o.walk_speed=-0.5\n	o.anims[&quot;idle&quot;]=\n	{\n		ticks=5,--how long is each frame shown.\n		frames={12, -12},--what frames are shown.\n	}\n	o.on_bounce=function(self,block)\n		if self.dead_time==-1 then\n			self.dead_time=240\n			--printh(self.x)\n			self.dx=sgn(self.x-block.x)*0.5\n			--printh(self.dx)\n			self.dy=-3\n			self.solid=false\n			self.flipy=true\n			sfx(54)\n		end\n	end\n	o.on_stomp=function(self)\n	end\n	o.on_attack=function(self,target)\n		if target.on_take_hit then\n			target:on_take_hit(self)\n		end\n	end\n	o.on_take_hit=function(self,attacker)\n		self:on_bounce(self,attacker)\n	end\n	o._update_enemy=o.update\n	o.update=function(self)\n		\n		self:_update_enemy()\n		\n		if self.dx&lt;0 then\n			self.flipx=true\n		else	\n			self.flipx=false\n		end\n		\n		if self.dead_time&gt;=0 then\n			self.dead_time-=1\n			if self.dead_time&lt;=0 then\n				del(objs,self)\n			end\n			return\n		end\n		\n		--[[flip code]]\n			\n			--if (self.y&gt;cam.pos_max.y+64+(self:h_half())) then\n			--	del(objs,self)\n			--end\n\n		if self.dead_time==-1 and not p1.is_dead and p1.pipe==nil then\n--			local gx,gy,gw,gh=self.x,self.y+self.h*0.25,self.w,self.h*0.75\n			if intersects_obj_obj(p1,self) then\n				if p1.star_time&gt;0 then\n					self:on_bounce(p1)\n				else\n					--feet pos.\n					local mx,my=p1.x,p1.y+(p1:h_half())\n					local gx,gy,gw,gh=self:col_box()\n					slope = abs((gy-my)/(gx-mx))\n					if ((--[[gy == mx) or ((slope &gt;= 0) and]] (gy &gt; my))) then\n						if p1.dy&gt;=0 then\n							self:on_stomp()\n						end\n					else\n						self:on_attack(p1)\n					end\n				end\n			end\n		end\n	end\n	o._draw_enemy=o.draw\n	o.draw=function(self)\n		local old_y=self.y\n		local old_x=self.x\n		if self.dead_time==-1 then\n			local camx,camy=cam:cam_pos()\n			local rad=10\n			if self.y&gt;=camy+128 then\n				local new_y=camy+128---rad\n				circfill(self.x,new_y,rad+1,1)\n				circfill(self.x,new_y,rad,7)\n				self.y=new_y\n			elseif self.y&lt;=camy then\n				local new_y=camy---rad\n				circfill(self.x,new_y,rad+1,1)\n				circfill(self.x,new_y,rad,7)\n				self.y=new_y\n			end\n		end\n		self:_draw_enemy()\n		self.x=old_x\n		self.y=old_y\n	end\n	return o\nend\n\nfunction m_goomba(x,y)\n	local o= m_enemy(x,y):ext(\n		{\n			on_stomp=function(self)\n				self.scaley=4	\n				self.dead_time=60\n				self.dx=0\n				self.dy=0\n				p1.dy=p1.max_dy*-1\n				sfx(54)\n			end,\n		})\n		if lvls[cur_lvl].pal==1 then\n			o.pal={4,13,15,12}\n		end\n		return o\nend\n\nfunction m_plant(x,y)\n	y+=12\n	local o = m_enemy(x+8,y):ext(\n	{\n		w=16,\n		h=24,\n		iy=y,\n		dx=0,\n		--o.walk_speed=0\n		solid=false,\n		grav=0,\n		layer=0,\n		ticks=0,\n		--o.wait=0\n		anims={\n			[&quot;idle&quot;]=\n			{\n				ticks=15,\n				frames={{176,-176,192,-192,208,-208},{177,-177,193,-193,209,-209}},\n			}\n		},\n		on_bounce=function(self,block)\n			del(objs,self)\n			sfx(54)\n		end,\n	})\n	\n	o._update_plant=o.update\n	o.update=function(self)\n		if abs(self.x-p1.x)&gt;32 or self.y!=self.iy then\n			self.ticks+=1\n			self.y=mid(self.iy,self.iy-self:h_half()+cos(self.ticks*0.003)*36,self.iy-self.h)\n		end\n		self:_update_plant()\n	end\n	return o\nend\n\nfunction m_koopa(x,y)\n	local o = m_enemy(x,y)\n	o.w=16\n	o.h=24\n	o.ch=12\n	o.cw=8	\n	o.anims[&quot;idle&quot;]=\n	{\n		ticks=5,--how long is each frame shown.\n		frames={44, 46},--what frames are shown.\n	}\n	o.on_stomp=function(self)\n		m_shell(self.x,self.y+4).pal=self.pal\n		del(objs,self)\n		p1.dy=p1.max_dy*-1		\n		sfx(54)\n	end\n	return o\nend\n\nfunction m_koopa_red(x,y)\n	--printh(&quot;make red&quot;)\n	local o=m_koopa(x,y):ext(\n	{\n		pal={3,8},\n		stay_on=true,\n	})\n	return o\nend\n\nfunction m_shell(x,y)\n	local o=m_enemy(x,y)\n	o:ext(\n	{\n		dx=0,\n		dy=0,\n		ch=12,\n		cw=8,\n		bounces=true,\n		hit_time=0,\n		anims=\n		{\n			[&quot;idle&quot;]=\n			{\n				ticks=1,\n				frames={{14,-14,30,-30}},\n			},\n		},\n		on_kick=function(self,kicker)\n			--printh(&quot;on kick&quot;)\n			self.dx=sgn(self.x-kicker.x)*2.5\n			self.hit_time=15\n			self.bounces=false\n			sfx(52)\n		end,\n		on_stomp=function(self)\n			--printh(&quot;on stomp&quot;)\n			if self.dx==0 then\n				self:on_kick(p1)\n			elseif self.hit_time&lt;=0 then\n				self.dx=0\n				self.bounces=true\n				p1.dy=p1.max_dy*-1\n			end\n			sfx(54)\n		end,\n		on_attack=function(self,target)\n			--printh(&quot;on attack&quot;)\n			if self.dx!=0 and self.hit_time&lt;=0 then\n				target:on_take_hit(self)\n			else\n				self:on_kick(target)\n			end\n		end,	\n		_update_shell=o.update,\n		update=function(self)\n			self:_update_shell()\n			self.hit_time=max(0,self.hit_time-1)\n			for v in all(objs) do\n				if v!=self and v.solid and v.is_enemy then\n					if self.dx!=0 and intersects_obj_obj(self,v) then\n						v:on_bounce(self)\n					end\n				end\n			end			\n		end,\n	})\n	\n	return o\n	\nend\n\nfunction m_flag(x,y)\n	local o = m_obj(x,y)\n	o.w=16\n	o.h=16\n	o.reached=false\n	o.anims[&quot;idle&quot;]=\n	{\n		ticks=0,--how long is each frame shown.\n		frames={{100, 101, nil, 100}},--what frames are shown.\n	}	\n	o.update=function(self)\n		if self.reached then\n			self.y=p1.y\n		elseif p1.x&gt;self.x then\n			p1:on_reach_flag(self)\n			self.reached=true\n		end\n	end\n	return o\nend\n\n\n\nfunction m_button(id)\n	local b =\n	{\n		update=function(self)\n			--start with assumption\n			--that not a new press.\n			self.is_pressed=false\n			if btn(id) then\n				if not self.is_down then\n					self.is_pressed=true\n				end\n				self.is_down=true\n				self.ticks_down+=1\n			else\n				self.is_down=false\n				self.is_pressed=false\n				self.ticks_down=0\n			end\n		end,\n		--state\n		is_pressed=false,--pressed this frame\n		is_down=false,--currently down\n		ticks_down=0,--how long down\n	}\n	return b\nend\n\n--make the camera.\nfunction m_cam(target)\n	local c=\n	{\n		tar=target,--target to follow.\n		pos=m_vec(target.x+target:w_half(),target.y+target:h_half()),\n		\n		--how far from center of screen target must\n		--be before camera starts following.\n		--allows for movement in center without camera\n		--constantly moving.\n		pull_threshold=16,\n\n		--min and max positions of camera.\n		--the edges of the level.\n		pos_min=m_vec(64,64),\n		pos_max=m_vec(446*8-64,196-44),\n		\n--		shake_remaining=0,\n--		shake_force=0,\n\n		update=function(self)\n\n--			self.shake_remaining=max(0,self.shake_remaining-1)\n			\n			--follow target outside of\n			--pull range.\n			if self:pull_max_x()&lt;self.tar.x then\n				--self.pos.x+=1\n				self.pos.x+=min(self.tar.x-self:pull_max_x(),4)\n			end\n			if self:pull_min_x()&gt;self.tar.x then\n				self.pos.x+=min((self.tar.x-self:pull_min_x()),4)\n			end\n			if self:pull_max_y()&lt;self.tar.y+(self.tar:h_half()) then\n				self.pos.y+=min(self.tar.y+(self.tar:h_half())-self:pull_max_y(),4)\n			end\n			if self:pull_min_y()&gt;self.tar.y+(self.tar:h_half()) then\n				self.pos.y+=min((self.tar.y+(self.tar:h_half())-self:pull_min_y()),4)\n			end\n\n			--lock to edge\n			self.pos.x=mid(self.pos_min.x,self.pos.x,self.pos_max.x)\n			self.pos.y=mid(self.pos_min.y,self.pos.y,self.pos_max.y)\n			\n			self:cull_objs()\n			self:activate_objs()\n		end,\n\n		cam_pos=function(self)\n			--calculate camera shake.\n--			local shk=m_vec(0,0)\n--			if self.shake_remaining&gt;0 then\n--				shk.x=rnd(self.shake_force)-(self.shake_force/2)\n--				shk.y=rnd(self.shake_force)-(self.shake_force/2)\n--			end\n--			return self.pos.x-64+shk.x,self.pos.y-64+shk.y\n			return self.pos.x-64,self.pos.y-64\n		end,\n\n		pull_max_x=function(self)\n			return self.pos.x-16--+self.pull_threshold\n		end,\n\n		pull_min_x=function(self)\n			return self.pos.x-16---64+8\n		end,\n\n		pull_max_y=function(self)\n			return self.pos.y+self.pull_threshold\n		end,\n\n		pull_min_y=function(self)\n			return self.pos.y-self.pull_threshold\n		end,\n		\n--		shake=function(self,ticks,force)\n--			self.shake_remaining=ticks\n--			self.shake_force=force\n--		end\n\n		cull_objs=function(self)\n\n			local cam_min=self.pos_min\n			local back_offset=128\n			if p1.x-back_offset&gt;cam_min.x then\n				self.pos_min.x = p1.x-128\n			end\n			for v in all(objs) do\n				if v.x+v.w&lt;self.pos_min.x-64 or v.y-v.h&gt;self.pos_max.y+64 then\n					del(objs,v)\n				end\n			end\n		end,\n		\n		activate_objs=function(self)\n			for v in all(objs_queue) do\n				if v.x &lt;= (flr(self:cam_pos()/256)+1)*256+128+v.w then\n					-- move to active list.\n					add(objs,v)\n					del(objs_queue,v)\n				end\n			end\n		end,\n	}\n\n	return c\nend\n\nfunction m_part(_x,_y,_dx,_dy,_s)\n\n	local o = m_obj(_x,_y)\n	local ext=\n	{\n		dx=_dx,\n		dy=_dy,\n\n		w=8,\n		h=8,\n		\n		sprite=_s,\n		\n		max_dx=2,--max x speed\n		max_dy=4,--max y speed\n\n		grav=0.3,\n		\n		--call once per tick.\n		update=function(self)\n			--limit walk speed\n			self.dx=mid(-self.max_dx,self.dx,self.max_dx)\n			\n			--move in x\n			self.x+=self.dx\n	\n			--move in y\n			self.dy+=self.grav\n			self.dy=mid(-self.max_dy,self.dy,self.max_dy)\n			self.y+=self.dy\n			\n--			if (self.y&gt;cam.pos_max.y+64+(self:h_half())) then\n--				del(objs,self)\n--			end\n\n		end,\n\n		--draw the player\n		draw=function(self)\n			spr(self.sprite,\n				self.x-(self:w_half()),\n				self.y-(self:h_half()),\n				(self.w/8),self.h/8,\n				self.flipx,\n				false)\n		end,\n	}\n	\n	o:ext(ext)\n	\n	return o\n\nend\n\n--game flow\n--------------------------------\n\n--reset the game to its initial\n--state. use this instead of\n--_init()\nfunction reset()\n	--load_lvl(4*8,-64,lvls[2])\n	state=0\n	ticks=0\n	objs={}\n	objs_queue={}\n	fireballs={}\n	pal_stack={}\n	--[[\n	menuitem(1,\n		&quot;[cheat] next level&quot;,\n		function() cur_core_lvl+=1\n						cur_lvl=core_lvls[cur_core_lvl]\n						goto_state(s_lvl_intro) end)	\n						--]]\nend\n\nfunction goto_state(new_state)\n\n	if state==s_title then\n		p1=m_player(0,0)\n		p1:set_anim(&quot;idle&quot;)\n		cur_core_lvl=1\n	end\n\n	state=new_state\n	ticks=0\n\n	if state==s_lvl_intro then\n		cur_lvl=core_lvls[cur_core_lvl]\n		load_lvl(24,208,cur_lvl)\n	elseif state==s_gameover then\n		music(26)\n	end\nend\n\nfunction queue_lvl(px,py,lvl,pipe_dir)\n	lvl_next={px,py,lvl,pipe_dir}\nend\n\nfunction load_lvl(px,py,lvl_id,pipe_dir)\n	--printh(&quot;starting load...&quot;)\n--	cls(0)\n--	printc(&quot;loading...&quot;,64,64,6,5,0)\n--	flip()\n	--[[\n	for i=0,999 do\n		--for j=0,1 do\n			cls(0)\n			local str=&quot;loading&quot;\n			for k=0,i*0.1%3 do\n				str=str..&quot;.&quot;\n			end\n			printc(str,64,64,6,5,0)\n			flip()		\n		--end\n	end\n	--]]\n	objs={}\n	objs_queue={}\n	fireballs={}\n	--debug_points={}\n	map_data={}\n	pal_stack={}\n	p1:on_load(px,py)\n	if pipe_dir!=nil and pipe_dir!=0 then\n		p1.pipe={on_use=function()end,}\n		p1.pipe_time=60\n		p1.pipe_dir=-1--pipe_dir\n		p1.y+=60\n	end\n	cam=m_cam(p1)\n	cur_lvl=lvl_id\n	local lvl=lvls[cur_lvl]\n	cam.pos_max=m_vec((lvl.w*8)-64-8,(lvl.h*8)-64-24),\n	--m_mushroom(48+8,200)\n	--m_flower(96+8,200)\n	--m_platform(96,200-64)\n	--printh(&quot;lvl: &quot; .. lvl.bg)\n	hex_map_load(lvl) -- todo: restore later\n	--rom_map_load(rom_lvls[1],lvl)\n	--printh(&quot;init complete&quot;)\n	music(mus[lvl.mus])\nend\n\n--p8 functions\n--------------------------------\n\nfunction _init()\n	reset()\nend\n\nfunction _update60()\n	ticks+=1\n	--printh(&quot;update&quot;)\n	if state==s_title then\n		if btnp(4) or btnp(5) then\n			goto_state(s_lvl_intro)\n		end\n	elseif state==s_lvl_intro then\n		if ticks&gt;=120 then\n			goto_state(s_gameplay)\n		end\n	elseif state==s_gameplay then\n		if not p1.is_dead and p1.size_time==0 then\n			for o in all(objs) do\n				o:update()--20%\n			end\n			for o in all(fireballs) do\n				o:update()\n			end\n		end\n		p1:update()--25%\n		cam:update()--10%\n		--demo camera shake\n		--if(btnp(4))cam:shake(15,2)\n		\n		if lvl_next!=nil then\n			--printh(&quot;queued up level: &quot; ..lvl_next[3]..&quot; [&quot;..lvl_next[1]..&quot;,&quot;..lvl_next[2]..&quot;]&quot;)\n			load_lvl(lvl_next[1],lvl_next[2],lvl_next[3],lvl_next[4])\n			lvl_next=nil\n		end\n	elseif state==s_gameover then\n		if btnp(4) or btnp(5) then\n			goto_state(s_title)\n		end\n	end\nend\n\n-- 16x14\nlocal fadetable_w=15\nlocal fadetable=\n&quot;000000000000000&quot;..\n&quot;111111100000000&quot;..\n&quot;222222111000000&quot;..\n&quot;333333111000000&quot;..\n&quot;444222221100000&quot;..\n&quot;555551111100000&quot;..\n&quot;66dddd555511100&quot;..\n&quot;76666ddd5551100&quot;..\n&quot;888822222200000&quot;..\n&quot;999444444550000&quot;..\n&quot;aa9994445555000&quot;..\n&quot;bbb333333300000&quot;..\n&quot;ccccc3311111100&quot;..\n&quot;ddd555511111000&quot;..\n&quot;eeed44222221100&quot;..\n&quot;ff6ddd555551100&quot;\n\nfunction fade(i)\n for c=0,15 do\n  if flr(i+1)&gt;=fadetable_w then\n   pal(c,0,1)\n  else\n			local c2=c*fadetable_w+i+1\n			pal(c,parse_hex_num(fadetable,c2,0),1)\n   --pal(c,fadetable[c+1][flr(i+1)])\n  end\n end\nend\n\nfunction _draw()\n	if state==s_title then\n		cls(0)\n		printc(&quot;super mario bros.&quot;,64,64,7,1,0)\n	elseif state==s_lvl_intro then\n		if lvls[cur_lvl].cls then\n			cls(lvls[cur_lvl].cls)\n		else\n			cls(0)\n		end	\n		camera(512+ticks,(29*8)-128+16)\n		if(lvls[cur_lvl].pal!=nil)push_pal(pals[lvls[cur_lvl].pal])\n		map(0,0,0,0,32,446)\n		if(lvls[cur_lvl].pal!=nil)pop_pal()\n		camera(0,0)\n		rectfill(0,0,127,32,0)\n		rectfill(0,96,127,127,0)\n		printc(&quot;world &quot;..(flr((cur_core_lvl-1)/4)+1)..&quot;-&quot;..(flr((cur_core_lvl-1)%4)+1),64,64-48,7,1,0)\n		spr(10,64-32,64-8+48,2,2)\n		printc(&quot;x&quot;,64,64+48,7,1,0)\n		printc(&quot;&quot; .. p1.lives,64+16,64+48,7,1,0)\n		if ticks&lt;=fadetable_w then\n			fade(fadetable_w-flr((ticks/fadetable_w)*fadetable_w))\n		elseif ticks &gt;= 100-fadetable_w then\n			local lerp=ticks-(100-fadetable_w)\n			lerp=lerp/fadetable_w\n			fade(flr((lerp)*fadetable_w))\n		end		\n	elseif state==s_gameplay then\n	\n		--50%\n		\n		--cam:update()\n		if lvls[cur_lvl].cls then\n			cls(lvls[cur_lvl].cls)\n		else\n			cls(0)\n		end\n		\n		camera(cam:cam_pos())\n\n		if p1.pipe!=nil then\n			p1:draw()\n		end\n\n		if(lvls[cur_lvl].pal!=nil)push_pal(pals[lvls[cur_lvl].pal])\n		\n		for o in all(objs) do\n			if o.layer==0 then\n				o:draw() --1%\n			end\n		end\n\n		map(0,0,0,0,32,446) --22%\n		\n		for o in all(objs) do\n			if o.layer==1 then\n				o:draw() --1%\n			end\n		end\n		\n		if(lvls[cur_lvl].pal!=nil)pop_pal()\n		\n		for o in all(fireballs) do\n			o:draw()\n		end\n		\n		if p1.pipe==nil then\n			p1:draw()\n		end\n		\n		--for v in all(debug_points) do\n		--	pset(v[1],v[2],8)\n		--end\n		--debug_points = {}\n		\n		--hud\n		camera(0,0)\n		\n		set_coin_pal()\n		sspr(64, 72, 16, 16, 64-10, 0, 8,8)\n		pop_pal()--coins\n		printo(&quot;x &quot;..p1.coins,64,2,7,1)\n		\n		--[[\n		if lvl_pal!=nil then\n			for i=1,#lvl_pal,2 do\n				pal(lvl_pal[i],lvl_pal[i+1],1)\n			end\n		end\n		--]]\n\n		--printc(&quot;built with&quot;,64,4,7,0,0)\n		--printc(&quot;adv. micro platformer&quot;,64,12,7,0,0)\n	elseif state==s_gameover then\n		cls(0)\n		printc(&quot;game over&quot;,64,64,7,1,0)	\n	end\n	--print(&quot;fireballs:&quot;..#fireballs,0,12,7)\n	--mem_high=(stat(0)&gt;mem_high) and stat(0) or mem_high\n	--print(&quot;mem:&quot;..flr((stat(0)/2048)*100)..&quot;% ^&quot; .. flr((mem_high/2048)*100)..&quot;%&quot;,0,0,7)\n	--cpu_high=(stat(1)&gt;cpu_high) and stat(1) or cpu_high\n	--print(&quot;cpu:&quot;..flr(stat(1)*200)..&quot;% ^&quot;..flr(cpu_high*200)..&quot;%&quot;,0,6,7)\n	--print(&quot;#objs:&quot;..#objs,0,12,7)\n	--print(&quot;#objs_queue:&quot;..#objs_queue,0,18,7)\nend\n--mem_high=0\n--cpu_high=0\n__gfx__\n00000000000009990000008888800000000000888880000000000000000000000000008888800000000008888800000000000044440000000000000000000000\n00000088888009990000088888888800000008888888880000000008888800000000588888888000000088888888800000000444444000000000000000000000\n00000888888888990000055599590000000005559959000000000088888888800005555559590000000055599590000000004444444400000000093333900000\n00000555995905550000595999599900000059599959990000000055599590000099599599999900000595999599900000044444444440000000339999330000\n00005959995995550000595599959990000059559995999000000595999599900099599559955990000595599959990000411444444114000003393333933000\n0000595599959995000055999955550000005599995555000000059559995999000995999999550000055999955550000444f144441f44400003933333393000\n0000559999555550000000999999900000000099999990000000055999955550000088855589900000000999999900000444f111111f44400039333333339300\n0000009999999500000555588550000000000558555000000000000999999900000889995885550000005585550000004444f1f44f1f44440093933333393900\n0055555855585000099555588855599900005555885500000000005555850900000859995555550000055585585550004444fff44fff44440933393333933390\n05555555855580050999055898885599000055588988900000000955555599900008889955555500005555888855550044444444444444440333339999333330\n99555555888880050990088888880050000055558888800000009985555599000000888885555000009958988985990004444ffffff444407773393333933777\n9990885889889855000088888888855000008559998880000000558888888000000085558888000000999888888999000000ffffffff00007777933333397777\n0905888888888855000888888888855000000859988800000000588888888000000005555888000000998888888899000011ffffffff00000007733333377000\n005558888888885500558880008885500000008885550000000558880888000000505885558000000000888008880000011111fffff110000000773333770000\n0555888888800000005550000000000000000055555550000005000055500000005555580000000000055500005550000111111fff1110000000077777700000\n05008888000000000005550000000000000000555500000000000000555500000005555000000000005555000055550000111110011100000000007777000000\n00000000000099900000008888800000000000000000000000000000000000000000008888888000000000888880000000000000000000000000000000070000\n00000000000995990000888888900000000008888800000000000000000000000055888888899000000088888890000000000000000070000000000000777000\n00000088888995590008888889900000000888888900000000000008888800000555888888890000000888888990000000000000000777000000000000777900\n00008888888999990008888888888800008888889900000000000888888900000995599588888800000888888888880000000000009777000000000009773900\n00088888888555550005559959990000008888888888800000008888889900009999599599599880000555995999000000000000099773900000000009773990\n00088888888888550059959955999900005559959990000000008888888888809999599599559000005995995599990000000000099773900000000009773990\n00055599599955550059955999999990059959955999900000005559959990009959899959999990005995599999999000000000099773900000000009777990\n00599599599999550559955999599990059955999999990000059959955999909595889999959999055995599959999000000000099777900000000009979939\n00599559999999950559999955555500559955999599990000059955999999999958855995555999055999995555550000000000099979990000000009999999\n00599559995999950555999995555500559999955555500000559955999599990008555999955550055599999555550000000000099999390003333309900999\n05599999555555500005599999999000055999995555500000559999955555500088555559999900000559999999900000033333009999990039333937900099\n05555999955559500000055599000000005599999999000000055999995555500085599955888550000089999950000000393339309909990033939337990000\n00055999999995500000888855800090000888899000000000000599999999000085999998885550000058555585000003339393309900990377393333799000\n00008888558555500005555885580999005855885500000000005888999000000085999995585550000558555585500003773933337990990373939333799990\n05555558858555000055555588585999058555588500000000058555850000000000999995555555005558555585550003739393337990900939333939799900\n55555555855855000555555588558999058555588550000000058555585000000088895995555555055558555585555009393339397990000393333393779000\n55555555885850000555555588558595058555588850000000558555558899000088889955555555055588555588555003933333937799000939333939379000\n55995555885580000555555888558550058555559950000000588555555599990088888885555555555588555588555509393339393790000333939333979000\n59999558888590005555558889859500058555599990000000588855555599990008888888555555555588888888555503339393339790000333393333370000\n99999588898880005555888888888000088555599998000000088855555559990000555888885550555589888898555503333933333700007773939333770000\n99999888888880009999988888888000088855599998800000088885555559990000055555888880999988888888999977739393337700000977733977790000\n90998888888880059999988888888005088885599988800000088888855580000055555555888880999988888888999900777339777990000999777779990000\n09988888888880559999888888888055088888855888800000088888888880000059999555588800099988888888999009997777799999000999000099900000\n00088888888855550999888888855555008888855588000000088888888850000059999995580000099888888888899099990000009999900099900999000000\n00058888888855550008588888855555000888555555000055558888888588000000888899500000008888888888880000000000000000000000000000888800\n55585588888855550058858888855555000885555550000055558888855888005008888888000000088888800888888000000000000000888880000008899880\n555888558888555555588855888555550000885555000000555588885888800055005888800000000888880000888880000000000009988888889900889f9980\n55588888008855555555888800055555000058885550000055558880088880005555555880000000088888000088888000000000099959599595999989f99880\n55588888000000005555580000000000000055550550000055550000055550000555555500000000005555000055550000000000099559599595599989988800\n55588880000000000555000000000000000555550000000055000000055550000055555500000000005555000055550000000000099555999955599988980008\n55000000000000000555000000000000000555555500000050000000055555500005555000000000555555000055555500000000000555599555550008880800\n50000000000000000055500000000000000005555500000000000000055555500000555000000000555555000055555500000000000059555595500000888080\n4ffffffff14ffff4ffffffff44444441777777777777777714444444444444411444444444444441777777770000001111000000000059999995500000888800\nf444444441f444414444444144444441077777777333337749999999999999914222222222222221777777770000017777100000000888999988880008899880\nf444444441f44441444444414444444100777777337373374919999999999191421222222222212177777777000117777771000000558855558855508899f988\nf444444441f444411111111111111111000777773773773749999444449999914222222222222221777777770017777777710100005558855885555088889f98\nf444444441f144414441444444414444000077773733373749994411144999914222222222222221777777770017777777771710005558988985555080089998\nf444444441411114444144444441444400000777333733374999441994419991422222222222222177777777001777777c777771005558888885555008088988\nf444444441fffff144414444444144440000007733333337499944199441999142222222222222217777777701777cc777c77771000558888885550080008880\nf444444441f444411111111111111111000000077733377749999119444199914222222222222221777777771777c77777777771000000000000000000800000\nf444444441f44441777777770000001111000000b000000049999994411199914222222222222221000001111001000077777100000599559999999900000000\nf444444441f4444188888888000001b333100000b000000049999994419999914222222222222221000017771017100077777710005599559995999900000000\n114444441f4444419900009900001b3333310000b000000049999999119999914222222222222221000177777177100077777771005599999555555000000000\nff1144441f4444419000008900001b3333310000b000000049999994499999914222222222222221000777777777101077777770000559999955999900000000\nf4ff1111f4444441900000890000133333310000b000000049999994419999914222222222222221011777777777717177777110000005995559999000000000\nf444fff1f4444441998888990000133333310000b000000049199999119991914212222222222121177777777777777117711000000058855555990000000000\nf4444441f4444411999999990000013333100000b000000049999999999999914222222222222221177777777777777101100000000588555555900000000000\n41111114f1111114888888880000001111000000b000000011111111111111111111111111111111017777777777771000000000000585555550000000000000\n1111111111111111111111111111111133333133000000010000000000000000000000000008008800177c77777777777c777777000585555585000000000000\n1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb1333311130000001300000000000000000000800008008888000177c77c777777c7777777000585555885000000000000\n133333bbbbbb333333333333333333313333111300000133000000000000000000000808008888890000177cccc777cccc7777c7000088558885500000000000\n1bbb33bbbbbb3bb3333333333b3b3bb13333111300001333000000000000000000008888808898980000177777cccccc7ccccc77000088888888500000000000\n1bbb33bbbbbb3bb33333333333b3bbb1311311130001333300000000000000800080898900898999000001117777cc7777ccc777000088888988800000000000\n1bbb33bbbbbb3bb3333333333b3b3bb131133133001333330000011100008088000889f908889f9f000000001777777177777777000888888888800000000000\n1bbb33bbbbbb3bb33333333333b3bbb131133333013333330011133300000889000899ff88989fff000000000117771011777711000888888888800000000000\n1bbb33bbbbbb3bb3333333333b3b3bb131133333133333331133333300008899008889ff88899fff000000000001110000111100000888888888800000000000\n1bbb33bbbbbb3bb33333333333b3bbb1000000999900000000007777000000090000000000000000000000000000000000000000000000000000000000000000\n1bbb33bbbbbb3bb3333333333b3b3bb1000009999440000000777777000000090000000000000000000000000000000000000000000000000000000000000000\n1bbb33bbbbbb3bb33333333333b3bbb1000099994444000007779999000000990000099991100000000000000000000000000000000000000000000000000000\n1bbb33bbbbbb3bb3333333333b3b3bb1000999994444400077999444000000990000999999110000000000000000000000000000000000000000000000000000\n1bbb33bbbbbb3bb33333333333b3bbb1009999999444990077999444000009990000994499110000000000000000000000000000000000000000000000000000\n1bbb33bbbbbb3bb3333333333b3b3bb1099444999999999007779999099999990009949919911000000000000000000000000000000000000000000000000000\n11111111111111111111111111111111094444499999999000777777099999490009949919911000000000000000000000000000000000000000000000000000\n00111111111111111111111111111100994444499999449900007777009999490009949919911000000000000000000000000000000000000000000000000000\n001bbb33bbbbb3bb33333333b3bbb100994444499999444900000003000999490009949919911000000000000000000000000000000000000000000000000000\n001bbb33bbbbb3bb333333333b3bb100999444999999944933300003000099990009949919911000000000000000000000000000000000000000000000000000\n001bbb33bbbbb3bb33333333b3bbb100999999999999999903330003000099990009949919911000000000000000000000000000000000000000000000000000\n001bbb33bbbbb3bb333333333b3bb100094447777774449003333003000999990009949919911000000000000000000000000000000000000000000000000000\n001bbb33bbbbb3bb33333333b3bbb100000077777777000000333303000999990009949919911000000000000000000000000000000000000000000000000000\n001bbb33bbbbb3bb333333333b3bb100000077777797000000333303000999900000991199110000000000000000000000000000000000000000000000000000\n001bbb33bbbbb3bb33333333b3bbb100000077777797000000033333009990000000999999110000000000000000000000000000000000000000000000000000\n001bbb33bbbbb3bb333333333b3bb100000007777970000000000033009900000000099991100000000000000000000000000000000000000000000000000000\n00000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000370003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00003330037770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00007330033700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00033370073377000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00033330333770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00737330733337700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00333330337337000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00333730333330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00373330373333700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00333370333373700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00373330073333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00033730033733300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00033330003333700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00007370000373330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000030000003730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n99000009990000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n93990009939900090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n09399009093990090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n09939909099399090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00993909009939090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00999399009993990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00099999000999990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000099000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094000000990000007400000009000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094000009999000007400000009000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944400099999900077740000009000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944400099749900077740000009000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944400997994990077740000009000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000944400997994990077740000009000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000744400997994990077740000007000\n__label__\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccc000000000000000c00000ccc00000000000000000cccccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccc077707070777070c07770ccc07070777077707070cccccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccc070707070070070c00700ccc07070070007007070cccccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccc077007070070070cc070cccc07070070c07007770cccccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccc07070707007007000070cccc07770070007007070cccccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccc07770077077707770070cccc07770777007007070cccccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccc00000000000000000000cccc00000000000000000cccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccc0000000000000ccccccc000000000000000000000ccc0000000c000000000000000000000000000000000cccccccccccccccccccccc\nccccccccccccccccccccc0777077007070ccccccc077707770077077700770ccc0777070c077707770777007707770777077707770cccccccccccccccccccccc\nccccccccccccccccccccc0707070707070ccccccc077700700700070707070ccc0707070c070700700700070707070777070007070cccccccccccccccccccccc\nccccccccccccccccccccc0777070707070ccccccc07070070070c077007070ccc0777070c077700700770070707700707077007700cccccccccccccccccccccc\nccccccccccccccccccccc0707070707770000cccc070700700700070707070ccc07000700070700700700070707070707070007070cccccccccccccccccccccc\nccccccccccccccccccccc0707077700700070cccc070707770077070707700ccc070c077707070070070c077007070707077707070cccccccccccccccccccccc\nccccccccccccccccccccc000000000000c000cccc00000000000000000000cccc000c000000000000000c000000000000000000000cccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n44444444444441ccccccccccccccccccccccccccccccccccccccccccccccccffffffffffffffff1444444444444441ffffffffffffffff1444444444444441ff\n99999999999991cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149999999999999914444444144444441499999999999999144\n19999999999191cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149199999999991914444444144444441491999999999919144\n99944444999991cccccccccccccccccccccccccccccccccccccccccccccccc111111111111111149999444449999911111111111111111499994444499999111\n99441114499991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449994411144999914441444444414444499944111449999144\n99441994419991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449994419944199914441444444414444499944199441999144\n99441994419991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449994419944199914441444444414444499944199441999144\n99911944419991cccccccccccccccccccccccccccccccccccccccccccccccc111111111111111149999119444199911111111111111111499991194441999111\n99999441119991cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149999994411199914444444144444441499999944111999144\n99999441999991cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149999994419999914444444144444441499999944199999144\n99999911999991cccccccccccccccccccccccccccccccccccccccccccccccc444444414444444149999999119999914444444144444441499999991199999144\n99999449999991cccccccccccccccccccccccccccccccccccccccccccccccc111111111111111149999994499999911111111111111111499999944999999111\n99999441999991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449999994419999914441444444414444499999944199999144\n19999911999191cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449199999119991914441444444414444491999991199919144\n99999999999991cccccccccccccccccccccccccccccccccccccccccccccccc444144444441444449999999999999914441444444414444499999999999999144\n11111111111111cccccccccccccccccccccccccccccccccccccccccccccccc111111111111111111111111111111111111111111111111111111111111111111\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc999ccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc88888cc999ccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc88888888899ccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc5559959c555ccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc595999599555ccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc595599959995ccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc55999955555cccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc99999995ccccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc55555855585cccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc555555585558cc5ccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc9955555588888cc5ccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc999c885889889855ccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc9c5888888888855ccccccccccccccccccccccccccccccccccccccccc\nccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc55588888888855ccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc5558888888cccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc5cc8888ccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ncccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\nfffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44ffffffff14ffff44f\n44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4\n44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4\n44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4\n44444441f14441f444444441f14441f444444441f14441f444444441f14441f444444441f14441f444444441f14441f444444441f14441f444444441f14441f4\n44444441411114f444444441411114f444444441411114f444444441411114f444444441411114f444444441411114f444444441411114f444444441411114f4\n44444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f444444441fffff1f4\n44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4\n44444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f444444441f44441f4\n44444441f44441f444444441f44441f4440000000000010000444440000000f4440000000004410000000000004441f444444441f44441f444444441f44441f4\n4444441f444441114444441f4444411144070700770701077004440077777001440777007704410777070707700441114444441f444441114444441f44444111\n1144441f444441ff1144441f444441ff1107070707070107070444077070770f110070070704410707070707070441ff1144441f444441ff1144441f444441ff\nff1111f4444441f4ff1111f4444441f4ff077707070701070701110777077704ff1070070704410770070707070441f4ff1111f4444441f4ff1111f4444441f4\n44fff1f4444441f444fff1f4444441f44407070707070007070ff1077070770444f070070704410707070707070441f444fff1f4444441f444fff1f4444441f4\n444441f4444411f4444441f4444411f444070707700777077704410077777004444070077004110707007707070411f4444441f4444411f4444441f4444411f4\n111114f111111441111114f1111114411100000000000000000114f00000004111100000001114000000000000011441111114f111111441111114f111111441\n\n__gff__\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002010101010101010101010000000000000000000000000000000000000000000101050500008383010100000000000001010500000083830101000000000001\n0101010100000000000000000000000001010101000000008888000000000000010100010000000088880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__map__\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000969700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000969700000000000000009697000096970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__sfx__\n011200200a135161450713513145081351414507100071000710013100131000a1000a13516145071351314508135141450810008100141001410014100141001f3001f3001f3000030000300003000030000300\n01120020031350f145001350c145011350d1450f1000f10000100001000010000100031350f145001350c145011350d14501100011000d1000d1050d1450c1350b1451f3001f3000030000300003000030000300\n010e00000e1000e0050e1000e005021050e1050e1000e00500100001000e1000e0050e1000e005001000010013100131051310500100001000010000100001000710007100071050010000100001000010000100\n010a00003c6153c0053c6053c005186103c0053c6153c0053c0053c005186103c0053c6153c0053c0053c0053c6153c0053c0053c0053c0053c0053c0053c0053c6153c0053c6153c0053c615000053c61500005\n011300002433500000000001f33500000000001c33500000000002133523305233350000022335213350c0231f33528335283052b3352d33500000293352b335000002833500000243352633523335000000c023\n011300001c325000000000018325000000000013325000000000018325000001a3250000019325183250c0030c0231f32500000233253c6150000021325233250c0031f325000001c3253c6151a325000000c003\n01130000131353f2150c000101353c6153f2150c1350c0000c023111353f215131353c61512135111353f21510135181353f2151c1351d135180001a1351c1350c023181353f215151351713513135071043f215\n010c0000243301a015243301a015243301a0151a015243301a015243301a0151a015243301a015243301a01523330180352333018015233301803518015233301801523330180151803523330180352333018035\n01130000000002b3052b3352a33529335273353f215283350c0232033521335243353c61521335243352633500000000002b3352a335293352733528305283350000030335070003033530335000000000000000\n001300000c0233f205283252732526325233053f205243050c0031c3051d3251f3253c605183251c3251d3250000000000283252732526325233052430524325000002b325003002b3253c615000000000000000\n01130000001353f21500000071353c615233250c13524325051351c3253f2150c1350c1353f215051353f215001353f2153f215041353c61523325071350c1350c023293253f21529325293253f215071353f215\n01130000000002b3052b3352a335293352733500000283350c0232033521335243353c6152133524335263350000000000273352a30529305263352830528305243353030507000283053c615000000000000000\n001300000000000000283052732526325233053f215243050c0031c3051d3251f3253c605183251c3251d32500000000002032527305263051d32524305243051c3352b305003002b3053c6053f2050000000000\n01130000001353f21528325071353c615233250c13524325051351c3253f2150c1350c1353f215051353f215001353f215081353f2153c6150a1353f2150c1050c1350c1053f21507135071353f215001353f215\n011300002433524335000002433500000243352633500000283352433500000213351f335000003f2150000024335243350000024335000002433526335283350c023000003f2050c023000003f6153f6153f615\n011300000c0232030500000203253c6052032522325000001f3251c305000001c32518325000003f205000000c0232030500000203250000020325223251f3250c003000003f2050c003000003f6053f6053f605\n0113000008135203253f2150f1353c6153f2151413500000131351c325000000c1353c6153f615071353f6150813520325336150f135306153f215141351f3251313500000000000c13500000000000713500000\n0110000013334183341c3341f33424334283342b3342b3302b33014334183341b3342033424334273342c3342c3302c330163301a3341d3342233426334293342e3342e330163002e3352e3352e3353033030330\n0113000008135203253f2150f1353c615203251413500000131350c023000000c1353f6153f605071353f6150e1350e1353f6150e135000000e1350e135000001313500000000000c023071353f6153f6153f615\n011300002433524335000002433500000243352633500000283352433500000213351f335000003f2150000028335283350000028335000002433528335000002b3350000000000000001f335000000000000000\n011300000c0232030500000203253c6052030522325000001f3251c325000001c32518325000003f205000000c0231e325000001e325000001e3251e325000002332500000000000000013325000000000000000\n011300002833524335000001f3353f6150000020335000002133529335000002933521335000003f21500000233352d335000002d3352d3352b3350000029335283352433524305213351f335000003f21500000\n011300002432521325000001c3253f605000001d325000001d3252432500000243250c135000003f205000001f3252932500000293253f6152832500000263252432521305000001d3053f615000003f20500000\n01130000001353f2153f21506135071350c1050c1353f215051353f215051353f2153f6150c1350513505105021353f2150000005135071353f2150b1353f2150713521325071351d3250c1350c1350713500000\n01130000001353f2153f21506135071350c1050c1353f215051353f215051353f2150c1350c135051353f215071353f215000000713507135091353f2150b1350c1353f215071353f215001350c1053f21500000\n011300002833524335000001f3353f61500000203350000021335293350000029335213350000000000000002333529335000002933529335283350000026335243351c335243051c33518335000000000000000\n011300002432521325000001c3253f605000001d325000001d3252432500000243253f6150000000000000001f3252632500000263253f6152432500000233251f32521305000001d3053f615000000000000000\n010c00000e0301d3151d330150303c6101d3151d3151a0300c0331d3301d015150303c6101a3301a0300c0330c0301c3151c330130303c6101c3151c315180300c0331c3301c015130303c6101c015180300c033\n0114002028335283352830028335280052433528335280052b3352b3052b305003001f3350030000300003002b3052b3052b305003002b3050030000300003001f3001f3001f3050030000300003000030000300\n011400201e3251e3251e3001e3251e0051e3251e325003002332523305230050000013325000000000000000233052330523005000001f3050000000000000001330013300130050000000000000000000000000\n011400200e1350e1353c6050e1353c6050e1350e13500100131351310513105001000713500100001000010013105131051310500100131050010000100001000710007100071050010000100001000010000100\n010a00003c6053c0053c6053c005186003c0053c6053c0053c0053c005186003c0053c6053c0053c0053c0053c6053c0053c0053c0053c0053c6053c6053c6053c6053c0053c6053c0053c605000053c60500005\n011200200a325163250732513325083251432507100071000710013100131000a1000a32516325073251332508325143250810008100141001410014100141001f3001f3001f3000030000300003000030000300\n01120020033250f325003250c325013250d3250f1050f10500105001050010500105033250f325003250c325013250d32501105011050d1050d3050d3250c3250b3251f3051f3050030500305003050030500305\n010d00000a1450a725001050d1400d725001050c1400c725001050614006725001050514005725001050b1400b725001050a135101450f1350e145141351314512135001000d1450010009145001000814507305\n010d00000a3200a7050a0050d3200d100003000c32000300003000632000300003000532000300003000b32000300003000a320103200f3200e320143201332012320003000d3200030009320003000832000305\n010e00200714500105061450d10500105001050c10500105001050610500105001050510500105001050b10500105001050a305103050f3050e305143051330512305000000d3050000009305000000830507305\n010e00200732000305063200d10500105001050c10500105001050610500105001050510500105001050b10500105001050a305103050f3050e305143051330512305000000d3050000009305000000830507305\n01120000030300303003030030300303003030030300303002030020300203002030060300603006030060300503005030050300503005030050300503005030040300403004030040300a0300a0300a0300a030\n010900000903009030090300903009030090300903009030040300403004030040300403004030040300403003030030300303003030030300303003030030300403004030040300403004030040300403004030\n011200001f317223171f317213171f317203171f317213171f317223171f317233171f317223171f317213171e317213171e317203171e317213171e317223171e317213171e317223171e317213171e31720317\n010900002231726317223172731722317263172231725317223172631722317253172231724317223172531722317263172231727317223172631722317253172231726317223172531722317243172231725317\n0108000023330233202933029310130151301529330293252933029325293002833028325283002633026325263002433024325243000030000300003000030000300183130c3310030000300003000030000300\n0108000013030130251f313133312631312331130301302513030130251d00015030150251c00017030170251a0001f3130a3311c3131333113030130201c313103310c0300c0200c00000000000000000000000\n01100000000001032013320183201c3201f320243202432024320283000f32014320183201b320203202432024320243202030011320163201a3201d320223202632026320223001a3251a3251a3251c3201c320\n010a00002433424330000000000000000000001f3341f330000000000000000000001c3341c3301c3301c33021334213302132023334233302332021334213302132020334203302032020320223342233022320\n010f000022320203342033020320203201f3341f3301f3301f3301f3301f3321f3351f3001f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n010a00001c3341c33000000000000000000000183341833000000000000000000000133341333013330133301d3341d3301d3301d3301d3301d3301d3301d3301d3301d3341d3301d3301d3301d3301d3301d330\n010b00201033020337230172033520330203301133021330213102133524017213171233022330223102233522330223301f030130101f036130361f036130361f036130361f0361300700000000000000000000\n010a00001303013030000000000000000000001003010030000000000000000000000c0300c0300c0300c0301103011030110301103011030110301103011030110300d0300d0300d0300d0300d0300d0300d030\n011000000d0300d0300d0300d0320d0320c0300c0300c0300c0220c0220c0120c0150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n010b00201c33026330263102633526330263301d33027330273102733527330273301e33028330283102833528330283302933029310293262332629326233262932623326293262330000000000000000000000\n01040000103500c3510e3501035010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n01020000133551f3552b3553735537305003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000300003000030000000\n010200002406025051270412f0002b0512c0512d0412e0312f0212f0052f00032000030000000037000370002f0002f0002f0002f000000003300004000000000000000000000000000000000000000000000000\n01020000346500513000605396500a130006053365004130006053865009130006053265003130006053765008130006053165002130006053365004130006000060000600006000060000600006000060000600\n01030000343502d350343502d35028350213501c35015350103500a35004350343502d350343502d35028350213501c35015350103500a35004350343502d350343502d35028350213501c35015350103500a350\n01050000183401f340203401934020340213401a34021340223401b3402234023340003000030000300003000030000300003001a30021300223001b300223002330000300003000030000300003000030000000\n01040000244401f44024440284402b440304402b4402044024440274402c440274402c440304403344038440334402244026440294402e440294402e44032440354403a440354400040000400004000040000400\n01100000373553c35534c703c3553e35537c700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0104000015320163201732018320193201a3201b3201c3201d3201e3201f320203202132022320233202432025320263202732028320293202a3202c3202d3202f32030320323203332035320363203832039320\n010400002f3502f3502f3503435034350343503434034340343403434034340343303433034320343203432034310343103431500300003000030000300003000030000300003000030000300003000030000300\n010200001f3601f3602233022330214312133023360233601f450214512130021300233012330023300233001f4001f4001f4001f405214002130523300233051f4002040122401233001f400000000000000000\n0103000021360213602135021350213502135022340233302432025320263202732028320293202a3202b3102c3102d3100000000000000000000000000000000000000000000000000000000000000000000000\n__music__\n00 1c1d1e03\n01 04060547\n00 04060547\n00 080a0947\n00 0b0d0c47\n00 08090a47\n00 0b0c0d47\n00 0e100f51\n00 13121451\n00 04050647\n00 04050647\n00 1517165b\n00 19181a5b\n00 1517165b\n00 19181a5b\n00 0e100f51\n00 13121451\n00 1516175b\n02 191a185b\n01 00204302\n00 01214302\n00 22234344\n02 24254342\n03 071b6869\n00 3e6d6a67\n04 2a2b6c67\n00 2d316f67\n04 2e327067\n01 26285167\n02 27296c67\n00 3c7b7167\n04 112c7044\n04 33304344\n\n</code></pre>');

function initEmbeddedPaste_ADfMSBU2llpZabD0() {
	hljs.highlightBlock(document.getElementById('pastee-ADfMSBU2llpZabD0-content'));
}

addEventListener('DOMContentLoaded', initEmbeddedPaste_ADfMSBU2llpZabD0, false);
addEventListener('load', initEmbeddedPaste_ADfMSBU2llpZabD0, false);