You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by sh...@apache.org on 2015/12/03 03:33:39 UTC

[07/51] [partial] ios commit: CB-9827 Implement and expose PlatformApi for iOS

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/unorm/package.json
----------------------------------------------------------------------
diff --git a/bin/node_modules/unorm/package.json b/bin/node_modules/unorm/package.json
new file mode 100644
index 0000000..a39446a
--- /dev/null
+++ b/bin/node_modules/unorm/package.json
@@ -0,0 +1,69 @@
+{
+  "name": "unorm",
+  "version": "1.4.1",
+  "description": "JavaScript Unicode 8.0 Normalization - NFC, NFD, NFKC, NFKD. Read <http://unicode.org/reports/tr15/> UAX #15 Unicode Normalization Forms.",
+  "author": {
+    "name": "Bjarke Walling",
+    "email": "bwp@bwp.dk"
+  },
+  "license": "MIT or GPL-2.0",
+  "contributors": [
+    {
+      "name": "Bjarke Walling",
+      "email": "bwp@bwp.dk"
+    },
+    {
+      "name": "Oleg Grenrus",
+      "email": "oleg.grenrus@iki.fi"
+    },
+    {
+      "name": "Matsuza",
+      "email": "matsuza@gmail.com"
+    }
+  ],
+  "repository": {
+    "type": "git",
+    "url": "http://github.com/walling/unorm.git"
+  },
+  "main": "./lib/unorm.js",
+  "engines": {
+    "node": ">= 0.4.0"
+  },
+  "scripts": {
+    "test": "grunt test"
+  },
+  "devDependencies": {
+    "benchmark": "~1.0.0",
+    "unorm": "1.4.1",
+    "grunt-contrib-jshint": "~0.8.0",
+    "grunt-contrib-watch": "~0.5.0",
+    "grunt-simple-mocha": "~0.4.0",
+    "grunt": "~0.4.1"
+  },
+  "gitHead": "e802d0d7844cf74b03742bce1147a82ace218396",
+  "bugs": {
+    "url": "https://github.com/walling/unorm/issues"
+  },
+  "homepage": "https://github.com/walling/unorm",
+  "_id": "unorm@1.4.1",
+  "_shasum": "364200d5f13646ca8bcd44490271335614792300",
+  "_from": "unorm@",
+  "_npmVersion": "1.4.28",
+  "_npmUser": {
+    "name": "walling",
+    "email": "bwp@bwp.dk"
+  },
+  "maintainers": [
+    {
+      "name": "walling",
+      "email": "bwp@bwp.dk"
+    }
+  ],
+  "dist": {
+    "shasum": "364200d5f13646ca8bcd44490271335614792300",
+    "tarball": "http://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz",
+  "readme": "ERROR: No README data found!"
+}

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/.npmignore
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/.npmignore b/bin/node_modules/xcode/.npmignore
new file mode 100644
index 0000000..65e3ba2
--- /dev/null
+++ b/bin/node_modules/xcode/.npmignore
@@ -0,0 +1 @@
+test/

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/AUTHORS
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/AUTHORS b/bin/node_modules/xcode/AUTHORS
new file mode 100644
index 0000000..dcef29f
--- /dev/null
+++ b/bin/node_modules/xcode/AUTHORS
@@ -0,0 +1,6 @@
+Andrew Lunny (@alunny)
+Anis Kadri (@imhotep)
+Mike Reinstein (@mreinstein)
+Filip Maj (@filmaj)
+Brett Rudd (@goya)
+Bob Easterday (@bobeast)

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/LICENSE
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/LICENSE b/bin/node_modules/xcode/LICENSE
new file mode 100644
index 0000000..45f03a3
--- /dev/null
+++ b/bin/node_modules/xcode/LICENSE
@@ -0,0 +1,14 @@
+   Copyright 2012 Andrew Lunny, Adobe Systems
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/Makefile
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/Makefile b/bin/node_modules/xcode/Makefile
new file mode 100644
index 0000000..f838310
--- /dev/null
+++ b/bin/node_modules/xcode/Makefile
@@ -0,0 +1,5 @@
+tests:
+	nodeunit test/* test/parser/*
+
+parser:
+	pegjs lib/parser/pbxproj.pegjs

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/README.md
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/README.md b/bin/node_modules/xcode/README.md
new file mode 100644
index 0000000..fe902ad
--- /dev/null
+++ b/bin/node_modules/xcode/README.md
@@ -0,0 +1,42 @@
+# node-xcode
+
+> parser/toolkit for xcodeproj project files
+
+Allows you to edit xcodeproject files and write them back out.
+
+## Example
+
+    // API is a bit wonky right now
+    var xcode = require('xcode'),
+        fs = require('fs'),
+        projectPath = 'myproject.xcodeproj/project.pbxproj',
+        myProj = xcode.project(projectPath);
+
+    // parsing is async, in a different process
+    myProj.parse(function (err) {
+        myProj.addHeaderFile('foo.h');
+        myProj.addSourceFile('foo.m');
+        myProj.addFramework('FooKit.framework');
+        
+        fs.writeFileSync(projectPath, myProj.writeSync());
+        console.log('new project written');
+    });
+
+## Working on the parser
+
+If there's a problem parsing, you will want to edit the grammar under
+`lib/parser/pbxproj.pegjs`. You can test it online with the PEGjs online thingy
+at http://pegjs.majda.cz/online - I have had some mixed results though.
+
+Tests under the `test/parser` directory will compile the parser from the
+grammar. Other tests will use the prebuilt parser (`lib/parser/pbxproj.js`).
+
+To rebuild the parser js file after editing the grammar, run:
+
+    ./node_modules/.bin/pegjs lib/parser/pbxproj.pegjs
+
+(easier if `./node_modules/.bin` is in your path)
+
+## License
+
+MIT

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/index.js
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/index.js b/bin/node_modules/xcode/index.js
new file mode 100644
index 0000000..c593bb8
--- /dev/null
+++ b/bin/node_modules/xcode/index.js
@@ -0,0 +1 @@
+exports.project = require('./lib/pbxProject')

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/lib/parseJob.js
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/lib/parseJob.js b/bin/node_modules/xcode/lib/parseJob.js
new file mode 100644
index 0000000..9d6bffa
--- /dev/null
+++ b/bin/node_modules/xcode/lib/parseJob.js
@@ -0,0 +1,15 @@
+// parsing is slow and blocking right now
+// so we do it in a separate process
+var fs = require('fs'),
+    parser = require('./parser/pbxproj'),
+    path = process.argv[2],
+    fileContents, obj;
+
+try {
+    fileContents = fs.readFileSync(path, 'utf-8');
+    obj = parser.parse(fileContents);
+    process.send(obj);
+} catch (e) {
+    process.send(e);
+    process.exitCode = 1;
+}

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/lib/parser/pbxproj.js
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/lib/parser/pbxproj.js b/bin/node_modules/xcode/lib/parser/pbxproj.js
new file mode 100644
index 0000000..f574479
--- /dev/null
+++ b/bin/node_modules/xcode/lib/parser/pbxproj.js
@@ -0,0 +1,1843 @@
+module.exports = (function() {
+  /*
+   * Generated by PEG.js 0.8.0.
+   *
+   * http://pegjs.majda.cz/
+   */
+
+  function peg$subclass(child, parent) {
+    function ctor() { this.constructor = child; }
+    ctor.prototype = parent.prototype;
+    child.prototype = new ctor();
+  }
+
+  function SyntaxError(message, expected, found, offset, line, column) {
+    this.message  = message;
+    this.expected = expected;
+    this.found    = found;
+    this.offset   = offset;
+    this.line     = line;
+    this.column   = column;
+
+    this.name     = "SyntaxError";
+  }
+
+  peg$subclass(SyntaxError, Error);
+
+  function parse(input) {
+    var options = arguments.length > 1 ? arguments[1] : {},
+
+        peg$FAILED = {},
+
+        peg$startRuleFunctions = { Project: peg$parseProject },
+        peg$startRuleFunction  = peg$parseProject,
+
+        peg$c0 = peg$FAILED,
+        peg$c1 = null,
+        peg$c2 = function(headComment, obj) {
+                var proj = Object.create(null)
+                proj.project = obj
+
+                if (headComment) {
+                    proj.headComment = headComment
+                }
+
+                return proj;
+            },
+        peg$c3 = "{",
+        peg$c4 = { type: "literal", value: "{", description: "\"{\"" },
+        peg$c5 = "}",
+        peg$c6 = { type: "literal", value: "}", description: "\"}\"" },
+        peg$c7 = function(obj) { return obj },
+        peg$c8 = function() { return Object.create(null) },
+        peg$c9 = [],
+        peg$c10 = function(head, tail) { 
+              if (tail) return merge(head,tail)
+              else return head
+            },
+        peg$c11 = function(head, tail) {
+              if (tail) return merge(head,tail)
+              else return head
+            },
+        peg$c12 = "=",
+        peg$c13 = { type: "literal", value: "=", description: "\"=\"" },
+        peg$c14 = ";",
+        peg$c15 = { type: "literal", value: ";", description: "\";\"" },
+        peg$c16 = function(id, val) { 
+              var result = Object.create(null);
+              result[id] = val
+              return result
+            },
+        peg$c17 = function(commentedId, val) {
+                var result = Object.create(null),
+                    commentKey = commentedId.id + '_comment';
+
+                result[commentedId.id] = val;
+                result[commentKey] = commentedId[commentKey];
+                return result;
+
+            },
+        peg$c18 = function(id, commentedVal) {
+                var result = Object.create(null);
+                result[id] = commentedVal.value;
+                result[id + "_comment"] = commentedVal.comment;
+                return result;
+            },
+        peg$c19 = function(id, comment) {
+                var result = Object.create(null);
+                result.id = id;
+                result[id + "_comment"] = comment.trim();
+                return result
+            },
+        peg$c20 = function(literal, comment) {
+                var result = Object.create(null)
+                result.comment = comment.trim();
+                result.value = literal.trim();
+                return result;
+            },
+        peg$c21 = /^[^*]/,
+        peg$c22 = { type: "class", value: "[^*]", description: "[^*]" },
+        peg$c23 = function(body) { return body.join('') },
+        peg$c24 = "/*",
+        peg$c25 = { type: "literal", value: "/*", description: "\"/*\"" },
+        peg$c26 = "*/",
+        peg$c27 = { type: "literal", value: "*/", description: "\"*/\"" },
+        peg$c28 = function(begin, fields) {
+                var section = Object.create(null);
+                section[begin.name] = fields
+
+                return section
+            },
+        peg$c29 = "/* Begin ",
+        peg$c30 = { type: "literal", value: "/* Begin ", description: "\"/* Begin \"" },
+        peg$c31 = " section */",
+        peg$c32 = { type: "literal", value: " section */", description: "\" section */\"" },
+        peg$c33 = function(sectionName) { return { name: sectionName } },
+        peg$c34 = "/* End ",
+        peg$c35 = { type: "literal", value: "/* End ", description: "\"/* End \"" },
+        peg$c36 = "(",
+        peg$c37 = { type: "literal", value: "(", description: "\"(\"" },
+        peg$c38 = ")",
+        peg$c39 = { type: "literal", value: ")", description: "\")\"" },
+        peg$c40 = function(arr) { return arr },
+        peg$c41 = function() { return [] },
+        peg$c42 = function(head, tail) {
+                if (tail) {
+                    tail.unshift(head);
+                    return tail;
+                } else {
+                    return [head];
+                }
+            },
+        peg$c43 = function(val) { return val },
+        peg$c44 = function(val, comment) {
+                var result = Object.create(null);
+                result.value = val.trim();
+                result.comment = comment.trim();
+                return result;
+            },
+        peg$c45 = ",",
+        peg$c46 = { type: "literal", value: ",", description: "\",\"" },
+        peg$c47 = void 0,
+        peg$c48 = /^[A-Za-z0-9_.]/,
+        peg$c49 = { type: "class", value: "[A-Za-z0-9_.]", description: "[A-Za-z0-9_.]" },
+        peg$c50 = function(id) { return id.join('') },
+        peg$c51 = ".",
+        peg$c52 = { type: "literal", value: ".", description: "\".\"" },
+        peg$c53 = function(decimal) { 
+                // store decimals as strings
+                // as JS doesn't differentiate bw strings and numbers
+                return decimal.join('')
+            },
+        peg$c54 = function(number) { return parseInt(number.join(''), 10) },
+        peg$c55 = function(str) { return '"' + str + '"' },
+        peg$c56 = function(str) { return str.join('') },
+        peg$c57 = { type: "any", description: "any character" },
+        peg$c58 = function(char) { return char },
+        peg$c59 = "\\",
+        peg$c60 = { type: "literal", value: "\\", description: "\"\\\\\"" },
+        peg$c61 = function() { return '\\"' },
+        peg$c62 = function(literal) { return literal.join('') },
+        peg$c63 = /^[^;,\n]/,
+        peg$c64 = { type: "class", value: "[^;,\\n]", description: "[^;,\\n]" },
+        peg$c65 = "//",
+        peg$c66 = { type: "literal", value: "//", description: "\"//\"" },
+        peg$c67 = function(contents) { return contents },
+        peg$c68 = function(contents) { return contents.join('') },
+        peg$c69 = /^[0-9]/,
+        peg$c70 = { type: "class", value: "[0-9]", description: "[0-9]" },
+        peg$c71 = /^[A-Za-z]/,
+        peg$c72 = { type: "class", value: "[A-Za-z]", description: "[A-Za-z]" },
+        peg$c73 = "\"",
+        peg$c74 = { type: "literal", value: "\"", description: "\"\\\"\"" },
+        peg$c75 = { type: "other", description: "whitespace" },
+        peg$c76 = /^[\t ]/,
+        peg$c77 = { type: "class", value: "[\\t ]", description: "[\\t ]" },
+        peg$c78 = /^[\n\r]/,
+        peg$c79 = { type: "class", value: "[\\n\\r]", description: "[\\n\\r]" },
+
+        peg$currPos          = 0,
+        peg$reportedPos      = 0,
+        peg$cachedPos        = 0,
+        peg$cachedPosDetails = { line: 1, column: 1, seenCR: false },
+        peg$maxFailPos       = 0,
+        peg$maxFailExpected  = [],
+        peg$silentFails      = 0,
+
+        peg$result;
+
+    if ("startRule" in options) {
+      if (!(options.startRule in peg$startRuleFunctions)) {
+        throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
+      }
+
+      peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
+    }
+
+    function text() {
+      return input.substring(peg$reportedPos, peg$currPos);
+    }
+
+    function offset() {
+      return peg$reportedPos;
+    }
+
+    function line() {
+      return peg$computePosDetails(peg$reportedPos).line;
+    }
+
+    function column() {
+      return peg$computePosDetails(peg$reportedPos).column;
+    }
+
+    function expected(description) {
+      throw peg$buildException(
+        null,
+        [{ type: "other", description: description }],
+        peg$reportedPos
+      );
+    }
+
+    function error(message) {
+      throw peg$buildException(message, null, peg$reportedPos);
+    }
+
+    function peg$computePosDetails(pos) {
+      function advance(details, startPos, endPos) {
+        var p, ch;
+
+        for (p = startPos; p < endPos; p++) {
+          ch = input.charAt(p);
+          if (ch === "\n") {
+            if (!details.seenCR) { details.line++; }
+            details.column = 1;
+            details.seenCR = false;
+          } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
+            details.line++;
+            details.column = 1;
+            details.seenCR = true;
+          } else {
+            details.column++;
+            details.seenCR = false;
+          }
+        }
+      }
+
+      if (peg$cachedPos !== pos) {
+        if (peg$cachedPos > pos) {
+          peg$cachedPos = 0;
+          peg$cachedPosDetails = { line: 1, column: 1, seenCR: false };
+        }
+        advance(peg$cachedPosDetails, peg$cachedPos, pos);
+        peg$cachedPos = pos;
+      }
+
+      return peg$cachedPosDetails;
+    }
+
+    function peg$fail(expected) {
+      if (peg$currPos < peg$maxFailPos) { return; }
+
+      if (peg$currPos > peg$maxFailPos) {
+        peg$maxFailPos = peg$currPos;
+        peg$maxFailExpected = [];
+      }
+
+      peg$maxFailExpected.push(expected);
+    }
+
+    function peg$buildException(message, expected, pos) {
+      function cleanupExpected(expected) {
+        var i = 1;
+
+        expected.sort(function(a, b) {
+          if (a.description < b.description) {
+            return -1;
+          } else if (a.description > b.description) {
+            return 1;
+          } else {
+            return 0;
+          }
+        });
+
+        while (i < expected.length) {
+          if (expected[i - 1] === expected[i]) {
+            expected.splice(i, 1);
+          } else {
+            i++;
+          }
+        }
+      }
+
+      function buildMessage(expected, found) {
+        function stringEscape(s) {
+          function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }
+
+          return s
+            .replace(/\\/g,   '\\\\')
+            .replace(/"/g,    '\\"')
+            .replace(/\x08/g, '\\b')
+            .replace(/\t/g,   '\\t')
+            .replace(/\n/g,   '\\n')
+            .replace(/\f/g,   '\\f')
+            .replace(/\r/g,   '\\r')
+            .replace(/[\x00-\x07\x0B\x0E\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
+            .replace(/[\x10-\x1F\x80-\xFF]/g,    function(ch) { return '\\x'  + hex(ch); })
+            .replace(/[\u0180-\u0FFF]/g,         function(ch) { return '\\u0' + hex(ch); })
+            .replace(/[\u1080-\uFFFF]/g,         function(ch) { return '\\u'  + hex(ch); });
+        }
+
+        var expectedDescs = new Array(expected.length),
+            expectedDesc, foundDesc, i;
+
+        for (i = 0; i < expected.length; i++) {
+          expectedDescs[i] = expected[i].description;
+        }
+
+        expectedDesc = expected.length > 1
+          ? expectedDescs.slice(0, -1).join(", ")
+              + " or "
+              + expectedDescs[expected.length - 1]
+          : expectedDescs[0];
+
+        foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input";
+
+        return "Expected " + expectedDesc + " but " + foundDesc + " found.";
+      }
+
+      var posDetails = peg$computePosDetails(pos),
+          found      = pos < input.length ? input.charAt(pos) : null;
+
+      if (expected !== null) {
+        cleanupExpected(expected);
+      }
+
+      return new SyntaxError(
+        message !== null ? message : buildMessage(expected, found),
+        expected,
+        found,
+        pos,
+        posDetails.line,
+        posDetails.column
+      );
+    }
+
+    function peg$parseProject() {
+      var s0, s1, s2, s3, s4, s5, s6;
+
+      s0 = peg$currPos;
+      s1 = peg$parseSingleLineComment();
+      if (s1 === peg$FAILED) {
+        s1 = peg$c1;
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseInlineComment();
+        if (s2 === peg$FAILED) {
+          s2 = peg$c1;
+        }
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parse_();
+          if (s3 !== peg$FAILED) {
+            s4 = peg$parseObject();
+            if (s4 !== peg$FAILED) {
+              s5 = peg$parseNewLine();
+              if (s5 !== peg$FAILED) {
+                s6 = peg$parse_();
+                if (s6 !== peg$FAILED) {
+                  peg$reportedPos = s0;
+                  s1 = peg$c2(s1, s4);
+                  s0 = s1;
+                } else {
+                  peg$currPos = s0;
+                  s0 = peg$c0;
+                }
+              } else {
+                peg$currPos = s0;
+                s0 = peg$c0;
+              }
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseObject() {
+      var s0, s1, s2, s3;
+
+      s0 = peg$currPos;
+      if (input.charCodeAt(peg$currPos) === 123) {
+        s1 = peg$c3;
+        peg$currPos++;
+      } else {
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c4); }
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseAssignmentList();
+        if (s2 === peg$FAILED) {
+          s2 = peg$parseEmptyBody();
+        }
+        if (s2 !== peg$FAILED) {
+          if (input.charCodeAt(peg$currPos) === 125) {
+            s3 = peg$c5;
+            peg$currPos++;
+          } else {
+            s3 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$c6); }
+          }
+          if (s3 !== peg$FAILED) {
+            peg$reportedPos = s0;
+            s1 = peg$c7(s2);
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseEmptyBody() {
+      var s0, s1;
+
+      s0 = peg$currPos;
+      s1 = peg$parse_();
+      if (s1 !== peg$FAILED) {
+        peg$reportedPos = s0;
+        s1 = peg$c8();
+      }
+      s0 = s1;
+
+      return s0;
+    }
+
+    function peg$parseAssignmentList() {
+      var s0, s1, s2, s3, s4, s5;
+
+      s0 = peg$currPos;
+      s1 = peg$parse_();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseAssignment();
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parse_();
+          if (s3 !== peg$FAILED) {
+            s4 = [];
+            s5 = peg$parseAssignmentList();
+            while (s5 !== peg$FAILED) {
+              s4.push(s5);
+              s5 = peg$parseAssignmentList();
+            }
+            if (s4 !== peg$FAILED) {
+              s5 = peg$parse_();
+              if (s5 !== peg$FAILED) {
+                peg$reportedPos = s0;
+                s1 = peg$c10(s2, s4);
+                s0 = s1;
+              } else {
+                peg$currPos = s0;
+                s0 = peg$c0;
+              }
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+      if (s0 === peg$FAILED) {
+        s0 = peg$currPos;
+        s1 = peg$parse_();
+        if (s1 !== peg$FAILED) {
+          s2 = peg$parseDelimitedSection();
+          if (s2 !== peg$FAILED) {
+            s3 = peg$parse_();
+            if (s3 !== peg$FAILED) {
+              s4 = [];
+              s5 = peg$parseAssignmentList();
+              while (s5 !== peg$FAILED) {
+                s4.push(s5);
+                s5 = peg$parseAssignmentList();
+              }
+              if (s4 !== peg$FAILED) {
+                peg$reportedPos = s0;
+                s1 = peg$c11(s2, s4);
+                s0 = s1;
+              } else {
+                peg$currPos = s0;
+                s0 = peg$c0;
+              }
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      }
+
+      return s0;
+    }
+
+    function peg$parseAssignment() {
+      var s0;
+
+      s0 = peg$parseSimpleAssignment();
+      if (s0 === peg$FAILED) {
+        s0 = peg$parseCommentedAssignment();
+      }
+
+      return s0;
+    }
+
+    function peg$parseSimpleAssignment() {
+      var s0, s1, s2, s3, s4, s5, s6;
+
+      s0 = peg$currPos;
+      s1 = peg$parseIdentifier();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parse_();
+        if (s2 !== peg$FAILED) {
+          if (input.charCodeAt(peg$currPos) === 61) {
+            s3 = peg$c12;
+            peg$currPos++;
+          } else {
+            s3 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$c13); }
+          }
+          if (s3 !== peg$FAILED) {
+            s4 = peg$parse_();
+            if (s4 !== peg$FAILED) {
+              s5 = peg$parseValue();
+              if (s5 !== peg$FAILED) {
+                if (input.charCodeAt(peg$currPos) === 59) {
+                  s6 = peg$c14;
+                  peg$currPos++;
+                } else {
+                  s6 = peg$FAILED;
+                  if (peg$silentFails === 0) { peg$fail(peg$c15); }
+                }
+                if (s6 !== peg$FAILED) {
+                  peg$reportedPos = s0;
+                  s1 = peg$c16(s1, s5);
+                  s0 = s1;
+                } else {
+                  peg$currPos = s0;
+                  s0 = peg$c0;
+                }
+              } else {
+                peg$currPos = s0;
+                s0 = peg$c0;
+              }
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseCommentedAssignment() {
+      var s0, s1, s2, s3, s4, s5, s6;
+
+      s0 = peg$currPos;
+      s1 = peg$parseCommentedIdentifier();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parse_();
+        if (s2 !== peg$FAILED) {
+          if (input.charCodeAt(peg$currPos) === 61) {
+            s3 = peg$c12;
+            peg$currPos++;
+          } else {
+            s3 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$c13); }
+          }
+          if (s3 !== peg$FAILED) {
+            s4 = peg$parse_();
+            if (s4 !== peg$FAILED) {
+              s5 = peg$parseValue();
+              if (s5 !== peg$FAILED) {
+                if (input.charCodeAt(peg$currPos) === 59) {
+                  s6 = peg$c14;
+                  peg$currPos++;
+                } else {
+                  s6 = peg$FAILED;
+                  if (peg$silentFails === 0) { peg$fail(peg$c15); }
+                }
+                if (s6 !== peg$FAILED) {
+                  peg$reportedPos = s0;
+                  s1 = peg$c17(s1, s5);
+                  s0 = s1;
+                } else {
+                  peg$currPos = s0;
+                  s0 = peg$c0;
+                }
+              } else {
+                peg$currPos = s0;
+                s0 = peg$c0;
+              }
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+      if (s0 === peg$FAILED) {
+        s0 = peg$currPos;
+        s1 = peg$parseIdentifier();
+        if (s1 !== peg$FAILED) {
+          s2 = peg$parse_();
+          if (s2 !== peg$FAILED) {
+            if (input.charCodeAt(peg$currPos) === 61) {
+              s3 = peg$c12;
+              peg$currPos++;
+            } else {
+              s3 = peg$FAILED;
+              if (peg$silentFails === 0) { peg$fail(peg$c13); }
+            }
+            if (s3 !== peg$FAILED) {
+              s4 = peg$parse_();
+              if (s4 !== peg$FAILED) {
+                s5 = peg$parseCommentedValue();
+                if (s5 !== peg$FAILED) {
+                  if (input.charCodeAt(peg$currPos) === 59) {
+                    s6 = peg$c14;
+                    peg$currPos++;
+                  } else {
+                    s6 = peg$FAILED;
+                    if (peg$silentFails === 0) { peg$fail(peg$c15); }
+                  }
+                  if (s6 !== peg$FAILED) {
+                    peg$reportedPos = s0;
+                    s1 = peg$c18(s1, s5);
+                    s0 = s1;
+                  } else {
+                    peg$currPos = s0;
+                    s0 = peg$c0;
+                  }
+                } else {
+                  peg$currPos = s0;
+                  s0 = peg$c0;
+                }
+              } else {
+                peg$currPos = s0;
+                s0 = peg$c0;
+              }
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      }
+
+      return s0;
+    }
+
+    function peg$parseCommentedIdentifier() {
+      var s0, s1, s2, s3;
+
+      s0 = peg$currPos;
+      s1 = peg$parseIdentifier();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parse_();
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parseInlineComment();
+          if (s3 !== peg$FAILED) {
+            peg$reportedPos = s0;
+            s1 = peg$c19(s1, s3);
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseCommentedValue() {
+      var s0, s1, s2, s3;
+
+      s0 = peg$currPos;
+      s1 = peg$parseValue();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parse_();
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parseInlineComment();
+          if (s3 !== peg$FAILED) {
+            peg$reportedPos = s0;
+            s1 = peg$c20(s1, s3);
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseInlineComment() {
+      var s0, s1, s2, s3;
+
+      s0 = peg$currPos;
+      s1 = peg$parseInlineCommentOpen();
+      if (s1 !== peg$FAILED) {
+        s2 = [];
+        if (peg$c21.test(input.charAt(peg$currPos))) {
+          s3 = input.charAt(peg$currPos);
+          peg$currPos++;
+        } else {
+          s3 = peg$FAILED;
+          if (peg$silentFails === 0) { peg$fail(peg$c22); }
+        }
+        if (s3 !== peg$FAILED) {
+          while (s3 !== peg$FAILED) {
+            s2.push(s3);
+            if (peg$c21.test(input.charAt(peg$currPos))) {
+              s3 = input.charAt(peg$currPos);
+              peg$currPos++;
+            } else {
+              s3 = peg$FAILED;
+              if (peg$silentFails === 0) { peg$fail(peg$c22); }
+            }
+          }
+        } else {
+          s2 = peg$c0;
+        }
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parseInlineCommentClose();
+          if (s3 !== peg$FAILED) {
+            peg$reportedPos = s0;
+            s1 = peg$c23(s2);
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseInlineCommentOpen() {
+      var s0;
+
+      if (input.substr(peg$currPos, 2) === peg$c24) {
+        s0 = peg$c24;
+        peg$currPos += 2;
+      } else {
+        s0 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c25); }
+      }
+
+      return s0;
+    }
+
+    function peg$parseInlineCommentClose() {
+      var s0;
+
+      if (input.substr(peg$currPos, 2) === peg$c26) {
+        s0 = peg$c26;
+        peg$currPos += 2;
+      } else {
+        s0 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c27); }
+      }
+
+      return s0;
+    }
+
+    function peg$parseDelimitedSection() {
+      var s0, s1, s2, s3, s4, s5;
+
+      s0 = peg$currPos;
+      s1 = peg$parseDelimitedSectionBegin();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parse_();
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parseAssignmentList();
+          if (s3 === peg$FAILED) {
+            s3 = peg$parseEmptyBody();
+          }
+          if (s3 !== peg$FAILED) {
+            s4 = peg$parse_();
+            if (s4 !== peg$FAILED) {
+              s5 = peg$parseDelimitedSectionEnd();
+              if (s5 !== peg$FAILED) {
+                peg$reportedPos = s0;
+                s1 = peg$c28(s1, s3);
+                s0 = s1;
+              } else {
+                peg$currPos = s0;
+                s0 = peg$c0;
+              }
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseDelimitedSectionBegin() {
+      var s0, s1, s2, s3, s4;
+
+      s0 = peg$currPos;
+      if (input.substr(peg$currPos, 9) === peg$c29) {
+        s1 = peg$c29;
+        peg$currPos += 9;
+      } else {
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c30); }
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseIdentifier();
+        if (s2 !== peg$FAILED) {
+          if (input.substr(peg$currPos, 11) === peg$c31) {
+            s3 = peg$c31;
+            peg$currPos += 11;
+          } else {
+            s3 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$c32); }
+          }
+          if (s3 !== peg$FAILED) {
+            s4 = peg$parseNewLine();
+            if (s4 !== peg$FAILED) {
+              peg$reportedPos = s0;
+              s1 = peg$c33(s2);
+              s0 = s1;
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseDelimitedSectionEnd() {
+      var s0, s1, s2, s3, s4;
+
+      s0 = peg$currPos;
+      if (input.substr(peg$currPos, 7) === peg$c34) {
+        s1 = peg$c34;
+        peg$currPos += 7;
+      } else {
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c35); }
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseIdentifier();
+        if (s2 !== peg$FAILED) {
+          if (input.substr(peg$currPos, 11) === peg$c31) {
+            s3 = peg$c31;
+            peg$currPos += 11;
+          } else {
+            s3 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$c32); }
+          }
+          if (s3 !== peg$FAILED) {
+            s4 = peg$parseNewLine();
+            if (s4 !== peg$FAILED) {
+              peg$reportedPos = s0;
+              s1 = peg$c33(s2);
+              s0 = s1;
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseArray() {
+      var s0, s1, s2, s3;
+
+      s0 = peg$currPos;
+      if (input.charCodeAt(peg$currPos) === 40) {
+        s1 = peg$c36;
+        peg$currPos++;
+      } else {
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c37); }
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseArrayBody();
+        if (s2 === peg$FAILED) {
+          s2 = peg$parseEmptyArray();
+        }
+        if (s2 !== peg$FAILED) {
+          if (input.charCodeAt(peg$currPos) === 41) {
+            s3 = peg$c38;
+            peg$currPos++;
+          } else {
+            s3 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$c39); }
+          }
+          if (s3 !== peg$FAILED) {
+            peg$reportedPos = s0;
+            s1 = peg$c40(s2);
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseEmptyArray() {
+      var s0, s1;
+
+      s0 = peg$currPos;
+      s1 = peg$parse_();
+      if (s1 !== peg$FAILED) {
+        peg$reportedPos = s0;
+        s1 = peg$c41();
+      }
+      s0 = s1;
+
+      return s0;
+    }
+
+    function peg$parseArrayBody() {
+      var s0, s1, s2, s3, s4, s5;
+
+      s0 = peg$currPos;
+      s1 = peg$parse_();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseArrayEntry();
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parse_();
+          if (s3 !== peg$FAILED) {
+            s4 = peg$parseArrayBody();
+            if (s4 === peg$FAILED) {
+              s4 = peg$c1;
+            }
+            if (s4 !== peg$FAILED) {
+              s5 = peg$parse_();
+              if (s5 !== peg$FAILED) {
+                peg$reportedPos = s0;
+                s1 = peg$c42(s2, s4);
+                s0 = s1;
+              } else {
+                peg$currPos = s0;
+                s0 = peg$c0;
+              }
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseArrayEntry() {
+      var s0;
+
+      s0 = peg$parseSimpleArrayEntry();
+      if (s0 === peg$FAILED) {
+        s0 = peg$parseCommentedArrayEntry();
+      }
+
+      return s0;
+    }
+
+    function peg$parseSimpleArrayEntry() {
+      var s0, s1, s2;
+
+      s0 = peg$currPos;
+      s1 = peg$parseValue();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseEndArrayEntry();
+        if (s2 !== peg$FAILED) {
+          peg$reportedPos = s0;
+          s1 = peg$c43(s1);
+          s0 = s1;
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseCommentedArrayEntry() {
+      var s0, s1, s2, s3, s4;
+
+      s0 = peg$currPos;
+      s1 = peg$parseValue();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parse_();
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parseInlineComment();
+          if (s3 !== peg$FAILED) {
+            s4 = peg$parseEndArrayEntry();
+            if (s4 !== peg$FAILED) {
+              peg$reportedPos = s0;
+              s1 = peg$c44(s1, s3);
+              s0 = s1;
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseEndArrayEntry() {
+      var s0, s1, s2, s3;
+
+      if (input.charCodeAt(peg$currPos) === 44) {
+        s0 = peg$c45;
+        peg$currPos++;
+      } else {
+        s0 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c46); }
+      }
+      if (s0 === peg$FAILED) {
+        s0 = peg$currPos;
+        s1 = peg$parse_();
+        if (s1 !== peg$FAILED) {
+          s2 = peg$currPos;
+          peg$silentFails++;
+          if (input.charCodeAt(peg$currPos) === 41) {
+            s3 = peg$c38;
+            peg$currPos++;
+          } else {
+            s3 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$c39); }
+          }
+          peg$silentFails--;
+          if (s3 !== peg$FAILED) {
+            peg$currPos = s2;
+            s2 = peg$c47;
+          } else {
+            s2 = peg$c0;
+          }
+          if (s2 !== peg$FAILED) {
+            s1 = [s1, s2];
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      }
+
+      return s0;
+    }
+
+    function peg$parseIdentifier() {
+      var s0, s1, s2;
+
+      s0 = peg$currPos;
+      s1 = [];
+      if (peg$c48.test(input.charAt(peg$currPos))) {
+        s2 = input.charAt(peg$currPos);
+        peg$currPos++;
+      } else {
+        s2 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c49); }
+      }
+      if (s2 !== peg$FAILED) {
+        while (s2 !== peg$FAILED) {
+          s1.push(s2);
+          if (peg$c48.test(input.charAt(peg$currPos))) {
+            s2 = input.charAt(peg$currPos);
+            peg$currPos++;
+          } else {
+            s2 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$c49); }
+          }
+        }
+      } else {
+        s1 = peg$c0;
+      }
+      if (s1 !== peg$FAILED) {
+        peg$reportedPos = s0;
+        s1 = peg$c50(s1);
+      }
+      s0 = s1;
+      if (s0 === peg$FAILED) {
+        s0 = peg$parseQuotedString();
+      }
+
+      return s0;
+    }
+
+    function peg$parseValue() {
+      var s0;
+
+      s0 = peg$parseObject();
+      if (s0 === peg$FAILED) {
+        s0 = peg$parseArray();
+        if (s0 === peg$FAILED) {
+          s0 = peg$parseNumberValue();
+          if (s0 === peg$FAILED) {
+            s0 = peg$parseStringValue();
+          }
+        }
+      }
+
+      return s0;
+    }
+
+    function peg$parseNumberValue() {
+      var s0;
+
+      s0 = peg$parseDecimalValue();
+      if (s0 === peg$FAILED) {
+        s0 = peg$parseIntegerValue();
+      }
+
+      return s0;
+    }
+
+    function peg$parseDecimalValue() {
+      var s0, s1, s2, s3, s4;
+
+      s0 = peg$currPos;
+      s1 = peg$currPos;
+      s2 = peg$parseIntegerValue();
+      if (s2 !== peg$FAILED) {
+        if (input.charCodeAt(peg$currPos) === 46) {
+          s3 = peg$c51;
+          peg$currPos++;
+        } else {
+          s3 = peg$FAILED;
+          if (peg$silentFails === 0) { peg$fail(peg$c52); }
+        }
+        if (s3 !== peg$FAILED) {
+          s4 = peg$parseIntegerValue();
+          if (s4 !== peg$FAILED) {
+            s2 = [s2, s3, s4];
+            s1 = s2;
+          } else {
+            peg$currPos = s1;
+            s1 = peg$c0;
+          }
+        } else {
+          peg$currPos = s1;
+          s1 = peg$c0;
+        }
+      } else {
+        peg$currPos = s1;
+        s1 = peg$c0;
+      }
+      if (s1 !== peg$FAILED) {
+        peg$reportedPos = s0;
+        s1 = peg$c53(s1);
+      }
+      s0 = s1;
+
+      return s0;
+    }
+
+    function peg$parseIntegerValue() {
+      var s0, s1, s2, s3, s4;
+
+      s0 = peg$currPos;
+      s1 = peg$currPos;
+      peg$silentFails++;
+      s2 = peg$parseAlpha();
+      peg$silentFails--;
+      if (s2 === peg$FAILED) {
+        s1 = peg$c47;
+      } else {
+        peg$currPos = s1;
+        s1 = peg$c0;
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = [];
+        s3 = peg$parseDigit();
+        if (s3 !== peg$FAILED) {
+          while (s3 !== peg$FAILED) {
+            s2.push(s3);
+            s3 = peg$parseDigit();
+          }
+        } else {
+          s2 = peg$c0;
+        }
+        if (s2 !== peg$FAILED) {
+          s3 = peg$currPos;
+          peg$silentFails++;
+          s4 = peg$parseNonTerminator();
+          peg$silentFails--;
+          if (s4 === peg$FAILED) {
+            s3 = peg$c47;
+          } else {
+            peg$currPos = s3;
+            s3 = peg$c0;
+          }
+          if (s3 !== peg$FAILED) {
+            peg$reportedPos = s0;
+            s1 = peg$c54(s2);
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseStringValue() {
+      var s0;
+
+      s0 = peg$parseQuotedString();
+      if (s0 === peg$FAILED) {
+        s0 = peg$parseLiteralString();
+      }
+
+      return s0;
+    }
+
+    function peg$parseQuotedString() {
+      var s0, s1, s2, s3;
+
+      s0 = peg$currPos;
+      s1 = peg$parseDoubleQuote();
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseQuotedBody();
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parseDoubleQuote();
+          if (s3 !== peg$FAILED) {
+            peg$reportedPos = s0;
+            s1 = peg$c55(s2);
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseQuotedBody() {
+      var s0, s1, s2;
+
+      s0 = peg$currPos;
+      s1 = [];
+      s2 = peg$parseNonQuote();
+      if (s2 !== peg$FAILED) {
+        while (s2 !== peg$FAILED) {
+          s1.push(s2);
+          s2 = peg$parseNonQuote();
+        }
+      } else {
+        s1 = peg$c0;
+      }
+      if (s1 !== peg$FAILED) {
+        peg$reportedPos = s0;
+        s1 = peg$c56(s1);
+      }
+      s0 = s1;
+
+      return s0;
+    }
+
+    function peg$parseNonQuote() {
+      var s0, s1, s2;
+
+      s0 = peg$parseEscapedQuote();
+      if (s0 === peg$FAILED) {
+        s0 = peg$currPos;
+        s1 = peg$currPos;
+        peg$silentFails++;
+        s2 = peg$parseDoubleQuote();
+        peg$silentFails--;
+        if (s2 === peg$FAILED) {
+          s1 = peg$c47;
+        } else {
+          peg$currPos = s1;
+          s1 = peg$c0;
+        }
+        if (s1 !== peg$FAILED) {
+          if (input.length > peg$currPos) {
+            s2 = input.charAt(peg$currPos);
+            peg$currPos++;
+          } else {
+            s2 = peg$FAILED;
+            if (peg$silentFails === 0) { peg$fail(peg$c57); }
+          }
+          if (s2 !== peg$FAILED) {
+            peg$reportedPos = s0;
+            s1 = peg$c58(s2);
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      }
+
+      return s0;
+    }
+
+    function peg$parseEscapedQuote() {
+      var s0, s1, s2;
+
+      s0 = peg$currPos;
+      if (input.charCodeAt(peg$currPos) === 92) {
+        s1 = peg$c59;
+        peg$currPos++;
+      } else {
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c60); }
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseDoubleQuote();
+        if (s2 !== peg$FAILED) {
+          peg$reportedPos = s0;
+          s1 = peg$c61();
+          s0 = s1;
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseLiteralString() {
+      var s0, s1, s2;
+
+      s0 = peg$currPos;
+      s1 = [];
+      s2 = peg$parseLiteralChar();
+      if (s2 !== peg$FAILED) {
+        while (s2 !== peg$FAILED) {
+          s1.push(s2);
+          s2 = peg$parseLiteralChar();
+        }
+      } else {
+        s1 = peg$c0;
+      }
+      if (s1 !== peg$FAILED) {
+        peg$reportedPos = s0;
+        s1 = peg$c62(s1);
+      }
+      s0 = s1;
+
+      return s0;
+    }
+
+    function peg$parseLiteralChar() {
+      var s0, s1, s2, s3;
+
+      s0 = peg$currPos;
+      s1 = peg$currPos;
+      peg$silentFails++;
+      s2 = peg$parseInlineCommentOpen();
+      peg$silentFails--;
+      if (s2 === peg$FAILED) {
+        s1 = peg$c47;
+      } else {
+        peg$currPos = s1;
+        s1 = peg$c0;
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = peg$currPos;
+        peg$silentFails++;
+        s3 = peg$parseLineTerminator();
+        peg$silentFails--;
+        if (s3 === peg$FAILED) {
+          s2 = peg$c47;
+        } else {
+          peg$currPos = s2;
+          s2 = peg$c0;
+        }
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parseNonTerminator();
+          if (s3 !== peg$FAILED) {
+            peg$reportedPos = s0;
+            s1 = peg$c58(s3);
+            s0 = s1;
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseNonTerminator() {
+      var s0;
+
+      if (peg$c63.test(input.charAt(peg$currPos))) {
+        s0 = input.charAt(peg$currPos);
+        peg$currPos++;
+      } else {
+        s0 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c64); }
+      }
+
+      return s0;
+    }
+
+    function peg$parseSingleLineComment() {
+      var s0, s1, s2, s3, s4;
+
+      s0 = peg$currPos;
+      if (input.substr(peg$currPos, 2) === peg$c65) {
+        s1 = peg$c65;
+        peg$currPos += 2;
+      } else {
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c66); }
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parse_();
+        if (s2 !== peg$FAILED) {
+          s3 = peg$parseOneLineString();
+          if (s3 !== peg$FAILED) {
+            s4 = peg$parseNewLine();
+            if (s4 !== peg$FAILED) {
+              peg$reportedPos = s0;
+              s1 = peg$c67(s3);
+              s0 = s1;
+            } else {
+              peg$currPos = s0;
+              s0 = peg$c0;
+            }
+          } else {
+            peg$currPos = s0;
+            s0 = peg$c0;
+          }
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseOneLineString() {
+      var s0, s1, s2;
+
+      s0 = peg$currPos;
+      s1 = [];
+      s2 = peg$parseNonLine();
+      while (s2 !== peg$FAILED) {
+        s1.push(s2);
+        s2 = peg$parseNonLine();
+      }
+      if (s1 !== peg$FAILED) {
+        peg$reportedPos = s0;
+        s1 = peg$c68(s1);
+      }
+      s0 = s1;
+
+      return s0;
+    }
+
+    function peg$parseDigit() {
+      var s0;
+
+      if (peg$c69.test(input.charAt(peg$currPos))) {
+        s0 = input.charAt(peg$currPos);
+        peg$currPos++;
+      } else {
+        s0 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c70); }
+      }
+
+      return s0;
+    }
+
+    function peg$parseAlpha() {
+      var s0;
+
+      if (peg$c71.test(input.charAt(peg$currPos))) {
+        s0 = input.charAt(peg$currPos);
+        peg$currPos++;
+      } else {
+        s0 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c72); }
+      }
+
+      return s0;
+    }
+
+    function peg$parseDoubleQuote() {
+      var s0;
+
+      if (input.charCodeAt(peg$currPos) === 34) {
+        s0 = peg$c73;
+        peg$currPos++;
+      } else {
+        s0 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c74); }
+      }
+
+      return s0;
+    }
+
+    function peg$parse_() {
+      var s0, s1;
+
+      peg$silentFails++;
+      s0 = [];
+      s1 = peg$parsewhitespace();
+      while (s1 !== peg$FAILED) {
+        s0.push(s1);
+        s1 = peg$parsewhitespace();
+      }
+      peg$silentFails--;
+      if (s0 === peg$FAILED) {
+        s1 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c75); }
+      }
+
+      return s0;
+    }
+
+    function peg$parsewhitespace() {
+      var s0;
+
+      s0 = peg$parseNewLine();
+      if (s0 === peg$FAILED) {
+        if (peg$c76.test(input.charAt(peg$currPos))) {
+          s0 = input.charAt(peg$currPos);
+          peg$currPos++;
+        } else {
+          s0 = peg$FAILED;
+          if (peg$silentFails === 0) { peg$fail(peg$c77); }
+        }
+      }
+
+      return s0;
+    }
+
+    function peg$parseNonLine() {
+      var s0, s1, s2;
+
+      s0 = peg$currPos;
+      s1 = peg$currPos;
+      peg$silentFails++;
+      s2 = peg$parseNewLine();
+      peg$silentFails--;
+      if (s2 === peg$FAILED) {
+        s1 = peg$c47;
+      } else {
+        peg$currPos = s1;
+        s1 = peg$c0;
+      }
+      if (s1 !== peg$FAILED) {
+        s2 = peg$parseChar();
+        if (s2 !== peg$FAILED) {
+          peg$reportedPos = s0;
+          s1 = peg$c58(s2);
+          s0 = s1;
+        } else {
+          peg$currPos = s0;
+          s0 = peg$c0;
+        }
+      } else {
+        peg$currPos = s0;
+        s0 = peg$c0;
+      }
+
+      return s0;
+    }
+
+    function peg$parseLineTerminator() {
+      var s0;
+
+      s0 = peg$parseNewLine();
+      if (s0 === peg$FAILED) {
+        if (input.charCodeAt(peg$currPos) === 59) {
+          s0 = peg$c14;
+          peg$currPos++;
+        } else {
+          s0 = peg$FAILED;
+          if (peg$silentFails === 0) { peg$fail(peg$c15); }
+        }
+      }
+
+      return s0;
+    }
+
+    function peg$parseNewLine() {
+      var s0;
+
+      if (peg$c78.test(input.charAt(peg$currPos))) {
+        s0 = input.charAt(peg$currPos);
+        peg$currPos++;
+      } else {
+        s0 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c79); }
+      }
+
+      return s0;
+    }
+
+    function peg$parseChar() {
+      var s0;
+
+      if (input.length > peg$currPos) {
+        s0 = input.charAt(peg$currPos);
+        peg$currPos++;
+      } else {
+        s0 = peg$FAILED;
+        if (peg$silentFails === 0) { peg$fail(peg$c57); }
+      }
+
+      return s0;
+    }
+
+
+        function merge(hash, secondHash) {
+            secondHash = secondHash[0]
+            for(var i in secondHash) {
+           		hash[i] = merge_obj(hash[i], secondHash[i]);
+            }
+
+            return hash;
+        }
+        
+        function merge_obj(obj, secondObj) {
+        	if (!obj)
+        		return secondObj;
+
+            for(var i in secondObj)
+                obj[i] = merge_obj(obj[i], secondObj[i]);
+
+            return obj;
+        }
+
+
+    peg$result = peg$startRuleFunction();
+
+    if (peg$result !== peg$FAILED && peg$currPos === input.length) {
+      return peg$result;
+    } else {
+      if (peg$result !== peg$FAILED && peg$currPos < input.length) {
+        peg$fail({ type: "end", description: "end of input" });
+      }
+
+      throw peg$buildException(null, peg$maxFailExpected, peg$maxFailPos);
+    }
+  }
+
+  return {
+    SyntaxError: SyntaxError,
+    parse:       parse
+  };
+})();

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/lib/parser/pbxproj.pegjs
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/lib/parser/pbxproj.pegjs b/bin/node_modules/xcode/lib/parser/pbxproj.pegjs
new file mode 100644
index 0000000..5140c05
--- /dev/null
+++ b/bin/node_modules/xcode/lib/parser/pbxproj.pegjs
@@ -0,0 +1,273 @@
+{
+    function merge(hash, secondHash) {
+        secondHash = secondHash[0]
+        for(var i in secondHash) {
+       		hash[i] = merge_obj(hash[i], secondHash[i]);
+        }
+
+        return hash;
+    }
+    
+    function merge_obj(obj, secondObj) {
+    	if (!obj)
+    		return secondObj;
+
+        for(var i in secondObj)
+            obj[i] = merge_obj(obj[i], secondObj[i]);
+
+        return obj;
+    }
+}
+
+/*
+ *  Project: point of entry from pbxproj file
+ */
+Project
+  = headComment:SingleLineComment? InlineComment? _ obj:Object NewLine _
+    {
+        var proj = Object.create(null)
+        proj.project = obj
+
+        if (headComment) {
+            proj.headComment = headComment
+        }
+
+        return proj;
+    }
+
+/*
+ *  Object: basic hash data structure with Assignments
+ */
+Object
+  = "{" obj:(AssignmentList / EmptyBody) "}"
+    { return obj }
+
+EmptyBody
+  = _
+    { return Object.create(null) }
+
+AssignmentList
+  = _ head:Assignment _ tail:AssignmentList* _
+    { 
+      if (tail) return merge(head,tail)
+      else return head
+    }
+    / _ head:DelimitedSection _ tail:AssignmentList*
+    {
+      if (tail) return merge(head,tail)
+      else return head
+    }
+
+/*
+ *  Assignments
+ *  can be simple "key = value"
+ *  or commented "key /* real key * / = value"
+ */
+Assignment
+  = SimpleAssignment / CommentedAssignment
+
+SimpleAssignment
+  = id:Identifier _ "=" _ val:Value ";"
+    { 
+      var result = Object.create(null);
+      result[id] = val
+      return result
+    }
+
+CommentedAssignment
+  = commentedId:CommentedIdentifier _ "=" _ val:Value ";"
+    {
+        var result = Object.create(null),
+            commentKey = commentedId.id + '_comment';
+
+        result[commentedId.id] = val;
+        result[commentKey] = commentedId[commentKey];
+        return result;
+
+    }
+    /
+    id:Identifier _ "=" _ commentedVal:CommentedValue ";"
+    {
+        var result = Object.create(null);
+        result[id] = commentedVal.value;
+        result[id + "_comment"] = commentedVal.comment;
+        return result;
+    }
+
+CommentedIdentifier
+  = id:Identifier _ comment:InlineComment
+    {
+        var result = Object.create(null);
+        result.id = id;
+        result[id + "_comment"] = comment.trim();
+        return result
+    }
+
+CommentedValue
+  = literal:Value _ comment:InlineComment
+    {
+        var result = Object.create(null)
+        result.comment = comment.trim();
+        result.value = literal.trim();
+        return result;
+    }
+
+InlineComment
+  = InlineCommentOpen body:[^*]+ InlineCommentClose
+    { return body.join('') }
+
+InlineCommentOpen
+  = "/*"
+
+InlineCommentClose
+  = "*/"
+
+/*
+ *  DelimitedSection - ad hoc project structure pbxproj files use
+ */
+DelimitedSection
+  = begin:DelimitedSectionBegin _ fields:(AssignmentList / EmptyBody) _ DelimitedSectionEnd
+    {
+        var section = Object.create(null);
+        section[begin.name] = fields
+
+        return section
+    }
+
+DelimitedSectionBegin
+  = "/* Begin " sectionName:Identifier " section */" NewLine
+    { return { name: sectionName } }
+
+DelimitedSectionEnd
+  = "/* End " sectionName:Identifier " section */" NewLine
+    { return { name: sectionName } }
+
+/*
+ * Arrays: lists of values, possible wth comments
+ */
+Array
+  = "(" arr:(ArrayBody / EmptyArray ) ")" { return arr }
+
+EmptyArray
+  = _ { return [] }
+
+ArrayBody
+  = _ head:ArrayEntry _ tail:ArrayBody? _
+    {
+        if (tail) {
+            tail.unshift(head);
+            return tail;
+        } else {
+            return [head];
+        }
+    }
+
+ArrayEntry
+  = SimpleArrayEntry / CommentedArrayEntry
+
+SimpleArrayEntry
+  = val:Value EndArrayEntry { return val }
+
+CommentedArrayEntry
+  = val:Value _ comment:InlineComment EndArrayEntry
+    {
+        var result = Object.create(null);
+        result.value = val.trim();
+        result.comment = comment.trim();
+        return result;
+    }
+
+EndArrayEntry
+  = "," / _ &")"
+
+/*
+ *  Identifiers and Values
+ */
+Identifier
+  = id:[A-Za-z0-9_.]+ { return id.join('') }
+  / QuotedString
+
+Value
+  = Object / Array / NumberValue / StringValue
+
+NumberValue
+  = DecimalValue / IntegerValue
+
+DecimalValue
+  = decimal:(IntegerValue "." IntegerValue)
+    { 
+        // store decimals as strings
+        // as JS doesn't differentiate bw strings and numbers
+        return decimal.join('')
+    }
+
+IntegerValue
+  = !Alpha number:Digit+ !NonTerminator
+    { return parseInt(number.join(''), 10) }
+
+StringValue
+ = QuotedString / LiteralString
+
+QuotedString
+ = DoubleQuote str:QuotedBody DoubleQuote { return '"' + str + '"' }
+
+QuotedBody
+ = str:NonQuote+ { return str.join('') }
+
+NonQuote
+  = EscapedQuote / !DoubleQuote char:. { return char }
+
+EscapedQuote
+  = "\\" DoubleQuote { return '\\"' }
+
+LiteralString
+  = literal:LiteralChar+ { return literal.join('') }
+
+LiteralChar
+  = !InlineCommentOpen !LineTerminator char:NonTerminator
+    { return char }
+
+NonTerminator
+  = [^;,\n]
+
+/*
+ * SingleLineComment - used for the encoding comment
+ */
+SingleLineComment
+  = "//" _ contents:OneLineString NewLine
+    { return contents }
+
+OneLineString
+  = contents:NonLine*
+    { return contents.join('') }
+
+/*
+ *  Simple character checking rules
+ */
+Digit
+  = [0-9]
+
+Alpha
+  = [A-Za-z]
+
+DoubleQuote
+  = '"'
+
+_ "whitespace"
+  = whitespace*
+
+whitespace
+  = NewLine / [\t ]
+
+NonLine
+  = !NewLine char:Char
+    { return char }
+
+LineTerminator
+  = NewLine / ";"
+
+NewLine
+    = [\n\r]
+
+Char
+  = .

http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/26cca47e/bin/node_modules/xcode/lib/pbxFile.js
----------------------------------------------------------------------
diff --git a/bin/node_modules/xcode/lib/pbxFile.js b/bin/node_modules/xcode/lib/pbxFile.js
new file mode 100644
index 0000000..4431f0d
--- /dev/null
+++ b/bin/node_modules/xcode/lib/pbxFile.js
@@ -0,0 +1,194 @@
+var path = require('path'),
+    util = require('util');
+
+var DEFAULT_SOURCETREE = '"<group>"',
+    DEFAULT_PRODUCT_SOURCETREE = 'BUILT_PRODUCTS_DIR',
+    DEFAULT_FILEENCODING = 4,
+    DEFAULT_GROUP = 'Resources',
+    DEFAULT_FILETYPE = 'unknown';
+
+var FILETYPE_BY_EXTENSION = {
+        a: 'archive.ar',
+        app: 'wrapper.application',
+        appex: 'wrapper.app-extension',
+        bundle: 'wrapper.plug-in',
+        dylib: 'compiled.mach-o.dylib',
+        framework: 'wrapper.framework',
+        h: 'sourcecode.c.h',
+        m: 'sourcecode.c.objc',
+        markdown: 'text',
+        mdimporter: 'wrapper.cfbundle',
+        octest: 'wrapper.cfbundle',
+        pch: 'sourcecode.c.h',
+        plist: 'text.plist.xml',
+        sh: 'text.script.sh',
+        swift: 'sourcecode.swift',
+        xcassets: 'folder.assetcatalog',
+        xcconfig: 'text.xcconfig',
+        xcdatamodel: 'wrapper.xcdatamodel',
+        xcodeproj: 'wrapper.pb-project',
+        xctest: 'wrapper.cfbundle',
+        xib: 'file.xib'
+    },
+    GROUP_BY_FILETYPE = {
+        'archive.ar': 'Frameworks',
+        'compiled.mach-o.dylib': 'Frameworks',
+        'wrapper.framework': 'Frameworks',
+        'sourcecode.c.h': 'Resources',
+        'sourcecode.c.objc': 'Sources',
+        'sourcecode.swift': 'Sources'
+    },
+    PATH_BY_FILETYPE = {
+        'compiled.mach-o.dylib': 'usr/lib/',
+        'wrapper.framework': 'System/Library/Frameworks/'
+    },
+    SOURCETREE_BY_FILETYPE = {
+        'compiled.mach-o.dylib': 'SDKROOT',
+        'wrapper.framework': 'SDKROOT'
+    },
+    ENCODING_BY_FILETYPE = {
+        'sourcecode.c.h': 4,
+        'sourcecode.c.h': 4,
+        'sourcecode.c.objc': 4,
+        'sourcecode.swift': 4,
+        'text': 4,
+        'text.plist.xml': 4,
+        'text.script.sh': 4,
+        'text.xcconfig': 4
+    };
+
+
+function unquoted(text){
+    return text.replace (/(^")|("$)/g, '')
+}
+
+function detectType(filePath) {
+    var extension = path.extname(filePath).substring(1),
+        filetype = FILETYPE_BY_EXTENSION[unquoted(extension)];
+
+    if (!filetype) {
+        return DEFAULT_FILETYPE;
+    }
+
+    return filetype;
+}
+
+function defaultExtension(fileRef) {
+    var filetype = fileRef.lastKnownFileType || fileRef.explicitFileType;
+
+    for(var extension in FILETYPE_BY_EXTENSION) {
+        if(FILETYPE_BY_EXTENSION.hasOwnProperty(unquoted(extension)) ) {
+             if(FILETYPE_BY_EXTENSION[unquoted(extension)] === filetype )
+                 return extension;
+        }
+    }
+}
+
+function defaultEncoding(fileRef) {
+    var filetype = fileRef.lastKnownFileType || fileRef.explicitFileType,
+        encoding = ENCODING_BY_FILETYPE[unquoted(filetype)];
+
+    if (encoding) {
+        return encoding;
+    }
+}
+
+function detectGroup(fileRef) {
+    var filetype = fileRef.lastKnownFileType || fileRef.explicitFileType,
+        groupName = GROUP_BY_FILETYPE[unquoted(filetype)];
+
+    if (!groupName) {
+        return DEFAULT_GROUP;
+    }
+
+    return groupName;
+}
+
+function detectSourcetree(fileRef) {
+    
+    var filetype = fileRef.lastKnownFileType || fileRef.explicitFileType,
+        sourcetree = SOURCETREE_BY_FILETYPE[unquoted(filetype)];
+
+    if (fileRef.explicitFileType) {
+        return DEFAULT_PRODUCT_SOURCETREE;
+    }
+    
+    if (fileRef.customFramework) {
+        return DEFAULT_SOURCETREE;
+    }
+    
+    if (!sourcetree) {
+        return DEFAULT_SOURCETREE;
+    }
+
+    return sourcetree;
+}
+
+function defaultPath(fileRef, filePath) {
+    var filetype = fileRef.lastKnownFileType || fileRef.explicitFileType,
+        defaultPath = PATH_BY_FILETYPE[unquoted(filetype)];
+
+    if (fileRef.customFramework) {
+        return filePath;
+    }
+    
+    if (defaultPath) {
+        return path.join(defaultPath, path.basename(filePath));
+    }
+
+    return filePath;
+}
+
+function defaultGroup(fileRef) {
+    var groupName = GROUP_BY_FILETYPE[fileRef.lastKnownFileType];
+
+    if (!groupName) {
+        return DEFAULT_GROUP;
+    }
+
+    return defaultGroup;
+}
+
+function pbxFile(filepath, opt) {
+    var opt = opt || {};
+    
+    self = this;
+
+    this.lastKnownFileType = opt.lastKnownFileType || detectType(filepath);
+    this.group = detectGroup(self);
+
+    // for custom frameworks
+    if (opt.customFramework == true) {
+        this.customFramework = true;
+        this.dirname = path.dirname(filepath);
+    }
+
+    this.basename = path.basename(filepath);
+    this.path = defaultPath(this, filepath);
+    this.fileEncoding = this.defaultEncoding = opt.defaultEncoding || defaultEncoding(self);
+
+
+    // When referencing products / build output files
+    if (opt.explicitFileType) {
+        this.explicitFileType = opt.explicitFileType;
+        this.basename = this.basename + '.' + defaultExtension(this);
+        delete this.path;
+        delete this.lastKnownFileType;
+        delete this.group;
+        delete this.defaultEncoding;
+    }
+
+    this.sourceTree = opt.sourceTree || detectSourcetree(self);
+    this.includeInIndex = 0;
+
+    if (opt.weak && opt.weak === true)
+        this.settings = { ATTRIBUTES: ['Weak'] };
+
+    if (opt.compilerFlags) {
+        if (!this.settings)
+            this.settings = {};
+        this.settings.COMPILER_FLAGS = util.format('"%s"', opt.compilerFlags);
+    }
+}
+
+module.exports = pbxFile;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org