]> git.saurik.com Git - wxWidgets.git/commitdiff
adding building iphone projects
authorStefan Csomor <csomor@advancedconcepts.ch>
Thu, 20 May 2010 18:06:59 +0000 (18:06 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Thu, 20 May 2010 18:06:59 +0000 (18:06 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64361 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

build/osx/makeprojects.applescript

index 129a11a81afa8876df22c80e2862cd99a35914e0..98162bafa1881c32bf23ecc1fc7fd4a7131a9eb5 100644 (file)
@@ -1 +1,279 @@
-global oldDelimiters\rglobal variables\rglobal variablesRef\rglobal bakefilesXML\rglobal bakefilesXMLRef\rglobal projectFile\r\rglobal osxBuildFolder\r\rproperty test : false\r\r-- retrieves the files from the xml node including optional conditions\ron parseSources(theName, theElement, theVariables, theConditions)\r    set AppleScript's text item delimiters to " "\r  set allElements to {}\r  repeat with currElement in XML contents of theElement\r          if class of currElement is text then\r                   set allElements to allElements & (every text item of currElement)\r              else\r                   if class of currElement is XML element and XML tag of currElement is "if" then\r                         if (cond of XML attributes of currElement is in theConditions) then\r                                    set allElements to allElements & (every text item of (item 1 of XML contents of currElement))\r                          end if\r                 end if\r         end if\r end repeat\r     set AppleScript's text item delimiters to oldDelimiters\r        copy {varname:theName, entries:allElements} to end of theVariables\rend parseSources\r\ron parseEntry(theElement, theVariables, theConditions)\r    set theName to var of XML attributes of theElement\r     parseSources(theName, theElement, theVariables, theConditions)\rend parseEntry\r\ron parseLib(theElement, theVariables, theConditions)\r    set theName to |id| of XML attributes of theElement\r    repeat with currElement in XML contents of theElement\r          if class of currElement is XML element and XML tag of currElement is "sources" then\r                    parseSources(theName, currElement, theVariables, theConditions)\r                end if\r end repeat\rend parseLib\r\ron parseNode(anElement, theVariables, theConditions)\r  if class of anElement is XML element and ¬\r            XML tag of anElement is "set" then\r             parseEntry(anElement, theVariables, theConditions)\r     else\r           if class of anElement is XML element and ¬\r                    XML tag of anElement is "lib" then\r                     parseLib(anElement, theVariables, theConditions)\r               end if\r end if\rend parseNode\r\r-- iterates through the entire xml tree and populates the variables\ron parseFiles(theXML, theVariables, theConditions)\r   if class of theXML is XML element or class of theXML is XML document then\r              repeat with anElement in XML contents of theXML\r                        try\r                            parseNode(anElement, theVariables, theConditions)\r                      on error number -1728\r                          -- ignore this error\r                   end try\r                end repeat\r     else if class of theXML is list then\r           repeat with anElement in theXML\r                        try\r                            parseNode(anElement, theVariables, theConditions)\r                      on error number -1728\r                          -- ignore this error\r                   end try\r                end repeat\r     end if\rend parseFiles\r\r-- gets the entries of the variable named theName\ron getVar(theName)\r    repeat with anElement in variablesRef\r          if (varname of anElement is theName) then\r                      return entries of anElement\r            end if\r end repeat\rend getVar\r\r-- adds sources from fileList to a group named container\ron addNode(theContainer, fileList)\r     tell application "Xcode"\r               tell project 1\r                 set theTargets to targets\r                      repeat with listItem in fileList\r                               if (listItem starts with "$(") then\r                                    set AppleScript's text item delimiters to ""\r                                   set variableName to (characters 3 through ((length of listItem) - 1) of listItem) as text\r                                      set AppleScript's text item delimiters to oldDelimiters\r                                        my addNode(theContainer, my getVar(variableName))\r                              else\r                                   set AppleScript's text item delimiters to "/"\r                                  set currPath to every text item in listItem\r                                    set currFile to "../../" & listItem\r                                    set currFileName to (item -1 in currPath)\r                                      set currGroup to (items 1 through -2 in currPath as text)\r                                      set AppleScript's text item delimiters to oldDelimiters\r                                        try\r                                            set theGroup to group theContainer\r                                     on error\r                                               tell root group\r                                                        make new group with properties {name:theContainer}\r                                             end tell\r                                       end try\r                                        tell group theContainer\r                                                try\r                                                    set theGroup to group named currGroup\r                                          on error\r                                                       make new group with properties {name:currGroup}\r                                                end try\r                                                tell group currGroup\r                                                   set newFile to make new file reference with properties {name:currFileName, path:currFile, path type:project relative}\r                                                  repeat with theTarget in theTargets\r                                                            add newFile to (get compile sources phase of theTarget)\r                                                        end repeat\r                                             end tell\r                                       end tell\r                               end if\r                 end repeat\r             end tell\r       end tell\rend addNode\r\r-- retrieves contents of file at posixFilePath\ron readFile(posixFilePath)\r        set fileRef to open for access POSIX file posixFilePath\r        set theData to read fileRef\r    close access fileRef\r   return theData\rend readFile\r\ron init()\r tell application "Xcode"\r               quit\r   end tell\r       set variablesRef to a reference to variables\r   set bakefilesXMLRef to a reference to bakefilesXML\r     set oldDelimiters to AppleScript's text item delimiters\r        tell application "Finder"\r              set osxBuildFolder to POSIX path of ((folder of (path to me)) as Unicode text)\r end tell\rend init\r\r-- reads the files list and evaluates the conditions\ron readFilesList(theFiles, theConditions)\r      set variables to {}\r    repeat with theFile in theFiles\r                set bakefilesXML to parse XML (readFile(osxBuildFolder & theFile))\r             parseFiles(bakefilesXMLRef, variablesRef, theConditions)\r       end repeat\rend readFilesList\r\r-- creates a new project file from the respective template\ron instantiateProject(theProject)\r     set projectName to projectName of theProject\r   set template to POSIX file (osxBuildFolder & projectName & "_in.xcodeproj")\r    set projectFile to POSIX file (osxBuildFolder & projectName & ".xcodeproj")\r    tell application "Finder"\r              try\r                    delete file projectFile\r                end try\r                set duplicateProject to duplicate template with replace\r                set name of duplicateProject to (projectName & ".xcodeproj")\r   end tell\rend instantiateProject\r\r-- adds the source files of the nodes of theProject to the xcode project\ron populateProject(theProject)\r       tell application "Xcode"\r               open projectFile\r       end tell\r       repeat with theNode in nodes of theProject\r             -- reopen xcode for each pass, as otherwise the undomanager\r            -- happens to crash quite frequently\r           addNode(label of theNode, entries of theNode)\r  end repeat\r     tell application "Xcode"\r               quit\r   end tell\rend populateProject\r\ron makeProject(theProject)\r       instantiateProject(theProject)\r readFilesList(bklfiles of theProject, conditions of theProject)\r        populateProject(theProject)\rend makeProject\r\r-- main\r\rinit()\rset theProject to {conditions:{"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_CARBON'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}, projectName:¬\r    "wxcarbon", bklfiles:{¬\r       "../bakefiles/files.bkl", "../bakefiles/regex.bkl", "../bakefiles/tiff.bkl", "../bakefiles/png.bkl", "../bakefiles/jpeg.bkl", "../bakefiles/scintilla.bkl", "../bakefiles/expat.bkl"}, nodes:{¬\r       {label:"base", entries:{"$(BASE_SRC)"}}, ¬\r    {label:"base", entries:{"$(BASE_AND_GUI_SRC)"}}, ¬\r    {label:"core", entries:{"$(CORE_SRC)"}}, ¬\r    {label:"net", entries:{"$(NET_SRC)"}}, ¬\r      {label:"adv", entries:{"$(ADVANCED_SRC)"}}, ¬\r {label:"media", entries:{"$(MEDIA_SRC)"}}, ¬\r  {label:"html", entries:{"$(HTML_SRC)"}}, ¬\r    {label:"xrc", entries:{"$(XRC_SRC)"}}, ¬\r      {label:"xml", entries:{"$(XML_SRC)"}}, ¬\r      {label:"opengl", entries:{"$(OPENGL_SRC)"}}, ¬\r        {label:"aui", entries:{"$(AUI_SRC)"}}, ¬\r      {label:"ribbon", entries:{"$(RIBBON_SRC)"}}, ¬\r        {label:"propgrid", entries:{"$(PROPGRID_SRC)"}}, ¬\r    {label:"richtext", entries:{"$(RICHTEXT_SRC)"}}, ¬\r    {label:"stc", entries:{"$(STC_SRC)"}}, ¬\r      {label:"libtiff", entries:{"$(wxtiff)"}}, ¬\r   {label:"libjpeg", entries:{"$(wxjpeg)"}}, ¬\r   {label:"libpng", entries:{"$(wxpng)"}}, ¬\r     {label:"libregex", entries:{"$(wxregex)"}}, ¬\r {label:"libscintilla", entries:{"$(wxscintilla)"}}, ¬\r {label:"libexpat", entries:{"$(wxexpat)"}} ¬\r          }}\rmakeProject(theProject)\r\rset theProject to {conditions:{"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_COCOA'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}, projectName:¬\r      "wxcocoa", bklfiles:{¬\r        "../bakefiles/files.bkl", "../bakefiles/regex.bkl", "../bakefiles/tiff.bkl", "../bakefiles/png.bkl", "../bakefiles/jpeg.bkl", "../bakefiles/scintilla.bkl", "../bakefiles/expat.bkl"}, nodes:{¬\r       {label:"base", entries:{"$(BASE_SRC)"}}, ¬\r    {label:"base", entries:{"$(BASE_AND_GUI_SRC)"}}, ¬\r    {label:"core", entries:{"$(CORE_SRC)"}}, ¬\r    {label:"net", entries:{"$(NET_SRC)"}}, ¬\r      {label:"adv", entries:{"$(ADVANCED_SRC)"}}, ¬\r {label:"media", entries:{"$(MEDIA_SRC)"}}, ¬\r  {label:"html", entries:{"$(HTML_SRC)"}}, ¬\r    {label:"xrc", entries:{"$(XRC_SRC)"}}, ¬\r      {label:"xml", entries:{"$(XML_SRC)"}}, ¬\r      {label:"opengl", entries:{"$(OPENGL_SRC)"}}, ¬\r        {label:"aui", entries:{"$(AUI_SRC)"}}, ¬\r      {label:"ribbon", entries:{"$(RIBBON_SRC)"}}, ¬\r        {label:"propgrid", entries:{"$(PROPGRID_SRC)"}}, ¬\r    {label:"richtext", entries:{"$(RICHTEXT_SRC)"}}, ¬\r    {label:"stc", entries:{"$(STC_SRC)"}}, ¬\r      {label:"libtiff", entries:{"$(wxtiff)"}}, ¬\r   {label:"libjpeg", entries:{"$(wxjpeg)"}}, ¬\r   {label:"libpng", entries:{"$(wxpng)"}}, ¬\r     {label:"libregex", entries:{"$(wxregex)"}}, ¬\r {label:"libscintilla", entries:{"$(wxscintilla)"}}, ¬\r {label:"libexpat", entries:{"$(wxexpat)"}} ¬\r          }}\rmakeProject(theProject)\r\r\r
\ No newline at end of file
+global oldDelimiters
+global variables
+global variablesRef
+global bakefilesXML
+global bakefilesXMLRef
+global projectFile
+
+global osxBuildFolder
+
+property test : false
+
+-- retrieves the files from the xml node including optional conditions
+on parseSources(theName, theElement, theVariables, theConditions)
+       set AppleScript's text item delimiters to " "
+       set allElements to {}
+       repeat with currElement in XML contents of theElement
+               if class of currElement is text then
+                       set allElements to allElements & (every text item of currElement)
+               else
+                       if class of currElement is XML element and XML tag of currElement is "if" then
+                               if (cond of XML attributes of currElement is in theConditions) then
+                                       set allElements to allElements & (every text item of (item 1 of XML contents of currElement))
+                               end if
+                       end if
+               end if
+       end repeat
+       set AppleScript's text item delimiters to oldDelimiters
+       copy {varname:theName, entries:allElements} to end of theVariables
+end parseSources
+
+on parseEntry(theElement, theVariables, theConditions)
+       set theName to var of XML attributes of theElement
+       parseSources(theName, theElement, theVariables, theConditions)
+end parseEntry
+
+on parseLib(theElement, theVariables, theConditions)
+       set theName to |id| of XML attributes of theElement
+       repeat with currElement in XML contents of theElement
+               if class of currElement is XML element and XML tag of currElement is "sources" then
+                       parseSources(theName, currElement, theVariables, theConditions)
+               end if
+       end repeat
+end parseLib
+
+on parseNode(anElement, theVariables, theConditions)
+       if class of anElement is XML element and ¬
+               XML tag of anElement is "set" then
+               parseEntry(anElement, theVariables, theConditions)
+       else
+               if class of anElement is XML element and ¬
+                       XML tag of anElement is "lib" then
+                       parseLib(anElement, theVariables, theConditions)
+               end if
+       end if
+end parseNode
+
+-- iterates through the entire xml tree and populates the variables
+on parseFiles(theXML, theVariables, theConditions)
+       if class of theXML is XML element or class of theXML is XML document then
+               repeat with anElement in XML contents of theXML
+                       try
+                               parseNode(anElement, theVariables, theConditions)
+                       on error number -1728
+                               -- ignore this error
+                       end try
+               end repeat
+       else if class of theXML is list then
+               repeat with anElement in theXML
+                       try
+                               parseNode(anElement, theVariables, theConditions)
+                       on error number -1728
+                               -- ignore this error
+                       end try
+               end repeat
+       end if
+end parseFiles
+
+-- gets the entries of the variable named theName
+on getVar(theName)
+       repeat with anElement in variablesRef
+               if (varname of anElement is theName) then
+                       return entries of anElement
+               end if
+       end repeat
+end getVar
+
+-- adds sources from fileList to a group named container
+on addNode(theContainer, fileList)
+       tell application "Xcode"
+               tell project 1
+                       set theTargets to targets
+                       repeat with listItem in fileList
+                               if (listItem starts with "$(") then
+                                       set AppleScript's text item delimiters to ""
+                                       set variableName to (characters 3 through ((length of listItem) - 1) of listItem) as text
+                                       set AppleScript's text item delimiters to oldDelimiters
+                                       my addNode(theContainer, my getVar(variableName))
+                               else
+                                       set AppleScript's text item delimiters to "/"
+                                       set currPath to every text item in listItem
+                                       set currFile to "../../" & listItem
+                                       set currFileName to (item -1 in currPath)
+                                       set currGroup to (items 1 through -2 in currPath as text)
+                                       set AppleScript's text item delimiters to oldDelimiters
+                                       try
+                                               set theGroup to group theContainer
+                                       on error
+                                               tell root group
+                                                       make new group with properties {name:theContainer}
+                                               end tell
+                                       end try
+                                       tell group theContainer
+                                               try
+                                                       set theGroup to group named currGroup
+                                               on error
+                                                       make new group with properties {name:currGroup}
+                                               end try
+                                               tell group currGroup
+                                                       set newFile to make new file reference with properties {name:currFileName, path:currFile, path type:project relative}
+                                                       repeat with theTarget in theTargets
+                                                               add newFile to (get compile sources phase of theTarget)
+                                                       end repeat
+                                               end tell
+                                       end tell
+                               end if
+                       end repeat
+               end tell
+       end tell
+end addNode
+
+-- retrieves contents of file at posixFilePath
+on readFile(posixFilePath)
+       set fileRef to open for access POSIX file posixFilePath
+       set theData to read fileRef
+       close access fileRef
+       return theData
+end readFile
+
+on init()
+       tell application "Xcode"
+               quit
+       end tell
+       set variablesRef to a reference to variables
+       set bakefilesXMLRef to a reference to bakefilesXML
+       set oldDelimiters to AppleScript's text item delimiters
+       tell application "Finder"
+               set osxBuildFolder to POSIX path of ((folder of (path to me)) as Unicode text)
+       end tell
+end init
+
+-- reads the files list and evaluates the conditions
+on readFilesList(theFiles, theConditions)
+       set variables to {}
+       repeat with theFile in theFiles
+               set bakefilesXML to parse XML (readFile(osxBuildFolder & theFile))
+               parseFiles(bakefilesXMLRef, variablesRef, theConditions)
+       end repeat
+end readFilesList
+
+-- creates a new project file from the respective template
+on instantiateProject(theProject)
+       set projectName to projectName of theProject
+       set template to POSIX file (osxBuildFolder & projectName & "_in.xcodeproj")
+       set projectFile to POSIX file (osxBuildFolder & projectName & ".xcodeproj")
+       tell application "Finder"
+               try
+                       delete file projectFile
+               end try
+               set duplicateProject to duplicate template with replace
+               set name of duplicateProject to (projectName & ".xcodeproj")
+       end tell
+end instantiateProject
+
+-- adds the source files of the nodes of theProject to the xcode project
+on populateProject(theProject)
+       tell application "Xcode"
+               open projectFile
+       end tell
+       repeat with theNode in nodes of theProject
+               -- reopen xcode for each pass, as otherwise the undomanager
+               -- happens to crash quite frequently
+               addNode(label of theNode, entries of theNode)
+       end repeat
+       tell application "Xcode"
+               quit
+       end tell
+end populateProject
+
+on makeProject(theProject)
+       instantiateProject(theProject)
+       readFilesList(bklfiles of theProject, conditions of theProject)
+       populateProject(theProject)
+end makeProject
+
+-- main
+
+init()
+set theProject to {conditions:{"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_CARBON'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}, projectName:¬
+       "wxcarbon", bklfiles:{¬
+       "../bakefiles/files.bkl", "../bakefiles/regex.bkl", "../bakefiles/tiff.bkl", "../bakefiles/png.bkl", "../bakefiles/jpeg.bkl", "../bakefiles/scintilla.bkl", "../bakefiles/expat.bkl"}, nodes:{¬
+       {label:"base", entries:{"$(BASE_SRC)"}}, ¬
+       {label:"base", entries:{"$(BASE_AND_GUI_SRC)"}}, ¬
+       {label:"core", entries:{"$(CORE_SRC)"}}, ¬
+       {label:"net", entries:{"$(NET_SRC)"}}, ¬
+       {label:"adv", entries:{"$(ADVANCED_SRC)"}}, ¬
+       {label:"media", entries:{"$(MEDIA_SRC)"}}, ¬
+       {label:"html", entries:{"$(HTML_SRC)"}}, ¬
+       {label:"xrc", entries:{"$(XRC_SRC)"}}, ¬
+       {label:"xml", entries:{"$(XML_SRC)"}}, ¬
+       {label:"opengl", entries:{"$(OPENGL_SRC)"}}, ¬
+       {label:"aui", entries:{"$(AUI_SRC)"}}, ¬
+       {label:"ribbon", entries:{"$(RIBBON_SRC)"}}, ¬
+       {label:"propgrid", entries:{"$(PROPGRID_SRC)"}}, ¬
+       {label:"richtext", entries:{"$(RICHTEXT_SRC)"}}, ¬
+       {label:"stc", entries:{"$(STC_SRC)"}}, ¬
+       {label:"libtiff", entries:{"$(wxtiff)"}}, ¬
+       {label:"libjpeg", entries:{"$(wxjpeg)"}}, ¬
+       {label:"libpng", entries:{"$(wxpng)"}}, ¬
+       {label:"libregex", entries:{"$(wxregex)"}}, ¬
+       {label:"libscintilla", entries:{"$(wxscintilla)"}}, ¬
+       {label:"libexpat", entries:{"$(wxexpat)"}} ¬
+               }}
+makeProject(theProject)
+
+set theProject to {conditions:{"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_COCOA'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}, projectName:¬
+       "wxcocoa", bklfiles:{¬
+       "../bakefiles/files.bkl", "../bakefiles/regex.bkl", "../bakefiles/tiff.bkl", "../bakefiles/png.bkl", "../bakefiles/jpeg.bkl", "../bakefiles/scintilla.bkl", "../bakefiles/expat.bkl"}, nodes:{¬
+       {label:"base", entries:{"$(BASE_SRC)"}}, ¬
+       {label:"base", entries:{"$(BASE_AND_GUI_SRC)"}}, ¬
+       {label:"core", entries:{"$(CORE_SRC)"}}, ¬
+       {label:"net", entries:{"$(NET_SRC)"}}, ¬
+       {label:"adv", entries:{"$(ADVANCED_SRC)"}}, ¬
+       {label:"media", entries:{"$(MEDIA_SRC)"}}, ¬
+       {label:"html", entries:{"$(HTML_SRC)"}}, ¬
+       {label:"xrc", entries:{"$(XRC_SRC)"}}, ¬
+       {label:"xml", entries:{"$(XML_SRC)"}}, ¬
+       {label:"opengl", entries:{"$(OPENGL_SRC)"}}, ¬
+       {label:"aui", entries:{"$(AUI_SRC)"}}, ¬
+       {label:"ribbon", entries:{"$(RIBBON_SRC)"}}, ¬
+       {label:"propgrid", entries:{"$(PROPGRID_SRC)"}}, ¬
+       {label:"richtext", entries:{"$(RICHTEXT_SRC)"}}, ¬
+       {label:"stc", entries:{"$(STC_SRC)"}}, ¬
+       {label:"libtiff", entries:{"$(wxtiff)"}}, ¬
+       {label:"libjpeg", entries:{"$(wxjpeg)"}}, ¬
+       {label:"libpng", entries:{"$(wxpng)"}}, ¬
+       {label:"libregex", entries:{"$(wxregex)"}}, ¬
+       {label:"libscintilla", entries:{"$(wxscintilla)"}}, ¬
+       {label:"libexpat", entries:{"$(wxexpat)"}} ¬
+               }}
+makeProject(theProject)
+
+set theProject to {conditions:{"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_IPHONE'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}, projectName:¬
+       "wxiphone", bklfiles:{¬
+       "../bakefiles/files.bkl", "../bakefiles/regex.bkl", "../bakefiles/tiff.bkl", "../bakefiles/png.bkl", "../bakefiles/jpeg.bkl", "../bakefiles/scintilla.bkl", "../bakefiles/expat.bkl"}, nodes:{¬
+       {label:"base", entries:{"$(BASE_SRC)"}}, ¬
+       {label:"base", entries:{"$(BASE_AND_GUI_SRC)"}}, ¬
+       {label:"core", entries:{"$(CORE_SRC)"}}, ¬
+       {label:"net", entries:{"$(NET_SRC)"}}, ¬
+       {label:"adv", entries:{"$(ADVANCED_SRC)"}}, ¬
+       {label:"media", entries:{"$(MEDIA_SRC)"}}, ¬
+       {label:"html", entries:{"$(HTML_SRC)"}}, ¬
+       {label:"xrc", entries:{"$(XRC_SRC)"}}, ¬
+       {label:"xml", entries:{"$(XML_SRC)"}}, ¬
+       {label:"opengl", entries:{"$(OPENGL_SRC)"}}, ¬
+       {label:"aui", entries:{"$(AUI_SRC)"}}, ¬
+       {label:"ribbon", entries:{"$(RIBBON_SRC)"}}, ¬
+       {label:"propgrid", entries:{"$(PROPGRID_SRC)"}}, ¬
+       {label:"richtext", entries:{"$(RICHTEXT_SRC)"}}, ¬
+       {label:"stc", entries:{"$(STC_SRC)"}}, ¬
+       {label:"libtiff", entries:{"$(wxtiff)"}}, ¬
+       {label:"libjpeg", entries:{"$(wxjpeg)"}}, ¬
+       {label:"libpng", entries:{"$(wxpng)"}}, ¬
+       {label:"libregex", entries:{"$(wxregex)"}}, ¬
+       {label:"libscintilla", entries:{"$(wxscintilla)"}}, ¬
+       {label:"libexpat", entries:{"$(wxexpat)"}} ¬
+               }}
+makeProject(theProject)
+
+