{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/comments/41173025","id":41173025,"diff_hunk":"@@ -0,0 +1,432 @@\n+(function (global) {\n+  'use strict';\n+\n+  const modules = new Map();\n+  const moduleCache = new Map();\n+\n+  function getModule(id) {\n+    if (!moduleCache.has(id)) {\n+      moduleCache.set(id, modules.get(id).call(global))\n+    }\n+\n+    return moduleCache.get(id);\n+  }\n+\n+  modules.set('bindings/html/overlay', function () {\n+    const reOverlay = /<|&#?\\w+;/;\n+    const allowed = {\n+      elements: ['a', 'em', 'strong', 'small', 's', 'cite', 'q', 'dfn', 'abbr', 'data', 'time', 'code', 'var', 'samp', 'kbd', 'sub', 'sup', 'i', 'b', 'u', 'mark', 'ruby', 'rt', 'rp', 'bdi', 'bdo', 'span', 'br', 'wbr'],\n+      attributes: {\n+        global: ['title', 'aria-label', 'aria-valuetext', 'aria-moz-hint'],\n+        a: ['download'],\n+        area: ['download', 'alt'],\n+        input: ['alt', 'placeholder'],\n+        menuitem: ['label'],\n+        menu: ['label'],\n+        optgroup: ['label'],\n+        option: ['label'],\n+        track: ['label'],\n+        img: ['alt'],\n+        textarea: ['placeholder'],\n+        th: ['abbr']\n+      }\n+    };\n+\n+    function overlayElement(element, translation) {\n+      const value = translation.value;\n+\n+      if (typeof value === 'string') {\n+        if (!reOverlay.test(value)) {\n+          element.textContent = value;\n+        } else {\n+          const tmpl = element.ownerDocument.createElement('template');\n+          tmpl.innerHTML = value;\n+          overlay(element, tmpl.content);\n+        }\n+      }\n+\n+      for (let key in translation.attrs) {\n+        const attrName = camelCaseToDashed(key);\n+\n+        if (isAttrAllowed({\n+          name: attrName\n+        }, element)) {\n+          element.setAttribute(attrName, translation.attrs[key]);\n+        }\n+      }\n+    }\n+\n+    function overlay(sourceElement, translationElement) {\n+      const result = translationElement.ownerDocument.createDocumentFragment();\n+      let k, attr;\n+      let childElement;\n+\n+      while (childElement = translationElement.childNodes[0]) {\n+        translationElement.removeChild(childElement);\n+\n+        if (childElement.nodeType === childElement.TEXT_NODE) {\n+          result.appendChild(childElement);\n+          continue;\n+        }\n+\n+        const index = getIndexOfType(childElement);\n+        const sourceChild = getNthElementOfType(sourceElement, childElement, index);\n+\n+        if (sourceChild) {\n+          overlay(sourceChild, childElement);\n+          result.appendChild(sourceChild);\n+          continue;\n+        }\n+\n+        if (isElementAllowed(childElement)) {\n+          const sanitizedChild = childElement.ownerDocument.createElement(childElement.nodeName);\n+          overlay(sanitizedChild, childElement);\n+          result.appendChild(sanitizedChild);\n+          continue;\n+        }\n+\n+        result.appendChild(translationElement.ownerDocument.createTextNode(childElement.textContent));\n+      }\n+\n+      sourceElement.textContent = '';\n+      sourceElement.appendChild(result);\n+\n+      if (translationElement.attributes) {\n+        for (k = 0, attr; attr = translationElement.attributes[k]; k++) {\n+          if (isAttrAllowed(attr, sourceElement)) {\n+            sourceElement.setAttribute(attr.name, attr.value);\n+          }\n+        }\n+      }\n+    }\n+\n+    function isElementAllowed(element) {\n+      return allowed.elements.indexOf(element.tagName.toLowerCase()) !== -1;\n+    }\n+\n+    function isAttrAllowed(attr, element) {\n+      const attrName = attr.name.toLowerCase();\n+      const tagName = element.tagName.toLowerCase();\n+\n+      if (allowed.attributes.global.indexOf(attrName) !== -1) {\n+        return true;\n+      }\n+\n+      if (!allowed.attributes[tagName]) {\n+        return false;\n+      }\n+\n+      if (allowed.attributes[tagName].indexOf(attrName) !== -1) {\n+        return true;\n+      }\n+\n+      if (tagName === 'input' && attrName === 'value') {\n+        const type = element.type.toLowerCase();\n+\n+        if (type === 'submit' || type === 'button' || type === 'reset') {\n+          return true;\n+        }\n+      }\n+\n+      return false;\n+    }\n+\n+    function getNthElementOfType(context, element, index) {\n+      let nthOfType = 0;\n+\n+      for (let i = 0, child; child = context.children[i]; i++) {\n+        if (child.nodeType === child.ELEMENT_NODE && child.tagName === element.tagName) {\n+          if (nthOfType === index) {\n+            return child;\n+          }\n+\n+          nthOfType++;\n+        }\n+      }\n+\n+      return null;\n+    }\n+\n+    function getIndexOfType(element) {\n+      let index = 0;\n+      let child;\n+\n+      while (child = element.previousElementSibling) {\n+        if (child.tagName === element.tagName) {\n+          index++;\n+        }\n+      }\n+\n+      return index;\n+    }\n+\n+    function camelCaseToDashed(string) {\n+      if (string === 'ariaValueText') {\n+        return 'aria-valuetext';\n+      }\n+\n+      return string.replace(/[A-Z]/g, function (match) {\n+        return '-' + match.toLowerCase();\n+      }).replace(/^-/, '');\n+    }\n+\n+    return { overlayElement };\n+  });\n+  modules.set('bindings/html/dom', function () {\n+    const { overlayElement } = getModule('bindings/html/overlay');\n+    const reHtml = /[&<>]/g;\n+    const htmlEntities = {\n+      '&': '&amp;',\n+      '<': '&lt;',\n+      '>': '&gt;'\n+    };\n+\n+    function getResourceLinks(head) {\n+      return Array.prototype.map.call(head.querySelectorAll('link[rel=\"localization\"]'), el => decodeURI(el.getAttribute('href')));\n+    }\n+\n+    function setAttributes(element, id, args) {\n+      element.setAttribute('data-l10n-id', id);\n+\n+      if (args) {\n+        element.setAttribute('data-l10n-args', JSON.stringify(args));\n+      }\n+    }\n+\n+    function getAttributes(element) {\n+      return {\n+        id: element.getAttribute('data-l10n-id'),\n+        args: JSON.parse(element.getAttribute('data-l10n-args'))\n+      };\n+    }\n+\n+    function getTranslatables(element) {\n+      const nodes = Array.from(element.querySelectorAll('[data-l10n-id]'));\n+\n+      if (typeof element.hasAttribute === 'function' && element.hasAttribute('data-l10n-id')) {\n+        nodes.push(element);\n+      }\n+\n+      return nodes;\n+    }\n+\n+    function translateMutations(view, langs, mutations) {\n+      const targets = new Set();\n+\n+      for (let mutation of mutations) {\n+        switch (mutation.type) {\n+          case 'attributes':\n+            targets.add(mutation.target);\n+            break;\n+\n+          case 'childList':\n+            for (let addedNode of mutation.addedNodes) {\n+              if (addedNode.nodeType === addedNode.ELEMENT_NODE) {\n+                if (addedNode.childElementCount) {\n+                  getTranslatables(addedNode).forEach(targets.add.bind(targets));\n+                } else {\n+                  if (addedNode.hasAttribute('data-l10n-id')) {\n+                    targets.add(addedNode);\n+                  }\n+                }\n+              }\n+            }\n+\n+            break;\n+        }\n+      }\n+\n+      if (targets.size === 0) {\n+        return;\n+      }\n+\n+      translateElements(view, langs, Array.from(targets));\n+    }\n+\n+    function translateFragment(view, langs, frag) {\n+      return translateElements(view, langs, getTranslatables(frag));\n+    }\n+\n+    function getElementsTranslation(view, langs, elems) {\n+      const keys = elems.map(elem => {\n+        const id = elem.getAttribute('data-l10n-id');\n+        const args = elem.getAttribute('data-l10n-args');\n+        return args ? [id, JSON.parse(args.replace(reHtml, match => htmlEntities[match]))] : id;\n+      });\n+      return view._resolveEntities(langs, keys);\n+    }\n+\n+    function translateElements(view, langs, elements) {\n+      return getElementsTranslation(view, langs, elements).then(translations => applyTranslations(view, elements, translations));\n+    }\n+\n+    function applyTranslations(view, elems, translations) {\n+      view._disconnect();\n+\n+      for (let i = 0; i < elems.length; i++) {\n+        overlayElement(elems[i], translations[i]);\n+      }\n+\n+      view._observe();\n+    }\n+\n+    return { getResourceLinks, setAttributes, getAttributes, translateMutations, translateFragment };\n+  });\n+  modules.set('bindings/html/shims', function () {\n+    if (typeof NodeList === 'function' && !NodeList.prototype[Symbol.iterator]) {\n+      NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];\n+    }\n+\n+    function documentReady() {\n+      if (document.readyState !== 'loading') {\n+        return Promise.resolve();\n+      }\n+\n+      return new Promise(resolve => {\n+        document.addEventListener('readystatechange', function onrsc() {\n+          document.removeEventListener('readystatechange', onrsc);\n+          resolve();\n+        });\n+      });\n+    }\n+\n+    return { documentReady };\n+  });\n+  modules.set('bindings/html/view', function () {\n+    const { documentReady } = getModule('bindings/html/shims');\n+    const { setAttributes, getAttributes, translateFragment, translateMutations, getResourceLinks } = getModule('bindings/html/dom');\n+    const observerConfig = {\n+      attributes: true,\n+      characterData: false,\n+      childList: true,\n+      subtree: true,\n+      attributeFilter: ['data-l10n-id', 'data-l10n-args']\n+    };\n+    const readiness = new WeakMap();\n+\n+    class View {\n+      constructor(client, doc) {\n+        this._doc = doc;\n+        this.pseudo = {\n+          'qps-ploc': createPseudo(this, 'qps-ploc'),\n+          'qps-plocm': createPseudo(this, 'qps-plocm')\n+        };\n+        this._interactive = documentReady().then(() => init(this, client));\n+        const observer = new MutationObserver(onMutations.bind(this));\n+\n+        this._observe = () => observer.observe(doc, observerConfig);\n+\n+        this._disconnect = () => observer.disconnect();\n+\n+        const translateView = langs => translateDocument(this, langs);\n+\n+        client.on('translateDocument', translateView);\n+        this.ready = this.resolvedLanguages().then(translateView);\n+      }\n+      resolvedLanguages() {\n+        return this._interactive.then(client => client.method('resolvedLanguages'));\n+      }\n+      requestLanguages(langs) {\n+        return this._interactive.then(client => client.method('requestLanguages', langs));\n+      }\n+      _resolveEntities(langs, keys) {\n+        return this._interactive.then(client => client.method('resolveEntities', client.id, langs, keys));\n+      }\n+      formatValue(id, args) {\n+        return this._interactive.then(client => client.method('formatValues', client.id, [[id, args]])).then(values => values[0]);\n+      }\n+      formatValues(...keys) {\n+        return this._interactive.then(client => client.method('formatValues', client.id, keys));\n+      }\n+      translateFragment(frag) {\n+        return this.resolvedLanguages().then(langs => translateFragment(this, langs, frag));\n+      }\n+    }\n+\n+    View.prototype.setAttributes = setAttributes;\n+    View.prototype.getAttributes = getAttributes;\n+\n+    function createPseudo(view, code) {\n+      return {\n+        getName: () => view._interactive.then(client => client.method('getName', code)),\n+        processString: str => view._interactive.then(client => client.method('processString', code, str))\n+      };\n+    }\n+\n+    function init(view, client) {\n+      view._observe();\n+\n+      return client.method('registerView', client.id, getResourceLinks(view._doc.head)).then(() => client);\n+    }\n+\n+    function onMutations(mutations) {\n+      return this.resolvedLanguages().then(langs => translateMutations(this, langs, mutations));\n+    }\n+\n+    function translateDocument(view, langs) {\n+      const html = view._doc.documentElement;\n+\n+      if (readiness.has(html)) {\n+        return translateFragment(view, langs, html).then(() => setDOMAttrsAndEmit(html, langs)).then(() => langs.map(takeCode));\n+      }\n+\n+      const translated = langs[0].code === html.getAttribute('lang') ? Promise.resolve() : translateFragment(view, langs, html).then(() => setDOMAttrs(html, langs));\n+      return translated.then(() => readiness.set(html, true)).then(() => langs.map(takeCode));\n+    }\n+\n+    function setDOMAttrsAndEmit(html, langs) {\n+      setDOMAttrs(html, langs);\n+      html.parentNode.dispatchEvent(new CustomEvent('DOMRetranslated', {\n+        bubbles: false,\n+        cancelable: false,\n+        detail: {\n+          languages: langs.map(takeCode)\n+        }\n+      }));\n+    }\n+\n+    function setDOMAttrs(html, langs) {\n+      html.setAttribute('lang', langs[0].code);\n+      html.setAttribute('dir', langs[0].dir);\n+    }\n+\n+    function takeCode(lang) {\n+      return lang.code;\n+    }\n+\n+    return { View, translateDocument };\n+  });\n+  modules.set('runtime/bridge/bridge', function () {\n+    const Client = bridge.client;\n+    const Service = bridge.service;\n+    const channel = new BroadcastChannel('l20n-channel');\n+\n+    function broadcast(type, data) {\n+      return this.service.broadcast(type, data);\n+    }\n+\n+    return { Client, Service, channel, broadcast };\n+  });\n+  modules.set('runtime/bridge/index-client', function () {\n+    const { Client, channel } = getModule('runtime/bridge/bridge');\n+    const { View } = getModule('bindings/html/view');\n+\n+    const client = new Client('l20n', channel);","path":"shared/js/l20n/client.js","position":414,"original_position":414,"commit_id":"0d0a413086ff764973e5fd01a0ba90d8cd5e99a4","original_commit_id":"0d0a413086ff764973e5fd01a0ba90d8cd5e99a4","user":{"login":"justindarc","id":207595,"avatar_url":"https://avatars.githubusercontent.com/u/207595?v=3","gravatar_id":"","url":"https://api.github.com/users/justindarc","html_url":"https://github.com/justindarc","followers_url":"https://api.github.com/users/justindarc/followers","following_url":"https://api.github.com/users/justindarc/following{/other_user}","gists_url":"https://api.github.com/users/justindarc/gists{/gist_id}","starred_url":"https://api.github.com/users/justindarc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justindarc/subscriptions","organizations_url":"https://api.github.com/users/justindarc/orgs","repos_url":"https://api.github.com/users/justindarc/repos","events_url":"https://api.github.com/users/justindarc/events{/privacy}","received_events_url":"https://api.github.com/users/justindarc/received_events","type":"User","site_admin":false},"body":"```\r\nconst client = new Client({\r\n  service: 'l20n',\r\n  endpoint: channel,\r\n  timeout: false\r\n});\r\n```","created_at":"2015-10-05T17:38:01Z","updated_at":"2015-10-05T17:38:01Z","html_url":"https://github.com/mozilla-b2g/gaia/pull/32222#discussion_r41173025","pull_request_url":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/32222","_links":{"self":{"href":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/comments/41173025"},"html":{"href":"https://github.com/mozilla-b2g/gaia/pull/32222#discussion_r41173025"},"pull_request":{"href":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/32222"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/32222","id":46705553,"html_url":"https://github.com/mozilla-b2g/gaia/pull/32222","diff_url":"https://github.com/mozilla-b2g/gaia/pull/32222.diff","patch_url":"https://github.com/mozilla-b2g/gaia/pull/32222.patch","issue_url":"https://api.github.com/repos/mozilla-b2g/gaia/issues/32222","number":32222,"state":"open","locked":false,"title":"Bug 1210720 - Migrate Music to l20n/service & l20n/client","user":{"login":"stasm","id":265818,"avatar_url":"https://avatars.githubusercontent.com/u/265818?v=3","gravatar_id":"","url":"https://api.github.com/users/stasm","html_url":"https://github.com/stasm","followers_url":"https://api.github.com/users/stasm/followers","following_url":"https://api.github.com/users/stasm/following{/other_user}","gists_url":"https://api.github.com/users/stasm/gists{/gist_id}","starred_url":"https://api.github.com/users/stasm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stasm/subscriptions","organizations_url":"https://api.github.com/users/stasm/orgs","repos_url":"https://api.github.com/users/stasm/repos","events_url":"https://api.github.com/users/stasm/events{/privacy}","received_events_url":"https://api.github.com/users/stasm/received_events","type":"User","site_admin":false},"body":"https://bugzilla.mozilla.org/show_bug.cgi?id=1210720","created_at":"2015-10-03T13:25:43Z","updated_at":"2015-10-05T17:38:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e97cf0f8ac49fbd5c7cf084542e8aafaca84b60d","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/32222/commits","review_comments_url":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/32222/comments","review_comment_url":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla-b2g/gaia/issues/32222/comments","statuses_url":"https://api.github.com/repos/mozilla-b2g/gaia/statuses/0d0a413086ff764973e5fd01a0ba90d8cd5e99a4","head":{"label":"stasm:1210720-music-l20n-bridge","ref":"1210720-music-l20n-bridge","sha":"0d0a413086ff764973e5fd01a0ba90d8cd5e99a4","user":{"login":"stasm","id":265818,"avatar_url":"https://avatars.githubusercontent.com/u/265818?v=3","gravatar_id":"","url":"https://api.github.com/users/stasm","html_url":"https://github.com/stasm","followers_url":"https://api.github.com/users/stasm/followers","following_url":"https://api.github.com/users/stasm/following{/other_user}","gists_url":"https://api.github.com/users/stasm/gists{/gist_id}","starred_url":"https://api.github.com/users/stasm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stasm/subscriptions","organizations_url":"https://api.github.com/users/stasm/orgs","repos_url":"https://api.github.com/users/stasm/repos","events_url":"https://api.github.com/users/stasm/events{/privacy}","received_events_url":"https://api.github.com/users/stasm/received_events","type":"User","site_admin":false},"repo":{"id":5248982,"name":"gaia","full_name":"stasm/gaia","owner":{"login":"stasm","id":265818,"avatar_url":"https://avatars.githubusercontent.com/u/265818?v=3","gravatar_id":"","url":"https://api.github.com/users/stasm","html_url":"https://github.com/stasm","followers_url":"https://api.github.com/users/stasm/followers","following_url":"https://api.github.com/users/stasm/following{/other_user}","gists_url":"https://api.github.com/users/stasm/gists{/gist_id}","starred_url":"https://api.github.com/users/stasm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stasm/subscriptions","organizations_url":"https://api.github.com/users/stasm/orgs","repos_url":"https://api.github.com/users/stasm/repos","events_url":"https://api.github.com/users/stasm/events{/privacy}","received_events_url":"https://api.github.com/users/stasm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/stasm/gaia","description":"Gaia is a HTML5-based Phone UI for the Boot 2 Gecko Project","fork":true,"url":"https://api.github.com/repos/stasm/gaia","forks_url":"https://api.github.com/repos/stasm/gaia/forks","keys_url":"https://api.github.com/repos/stasm/gaia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stasm/gaia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stasm/gaia/teams","hooks_url":"https://api.github.com/repos/stasm/gaia/hooks","issue_events_url":"https://api.github.com/repos/stasm/gaia/issues/events{/number}","events_url":"https://api.github.com/repos/stasm/gaia/events","assignees_url":"https://api.github.com/repos/stasm/gaia/assignees{/user}","branches_url":"https://api.github.com/repos/stasm/gaia/branches{/branch}","tags_url":"https://api.github.com/repos/stasm/gaia/tags","blobs_url":"https://api.github.com/repos/stasm/gaia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stasm/gaia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stasm/gaia/git/refs{/sha}","trees_url":"https://api.github.com/repos/stasm/gaia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stasm/gaia/statuses/{sha}","languages_url":"https://api.github.com/repos/stasm/gaia/languages","stargazers_url":"https://api.github.com/repos/stasm/gaia/stargazers","contributors_url":"https://api.github.com/repos/stasm/gaia/contributors","subscribers_url":"https://api.github.com/repos/stasm/gaia/subscribers","subscription_url":"https://api.github.com/repos/stasm/gaia/subscription","commits_url":"https://api.github.com/repos/stasm/gaia/commits{/sha}","git_commits_url":"https://api.github.com/repos/stasm/gaia/git/commits{/sha}","comments_url":"https://api.github.com/repos/stasm/gaia/comments{/number}","issue_comment_url":"https://api.github.com/repos/stasm/gaia/issues/comments{/number}","contents_url":"https://api.github.com/repos/stasm/gaia/contents/{+path}","compare_url":"https://api.github.com/repos/stasm/gaia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stasm/gaia/merges","archive_url":"https://api.github.com/repos/stasm/gaia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stasm/gaia/downloads","issues_url":"https://api.github.com/repos/stasm/gaia/issues{/number}","pulls_url":"https://api.github.com/repos/stasm/gaia/pulls{/number}","milestones_url":"https://api.github.com/repos/stasm/gaia/milestones{/number}","notifications_url":"https://api.github.com/repos/stasm/gaia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stasm/gaia/labels{/name}","releases_url":"https://api.github.com/repos/stasm/gaia/releases{/id}","created_at":"2012-07-31T17:17:10Z","updated_at":"2015-01-28T13:35:45Z","pushed_at":"2015-10-03T13:24:05Z","git_url":"git://github.com/stasm/gaia.git","ssh_url":"git@github.com:stasm/gaia.git","clone_url":"https://github.com/stasm/gaia.git","svn_url":"https://github.com/stasm/gaia","homepage":"https://wiki.mozilla.org/B2G","size":919233,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mozilla-b2g:master","ref":"master","sha":"de66a9ce917bcf606216ac581c3b98bda8750545","user":{"login":"mozilla-b2g","id":1261292,"avatar_url":"https://avatars.githubusercontent.com/u/1261292?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-b2g","html_url":"https://github.com/mozilla-b2g","followers_url":"https://api.github.com/users/mozilla-b2g/followers","following_url":"https://api.github.com/users/mozilla-b2g/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-b2g/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-b2g/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-b2g/subscriptions","organizations_url":"https://api.github.com/users/mozilla-b2g/orgs","repos_url":"https://api.github.com/users/mozilla-b2g/repos","events_url":"https://api.github.com/users/mozilla-b2g/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-b2g/received_events","type":"Organization","site_admin":false},"repo":{"id":2317369,"name":"gaia","full_name":"mozilla-b2g/gaia","owner":{"login":"mozilla-b2g","id":1261292,"avatar_url":"https://avatars.githubusercontent.com/u/1261292?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla-b2g","html_url":"https://github.com/mozilla-b2g","followers_url":"https://api.github.com/users/mozilla-b2g/followers","following_url":"https://api.github.com/users/mozilla-b2g/following{/other_user}","gists_url":"https://api.github.com/users/mozilla-b2g/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla-b2g/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla-b2g/subscriptions","organizations_url":"https://api.github.com/users/mozilla-b2g/orgs","repos_url":"https://api.github.com/users/mozilla-b2g/repos","events_url":"https://api.github.com/users/mozilla-b2g/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla-b2g/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla-b2g/gaia","description":"Gaia is a HTML5-based Phone UI for the Boot 2 Gecko Project. NOTE: For details of what branches are used for what releases, see","fork":false,"url":"https://api.github.com/repos/mozilla-b2g/gaia","forks_url":"https://api.github.com/repos/mozilla-b2g/gaia/forks","keys_url":"https://api.github.com/repos/mozilla-b2g/gaia/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla-b2g/gaia/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla-b2g/gaia/teams","hooks_url":"https://api.github.com/repos/mozilla-b2g/gaia/hooks","issue_events_url":"https://api.github.com/repos/mozilla-b2g/gaia/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla-b2g/gaia/events","assignees_url":"https://api.github.com/repos/mozilla-b2g/gaia/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla-b2g/gaia/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla-b2g/gaia/tags","blobs_url":"https://api.github.com/repos/mozilla-b2g/gaia/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla-b2g/gaia/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla-b2g/gaia/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla-b2g/gaia/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla-b2g/gaia/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla-b2g/gaia/languages","stargazers_url":"https://api.github.com/repos/mozilla-b2g/gaia/stargazers","contributors_url":"https://api.github.com/repos/mozilla-b2g/gaia/contributors","subscribers_url":"https://api.github.com/repos/mozilla-b2g/gaia/subscribers","subscription_url":"https://api.github.com/repos/mozilla-b2g/gaia/subscription","commits_url":"https://api.github.com/repos/mozilla-b2g/gaia/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla-b2g/gaia/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla-b2g/gaia/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla-b2g/gaia/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla-b2g/gaia/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla-b2g/gaia/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla-b2g/gaia/merges","archive_url":"https://api.github.com/repos/mozilla-b2g/gaia/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla-b2g/gaia/downloads","issues_url":"https://api.github.com/repos/mozilla-b2g/gaia/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla-b2g/gaia/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla-b2g/gaia/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla-b2g/gaia/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla-b2g/gaia/labels{/name}","releases_url":"https://api.github.com/repos/mozilla-b2g/gaia/releases{/id}","created_at":"2011-09-03T01:38:46Z","updated_at":"2015-10-05T13:51:39Z","pushed_at":"2015-10-05T17:37:00Z","git_url":"git://github.com/mozilla-b2g/gaia.git","ssh_url":"git@github.com:mozilla-b2g/gaia.git","clone_url":"https://github.com/mozilla-b2g/gaia.git","svn_url":"https://github.com/mozilla-b2g/gaia","homepage":"https://wiki.mozilla.org/B2G","size":1639800,"stargazers_count":1989,"watchers_count":1989,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":2454,"mirror_url":null,"open_issues_count":1214,"forks":2454,"open_issues":1214,"watchers":1989,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/32222"},"html":{"href":"https://github.com/mozilla-b2g/gaia/pull/32222"},"issue":{"href":"https://api.github.com/repos/mozilla-b2g/gaia/issues/32222"},"comments":{"href":"https://api.github.com/repos/mozilla-b2g/gaia/issues/32222/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/32222/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla-b2g/gaia/pulls/32222/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla-b2g/gaia/statuses/0d0a413086ff764973e5fd01a0ba90d8cd5e99a4"}}}}