XMPP Summit - 2012-10-25


  1. stpeter set the topic to

    http://wiki.xmpp.org/web/Summit_12

  2. stpeter set the topic to

    http://wiki.xmpp.org/web/Summit_12 | remote participation: https://plus.google.com/hangouts/_/7a8d1536d98d4d57a9ebb42f89e771df1757d3d1?authuser=0&hl=en-US

  3. stpeter

    hi Steffen

  4. Steffen Larsen

    hi stpeter

  5. Steffen Larsen

    is the conf. on?

  6. stpeter

    we haven't quite started yet

  7. stpeter

    waiting for people to come upstairs from breakfast

  8. Steffen Larsen

    ahh ok. shouldn't it be now or ?

  9. stpeter

    it should be now, yes

  10. Steffen Larsen

    ahh ok.. here itøs dinner time.

  11. Steffen Larsen

    it's

  12. stpeter

    ok, enjoy your dinner

  13. Steffen Larsen

    thats fine.. I'll take a quick bath and have a dinner. back in 20. is the conf. on then?

  14. Steffen Larsen

    merci

  15. Tobias

    stpeter, in retrospect i should have just used hangout on my mobile, i know its mic is working ^^

  16. Steffen Larsen

    is hangout up and running?

  17. Tobias

    Steffen Larsen, yup

  18. Tobias

    see subject/topic or https://plus.google.com/hangouts/_/7a8d1536d98d4d57a9ebb42f89e771df1757d3d1

  19. Steffen Larsen

    yes. i just followed the link

  20. Steffen Larsen

    will join in 20 min

  21. Tobias

    when will the summit start? or when is 9:00 in local time?

  22. Ben Langfeld

    We're just having some network issues here, and we're missing a couple of people, but I figure we'll get started soon.

  23. Tobias

    a link to the mentioned youtube broadcast, if it exist, would be nice too

  24. Ben Langfeld

    We're using google hangouts right now, I believe.

  25. Tobias

    yes

  26. stpeter set the topic to

    http://wiki.xmpp.org/web/Summit_12 | remote participation: https://plus.google.com/hangouts/_/b84e928d04633d26f5902ffcf6a597b4ba7fd3b3?authuser=0&hl=en-US

  27. stpeter

    new hangout, got disconnected from the old: https://plus.google.com/hangouts/_/b84e928d04633d26f5902ffcf6a597b4ba7fd3b3?authuser=0&hl=en-US

  28. stpeter

    changed it again: https://plus.google.com/hangouts/_/341b1d71f1b5294d0ef616e0dccee849aa918c1a?authuser=0&hl=en-US

  29. stpeter set the topic to

    http://wiki.xmpp.org/web/Summit_12 | remote participation: https://plus.google.com/hangouts/_/341b1d71f1b5294d0ef616e0dccee849aa918c1a?authuser=0&hl=en-US

  30. stpeter

    I could not figure out the YouTube integration

  31. Tobias

    ah..ok

  32. Ben Langfeld

    There's always ustream if all else fails

  33. Tobias

    stpeter, http://support.google.com/youtube/bin/static.py?hl=en&topic=2572818&guide=2572797&page=guide.cs you might already know that....

  34. bear

    any remote folk speak up if they want me to relay questions or items

  35. Steffen Larsen

    stpeter: ha ha.. nice summit on hangouts.. can you turn up or something? :-)

  36. Steffen Larsen

    stpeter: the volume that is

  37. bear

    it's the microphone on the mac - so the back-of-the-room folks may be low volume

  38. Steffen Larsen

    we have to get a real mic. :-)

  39. xnyhps

    Heb, joining the hangout from my phone didn't work very well

  40. xnyhps

    *Heh

  41. m&m

    intro?

  42. m&m

    I couldn't hear earlier

  43. bear

    brian beggs from EnerNOC

  44. bear

    he gave a talk at the realtime conference - it will be up on the internet in a couple of days

  45. m&m

    (belated) grazé

  46. m&m

    y'all blinked! (-:

  47. bear

    the hangout keeps dropping - peter is adjusting it when we hear the "drop" tone

  48. bear

    Justin from fanout.io

  49. m&m

    could you tilt the screen back a little … he's headless (-:

  50. bear

    how is that?

  51. m&m

    grazé!

  52. bear

    I couldn't get his name, but he is from Erlang Solutions

  53. m&m

    /nod

  54. jack

    michal slaski

  55. MattJ

    !xep 286

  56. bear

    xep-198

  57. bear

    XEP-0238: XMPP Protocol Flows for Inter-Domain Federation

  58. dwd

    XEP-0286 is Mobile XMPP summary, basically. Power level background, and suggestions for implementations.

  59. Steffen Larsen

    dammit we could use a real mic for the summit.. it's really hard to hear anything remotely.. :-)

  60. bear

    we are turning the camera to make the mic better

  61. Steffen Larsen

    bear: merci!

  62. bear

    they are talking about transmit delay for bosh

  63. dwd

    We have a real Mike, if that helps.

  64. bear

    please do speak up if you want to add

  65. bear

    :)

  66. Steffen Larsen

    yeah!.. can't at the moment, screaming baby, food etc. :-)

  67. bear

    ahh

  68. bear

    peter is adding to the whiteboard the items that need to be brought up at the bosh session

  69. bear

    pirate pad http://piratepad.net/05gvwTiPKT

  70. bear

    i'll be adding what is on the whiteboard to it

  71. bear

    jack is setting up the projector for a presentation

  72. stpeter

    https://plus.google.com/hangouts/_/341b1d71f1b5294d0ef616e0dccee849aa918c1a?authuser=0&hl=en-US

  73. waqas

    The link is in the room subject

  74. bear

    Jack is starting his presentation

  75. bear

    ralph is standing in front of jack with a tablet of the google hangout - jack is being very distracted by it :)

  76. Zash

    ha

  77. Ben Langfeld

    http://www.html5gamedevelopment.org/StateofHTML5GameDevelopment

  78. tofu

    Ben Langfeld: I was just looking at that :)

  79. stpeter

    http://metajack.im/tmp/crowdball/client.html

  80. jack

    http://github.com/talkto/crowdball

  81. ralphm

    http://display.ik.nu/xmpp

  82. MattJ

    ~/prosody/trunk$ wc -l plugins/mod_{message,presence}.lua 85 plugins/mod_message.lua 378 plugins/mod_presence.lua

  83. m&m

    lunch!

  84. bear

    yes! lunch!

  85. winfried

    lunch? just had dinner ;-)

  86. m&m

    (-:

  87. bear

    silly EU folks

  88. m&m

    I also humbly request y'all avoid summit topics in the lunchtime conversations (-:

  89. dwd

    lunch... mmmmm....

  90. bear

    I will try to cancel any deep conversations

  91. dwd

    m&m, we'll just talk about you.

  92. m&m

    that works

  93. m&m

    dwd: I know you're jealous of my hair and beard

  94. m&m goes to make a panini

  95. dwd

    I am, it's true.

  96. Steffen Larsen

    stpeter is really hungry… ha ha

  97. Steffen Larsen

    thanks bear.. didn't notice!

  98. winfried

    hi peter...

  99. stpeter

    hi!

  100. winfried

    seems to be a hickup

  101. stpeter

    I think your video/audio froze :)

  102. winfried

    just did, yes

  103. stpeter

    Steffen Larsen: actually I can go without lunch, but Dave Cridland was complaining :)

  104. Steffen Larsen

    stpeter: ha ha, ok

  105. Steffen Larsen

    stpeter: just look determined..

  106. Steffen Larsen

    its not the skype codec..

  107. pushp

    Hi - joining late. Is there a video stream?

  108. Ben Langfeld

    check the topic

  109. Ben Langfeld

    google hangout

  110. Steffen Larsen

    there is a hangout

  111. Steffen Larsen

    topic

  112. ralphm

    Florian linked me to this: http://www.youtube.com/watch?v=MyguMuZnHoc at 00:12

  113. winfried

    I try to rejoin the hangout, but I get the message that the hangout is over...

  114. Steffen Larsen

    winfried: you have to click "yes" that you are still there in the hangout.

  115. Steffen Larsen

    irritating.. but..

  116. winfried

    don't see the option at my google+ app for android... :-(

  117. Steffen Larsen

    ohh prob. a small bug. ;-)

  118. Steffen Larsen

    its there on a normal browser

  119. winfried

    I am back, but audio only

  120. winfried

    I have to apologize Stefan Strigler: I just got word he can't make it today

  121. winfried

    can somebody mirror the topic list?

  122. bear

    http://piratepad.net/05gvwTiPKT

  123. bear

    I am mirroring the pad peter is writing on

  124. Steffen Larsen

    bear: cool

  125. dwd

    That URI asks me if I want to create the pad. :-/

  126. dwd

    I guess it won't work on Android's Chrome or something.

  127. bear

    hmm

  128. m&m

    bear: double-you eff em

  129. bear

    ???

  130. m&m

    works for me (wfm)

  131. dwd

    Huh. Nor on the (old) Android Browser. Ah, well.

  132. bear

    ahh

  133. bear

    list as it stands:

  134. bear

    1. BOSH vs WebSocket 2. XMPP over WebSocket 3. batch / buffer size 4. General BOSH cleanup 5. Session attachment 6. Shared BOSH / WebSocket

  135. dwd

    bear, It's OK, I can just read the flipchart from here, I just wanted to help type.

  136. bear

    I keep forgetting some are in the room - brain is having trouble linking nicks here with real-life folk

  137. pushp

    Is this still the hangout URL? https://plus.google.com/hangouts/_/7a8d1536d98d4d57a9ebb42f89e771df1757d3d1 ? Says event ended.

  138. waqas

    pushp: https://plus.google.com/hangouts/_/341b1d71f1b5294d0ef616e0dccee849aa918c1a?authuser=0&hl=en-US

  139. stpeter

    https://plus.google.com/hangouts/_/341b1d71f1b5294d0ef616e0dccee849aa918c1a?authuser=0&hl=en-US

  140. pushp

    Thanks waqas, stpeter

  141. m&m

    I missed about 45 seconds of that conversation

  142. bear

    they are talking about the edge case that involves bosh receiving two requests with the same RID

  143. bear

    and trying to find out what current implementations are doing to handle it

  144. winfried

    and we have come to a conclusion?

  145. m&m

    OpenFire must die?

  146. Zash

    Yes!

  147. winfried

    ....no comment

  148. Zash

    Did you manage to get the feed onto something that doesn't require a google account to see?

  149. winfried

    getting very choppy sound

  150. winfried

    lost it here...

  151. jack

    The solution we discussed for dupe RID was to return <body/> for the original request, discard data for the incoming duplicate request, and begin holding it.

  152. winfried

    thanks jack

  153. jack

    (sorry for delay. had wifi problems for a bit)

  154. waqas

    One solution we discussed before was: auth with SASL, using the session cookie/token as password.

  155. waqas

    The web application becomes the SASL service which the XMPP server talks with, and the client need not go through the web app

  156. m&m

    choppy

  157. winfried

    beyond choppy.. disconnected

  158. bear

    yea, the wifi is getting busy here

  159. m&m

    lost audio

  160. bear

    MattJ bamf'd to a foreword seat

  161. dwd

    We have got two cameras going, could explain it - is anyone using Ralph's roving Nexus 7 cam?

  162. bear

    reconnect - the audio is working to others

  163. m&m

    dropping and rejoining

  164. bear

    everything dropped - reconnecting

  165. Steffen Larsen

    wtf happened… well back again

  166. winfried

    now I am all alone in the hangout...

  167. Steffen Larsen

    ha ha

  168. bear

    our side dropped - we had to reconnect

  169. m&m

    I rejoined

  170. Steffen Larsen

    I can see the others

  171. winfried

    maybe I am dropped again...

  172. winfried

    *sigh*

  173. m&m

    ouch

  174. waqas

    We have some implementations of that by the way. I can't recall, but it was probably Prosody's mod_auth_phpbb3, mod_auth_wordpress, etc.

  175. winfried

    of 'that' is: SASL external with the session id of the webapplication?

  176. m&m

    ask ralph to try landscape … it might provide a less squeezed view

  177. waqas

    We just used SASL PLAIN, with password=wordpress-auth-token. mod_auth_wordpress+Wordpress was an external SASL handler. No modification to the XMPP server or BOSH component.

  178. m&m

    better

  179. m&m

    ¡gracias Ralph!

  180. waqas

    What Matthew Wild suggested also works across browsers (user has app open in multiple browsers/devices)

  181. m&m

    audio is super faint

  182. m&m

    and some extra feedback

  183. m&m

    I can't hear y'all

  184. m&m

    yikes

  185. Steffen Larsen

    WTF

  186. m&m

    STAHP

  187. Steffen Larsen

    auuuch

  188. Steffen Larsen

    sound is f****

  189. MattJ

    waqas: iirc you were originally on the shared-BOSH side :)

  190. winfried

    I missed the start of this discussion, was there discussed what would be the best level to solve this

  191. winfried

    ?

  192. waqas

    MattJ: I was. I was also on the session-unbind support side.

  193. tofu

    unbind?

  194. waqas

    tofu: Multiple sessions on the same (BOSH) stream. You can ignore that :)

  195. m&m

    ralphm: don't quit your dayjob to be a camera operator (-:

  196. m&m

    I'm a little dizzy now (-:

  197. dwd

    m&m, Ralph says his arm got tired.

  198. Steffen Larsen

    can't manage any more guys.. I'm off to bed. See you guys tomorrow!

  199. dwd

    nn

  200. Steffen Larsen

    nighty nighty! :-)

  201. MattJ

    'night

  202. winfried

    nn

  203. bear

    http://caniuse.com/sharedworkers

  204. waqas

    Shared streaming documents. Client logs in, indicates what categories of documents it's interested in (MUC rooms, etc), servers sends all current state, and streams updates. :)

  205. waqas

    This is exactly what the roster protocol does

  206. winfried

    so... the idea is now a 'session proxy'...?

  207. waqas

    One of the ideas

  208. winfried

    brb

  209. tofu

    ralphm: https://www.erlang-solutions.com/products/mongooseim-massively-scalable-ejabberd-platform

  210. m&m

    brb - bb

  211. bear

    Michal Slaski from Erlang Solutions

  212. tofu

    https://github.com/esl/ejabberd

  213. tofu

    jack: ^

  214. m&m

    are there slides?

  215. m&m

    (-:

  216. bear

    :)

  217. waqas notes that ejabberd's BOSH doesn't support HTTP Connection:Keep-Alive

  218. Tobias

    of course not

  219. tofu

    why would you want that? ;)

  220. waqas

    Which badly hurts BOSH performance

  221. Tobias

    if you want long connections, why don't you use normal TCP? :P

  222. MattJ

    Tobias: Because the W3C+IETF wouldn't let us

  223. Tobias

    yeah...that bad IETF :) aron didn't bash about w3c a bit....didn't they have their fingers in oauth too?

  224. waqas

    You can't blame them. Raw TCP isn't WebScale.

  225. MattJ

    He said most stuff went wrong under the IETF

  226. Tobias

    waqas, only node is webscale

  227. Tobias

    doesn't w3c have even more coporate participation than ietf?

  228. waqas

    There's Tigase, with their pseudo-XML parser :)

  229. winfried

    ;-)

  230. winfried

    btw sorry for forgetting to mute myself after relogging in

  231. m&m

    I need to drop out … could you post the followup discussions on the list before you all adjourn?

  232. bear

    sure can

  233. winfried

    great!

  234. winfried

    I remember a blog by Jack on translating it...

  235. jack

    http://metajack.im/2010/02/01/json-versus-xml-not-as-simple-as-you-think/

  236. jack

    JSON-LD supposedly solves the namespacing issue

  237. jack

    but the array vs. non-array thing is not as easy

  238. winfried

    yep

  239. jack

    or perhaps i don't know enough about json-ld

  240. jack

    i should probably write a version 2 of that blog comparing it against json-ld

  241. jack

    http://json-ld.org/spec/latest/

  242. winfried

    client side serializing/deserializing? makes me shiver...

  243. MattJ

    +1

  244. MattJ

    Every problem can be solved with another layer of indirection

  245. winfried

    but what is the problem? webdevelopers not able to use a api?

  246. MattJ

    Apparently

  247. Ben Langfeld

    web developers are like school children and XML is like cooties

  248. bear

    hahaha

  249. Ben Langfeld

    Does this surprise anyone?

  250. bear

    i'l avoid saying things about php and javascript-in-browser...

  251. winfried

    bear: tempting wasn't it

  252. bear

    *very*

  253. ralphm

    { "iq": { "-type": "set", "-from": "hamlet@denmark.lit/blogbot", "-to": "pubsub.shakespeare.lit", "-id": "pub1", "pubsub": { "-xmlns": "http://jabber.org/protocol/pubsub", "publish": { "-node": "princely_musings", "item": { "entry": { "-xmlns": "http://www.w3.org/2005/Atom", "title": "Soliloquy", "summary": " To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? ", "link": { "-rel": "alternate", "-type": "text/html", "-href": "http://denmark.lit/2003/12/13/atom03" }, "id": "tag:denmark.lit,2003:entry-32397", "published": "2003-12-13T18:30:02Z", "updated": "2003-12-13T18:30:02Z" } } } } } }

  254. ralphm

    (http://jsontoxml.utilities-online.info/)

  255. Lance

    that's suprisingly straightforward

  256. jack

    why do some start with -?

  257. Lance

    attributes

  258. winfried

    (brb)

  259. bear

    attributes to the element

  260. Lance

    ralphm: now do one using xml:lang

  261. winfried

    (ba)

  262. ralphm

    of course there are some issues. Some elements *may* actually be specified more than once at a particular level. E.g. in this example, there might be multiple "link" entries, and that translator the wraps those in a list: link: [{"-rel":....},{"-rel":....}]

  263. ralphm

    Lance: I assume it will just do '-xml:lang'

  264. Lance

    ralphm I was thinking of the matter that you can have multiple of the same item as long as the lang is different

  265. jack

    one issue is that youcan't do link.append("foo") because it may be a list or it may be a single element

  266. jack

    so they all have to be lists right?

  267. ralphm

    jack: in that case it does become ugly

  268. ralphm

    jack: and that's when bear's suggestion becomes more attractive to me

  269. jack

    what was bear's suggestion?

  270. Lance

    fixed model, loses extensibility

  271. Lance

    in the general sense

  272. jack

    seems like a nonstarter though. won't you devolve into IRC like stuff where people text encode the customizations inside the "standard" elements provided?

  273. Lance

    {http://jabber.org/protocol/disco#info}query -> "disco_info"

  274. Ben Langfeld

    Or a fixed model which decorates an XML model, gaining both benefits

  275. Lance

    a mapping like that

  276. dwd

    Fixed model for known items, stock tools for JSON-a-like payloads, and we didn't discuss extensions to the fixed models.

  277. Ben Langfeld

    I take an XML node and I decorate it with a dev-friendly model.

  278. Ben Langfeld

    I can still do all of the generic XML operations I enjoy, and everyone whose use-cases fit the decorator can just use that.

  279. ralphm

    Ben Langfeld: can you paste a small example?

  280. dwd

    roster.add("Dave Cridland", "dwd@dave.cridland.net").x("group").t("Fools")

  281. dwd

    Presumably.

  282. Ben Langfeld

    presence = Blather::Stanza::Presence.new presence.status = :dnd presence.add_child 'foo' # => <presence><show>dnd</show><foo/></presence>

  283. Ben Langfeld

    Dave's example is also the same idea

  284. Lance

    Ben Langfeld: +1 that's what sleek does, especially since it followed blather's model

  285. bear

    dave's example would fit the nodeJS folks to a T

  286. Ben Langfeld

    <off-topic>Blather does this badly right now but I will fix it</off-topic>

  287. Lance

    bear: almost, they'd want: roster.add({name: 'Dave Cridland', jid: 'dwd@dave.cridland.net', groups: ['Fools']})

  288. ralphm

    roster is a bad example, as we don't do extensions there

  289. bear

    lance: wouldn't the .().().() pattern fit better?

  290. Lance

    nope, you put all the optional args in a dict. that's the established pattern

  291. Ben Langfeld

    Yep

  292. Ben Langfeld

    Blather and Sleek do this

  293. dwd

    ralpm, Yeah - when didwe decide not to do extensions there?

  294. dwd

    My example was adding the group element manually, of course.

  295. ralphm

    dwd: not sure, but not regretting it :-)

  296. dwd

    Or pretending to - I don't think it could work like that.

  297. bear

    lance: oh, that didn't look like what substack was showing - guess I still don't get NodeJS

  298. dwd

    ralphm, Oh, I quite liked the idea. I implemented it before finding I couldn't find the spec for it anywhere for the commit log.

  299. Lance

    bear: what he did was for stuff that actually needed to pipeline. you don't need to pipeline to create a roster item

  300. Ben Langfeld

    If anyone likes Objective-* examples: https://github.com/ArchipelProject/StropheCappuccino/blob/master/TNStropheRoster.j

  301. dwd

    ralphm, In fact, M-Link tags autogroups (shared groups) using extension elements inside roster items, actually. Works fine.

  302. ralphm

    dwd: oh, ok

  303. ralphm

    I would say that the big majority of XEPs actually have pretty fixed schemas that don't allow any extensibiity

  304. Ben Langfeld

    Seconded

  305. dwd

    ralphm, But I *thought* we had arbitrary elements (and a requirement to persist) in RFC 6120 somewhere. It's nowhere there now, so I guess we removed it entirely at some point.

  306. ralphm

    exceptions are message stanzas and pubsub payloads

  307. ralphm

    and error conditions

  308. Lance

    occasionally we add new xeps that retro-extennd xeps. like rsm, shim, etc

  309. dwd

    ralphm, Sure, but this turns out to be really quite useful. I suppose it needs a disco feature and things. Maybe I should write a XEP.

  310. Lance

    the main thing is that we do namespace versioning, but that's not too hard to deal with

  311. ralphm

    Lance: agreed, but you could possibly wrap those and it is usually orthogonal

  312. Ben Langfeld

    To the general point, I don't see that the wire format is the problem so much as libraries being too general and assuming that end-users will read XEPs and construct stanzas manually.

  313. Ben Langfeld

    Which…they won't

  314. Ben Langfeld

    ever

  315. Ben Langfeld

    socket.io and the like are successful because the API is like 1 method

  316. Lance

    +1 Ben Langfeld

  317. winfried

    +1

  318. waqas

    I've seen people complain about libraries not implementing usertune, so yes :)

  319. Ben Langfeld

    indeed

  320. ralphm

    Ben Langfeld: agreed. I just wanted to put it out there. If you don't need generic mapping and/or stanza construction, then you basically need to define a model that maps the existing xml serialization, whether or not you define an actual json serialization.

  321. waqas

    Why is no one mentioning AMQP, which is the industry standard with multiple implementations, as opposed to 0mq which is basic? :)

  322. Lance

    we have

  323. waqas

    I missed that

  324. ralphm

    AMQP has been mentioned a couple of times

  325. bear

    the folks who wrote 0mq were around when amqp was written

  326. waqas

    The one thing amqp has going for it is reliability guarantees as part of the protocol. I don't think any competing protocols have that.

  327. winfried

    before everybody runs of to the dinner... maybe good to wrap a few things up on BOSH

  328. winfried

    open ends from todays discussion (imho);

  329. winfried

    RIDs: who writes the patch?

  330. winfried

    HTTP/XMPP authentication: is there enough consensus to write a protocol/extention for it?

  331. dwd

    winfried, Yeah, I think there was enough consensus to work on that.

  332. winfried

    then of course the next question: who will pick it up? :-D

  333. dwd

    Yeah, not sure we have an actual volunteer for that. And Lance is back, so we can't volunteer him again. :-)

  334. Lance

    wait

  335. Lance

    again?

  336. winfried

    then on websockets: is there any need for work on the proposal or are there extra things to standardize, or does the draft from Jack and Eric Cestari work for now?

  337. winfried

    (I think it does work right now, but better check it)

  338. dwd

    BTW, the brownies and cookies are nice.

  339. Ben Langfeld

    <3 cookies

  340. winfried

    plz safe some of them for me ;-)

  341. Ben Langfeld

    >> cookie monster

  342. jack

    waqas: zeromq is misnamed. it has no relation to amqp except hte people behind it and the "queue" in th ename

  343. jack

    it violates the liskov substitution principle in both directions :)

  344. Lance

    while considering bosh & websockets, should we do a binding for server sent events? sse feed + post endpoint for sending sounds like it should work rather simply.

  345. waqas

    jack: I know. I initially missed references to amqp and thought only 0mq was being discussed.

  346. jack

    we were mixing it all together :)

  347. jack

    still are :)

  348. ralphm

    m&m: is that still stpeter's office?

  349. winfried

    redecorated

  350. dwd

    m&m, Move everything around on the shelves.

  351. m&m

    nope

  352. m&m

    that's my home … you're seeing a small subset of my LEGO Star Wars collection