[
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: maven\n  directory: /\n  schedule:\n    interval: weekly\n- package-ecosystem: github-actions\n  directory: /\n  schedule:\n    interval: weekly\n"
  },
  {
    "path": ".github/release-drafter.yml",
    "content": "_extends: .github\n"
  },
  {
    "path": ".github/workflows/cd.yaml",
    "content": "# Note: additional setup is required, see https://www.jenkins.io/redirect/continuous-delivery-of-plugins\n\nname: cd\non:\n  workflow_dispatch:\n  check_run:\n    types:\n      - completed\n\njobs:\n  validate:\n    runs-on: ubuntu-latest\n    outputs:\n      should_release: ${{ steps.verify-ci-status.outputs.result == 'success' && steps.interesting-categories.outputs.interesting == 'true' }}\n    steps:\n      - name: Verify CI status\n        uses: jenkins-infra/verify-ci-status-action@v1.2.1\n        id: verify-ci-status\n        with:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          output_result: true\n\n      - name: Release Drafter\n        uses: release-drafter/release-drafter@v5\n        if: steps.verify-ci-status.outputs.result == 'success'\n        with:\n          name: next\n          tag: next\n          version: next\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Check interesting categories\n        uses: jenkins-infra/interesting-category-action@v1.2.0\n        id: interesting-categories\n        if: steps.verify-ci-status.outputs.result == 'success'\n        with:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n  release:\n    runs-on: ubuntu-latest\n    needs: [validate]\n    if: needs.validate.outputs.should_release == 'true'\n    steps:\n    - name: Check out\n      uses: actions/checkout@v3\n      with:\n        fetch-depth: 0\n\n    - name: Set up JDK 8\n      uses: actions/setup-java@v3\n      with:\n        distribution: temurin\n        java-version: 8\n\n    - name: Release\n      uses: jenkins-infra/jenkins-maven-cd-action@v1.3.1\n      with:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}\n        MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "target\nwork\n.idea\ntest-*\n*.iml\n.DS_Store\n*.orig\n/examples\nTEST-*\n"
  },
  {
    "path": ".mvn/extensions.xml",
    "content": "<extensions xmlns=\"http://maven.apache.org/EXTENSIONS/1.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd\">\n  <extension>\n    <groupId>io.jenkins.tools.incrementals</groupId>\n    <artifactId>git-changelist-maven-extension</artifactId>\n    <version>1.3</version>\n  </extension>\n</extensions>\n"
  },
  {
    "path": ".mvn/maven.config",
    "content": "-Pconsume-incrementals\n-Pmight-produce-incrementals\n-Dchangelist.format=%d.v%s\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "Changelog\n===\n\n### Newer versions\n\nSee [GitHub releases](https://github.com/jenkinsci/xcode-plugin/releases)\n\n#### Version 2.0.14 (14th Nov 2019)\n-   ##### Fix backward compatibility problem at Import Developer Profile.\n\n#### Version 2.0.13 (14th Nov 2019)\n-   ##### Information to access the macOS keychain has been moved to credentials.\n-   Fixed a bug in the project parser when multiple projects are in the workspace. ([JENKINS-59523](https://issues.jenkins-ci.org/browse/JENKINS-59523), [JENKINS-59609](https://issues.jenkins-ci.org/browse/JENKINS-59609))\n\n#### Version 2.0.12 (27th May 2019)\n\n-   ##### Allow to unlock/lock keychain on demand. ([JENKINS-56909](https://issues.jenkins-ci.org/browse/JENKINS-56909))\n\n-   Modified to encrypt the keychain password. ([PR\n    \\#102](https://github.com/jenkinsci/xcode-plugin/pull/102))\n-   Fix display bug developer profile credentials and more. ([PR\n    \\#103](https://github.com/jenkinsci/xcode-plugin/pull/103))\n\n#### Version 2.0.11 (19th Feb 2019)\n\n-   ##### Added a function to obtain the status of the test from the outline of the test result 'TestSummaries.plist'.\n\n#### Version 2.0.10 (19th Nov 2018)\n\n-   ##### Fix broken Xcode Project Parser. ([JENKINS-54414](http://JENKINS-54414), [JENKINS-54113](https://issues.jenkins-ci.org/browse/JENKINS-54113))\n\n#### Version 2.0.9 (2nd Nov 2018)\n\n-   ##### Added a option to use the 'Legacy Build System' instead of 'New Builld System' which became available from Xcode 9.\n\n#### Version 2.0.8 (10th Oct 2018)\n\n-   Corresponds when there is no DEVELOPMENT\\_TEAM entry in the old\n    Xcode project.\n-   Delete unnecessary error messages.\n-   When copying the provisioning profile from the project location, it\n    needs to be done before Xcode compilation, so it is fixed.\n-   Fixed a bug that error message got mixed when parsing provisioning\n    profile and analysis failed.\n\n#### Version 2.0.7 (20th Sep 2018)\n\n-   Added the ability to copy provisioning profile files to manual code\n    signing.\n-   Change the help for importing developer profile to more detailed\n    one.\n-   Enhance backward compatibility.\n-   Added a function to retrieve information necessary for CodeSign from\n    Xcode project.\n\n#### Version 2.0.6 (16th Aug 2018)\n\n-   Fixed a bug that key chain was not unlocked properly when importing\n    developer profile to keychain.\n-   Added input validation when setting up developer profile loader.\n-   Added input validation when setting up export IPA.\n-   Fix some bugs.\n\n#### Version 2.0.5 (9th Aug 2018)\n\n-   More compatibility for Pipeline.\n-   Added function to import developer profile into existing keychain.\n-   Added a function to set exportOptions.plist an option for deleting\n    Swift symbols when exporting IPA.\n\n#### Version 2.0.4 (22th Jun 2018)\n\n-   I will display an error message if the developer profile is not\n    loaded.\n\n#### Version 2.0.3 (18th Jun 2018)\n\n-   Implemented the ability to export IPA files from already compiled\n    archives.\n-   [JENKINS-50266](https://issues.jenkins-ci.org/browse/JENKINS-50266)\n    : Fix custom xcodebuild arguments not passed through to export\n    archive step.\n-   [JENKINS-51418](https://issues.jenkins-ci.org/browse/JENKINS-51418)\n    : Fix to always be able to use developer team ID as a parameter\n    regardless of automatic code signature.\n-   Fix the Plugin is abnormally terminate if the out of order of lines\n    from Xcodebuild output is changed.\n-   Added a function to retrieve necessary information for code\n    signature from compiled archive.\n-   Support multiple versions of Xcode without using 'EnvInject Plugin'.\n\n#### Version 2.0.2 (30th Apr 2018)\n\n-   We released again due to infrastructure related problems, but the\n    contents are the same as Ver 2.0.1\n\n#### Version 2.0.1 (26th Apr 2018)\n\n-   Supports Xcode 9 ([PR\n    \\#86](https://github.com/jenkinsci/xcode-plugin/pull/86),\n    [PR\\#87](https://github.com/jenkinsci/xcode-plugin/pull/87), [JENKINS-47744](https://issues.jenkins-ci.org/browse/JENKINS-45509), [JENKINS-45509](https://issues.jenkins-ci.org/browse/JENKINS-45509))\n-   Adding Pipeline support for importDeveloperProfile and adding\n    symbols ([PR\n    \\#89](https://github.com/jenkinsci/xcode-plugin/pull/89))\n\n#### Version 2.0.0 (24th May 2017)\n\n-    The plugin now requires Java 7 and Jenkins core \\>= 1.625.1\n\n-    The plugin now requires Xcode \\>= 7\n\n-   New : Supports Xcode 7/8\n    ([PR\\#76](https://github.com/jenkinsci/xcode-plugin/pull/76),\n    [PR\\#78](https://github.com/jenkinsci/xcode-plugin/pull/78), [JENKINS-44203](https://issues.jenkins-ci.org/browse/JENKINS-44203){.issue-link}, [JENKINS-44151](https://issues.jenkins-ci.org/browse/JENKINS-44151){.issue-link}, [JENKINS-43226](https://issues.jenkins-ci.org/browse/JENKINS-43226){.issue-link}, [JENKINS-43163](https://issues.jenkins-ci.org/browse/JENKINS-43163){.issue-link}, [JENKINS-38799](https://issues.jenkins-ci.org/browse/JENKINS-38799){.issue-link}, [JENKINS-38777](https://issues.jenkins-ci.org/browse/JENKINS-38777){.issue-link},\n    [JENKINS-34307](https://issues.jenkins-ci.org/browse/JENKINS-34307){.issue-link}) \n    -   Replace 'xcrun PackageApplication' by 'xcodebuild\n        -exportArchive' to package ipa\n\n    -   New Development Team parameter which can be configured globally\n        in Jenkins Global settings or locally at the project level\n\n-   New : Adds regex for parsing UI test failures (for Xcode 8)\n    ([PR\\#75](https://github.com/jenkinsci/xcode-plugin/pull/75), [JENKINS-40938](https://issues.jenkins-ci.org/browse/JENKINS-40938){.issue-link})\n\n-   New : Adds support\n    ([PR\\#74](https://github.com/jenkinsci/xcode-plugin/pull/74), [JENKINS-42457](https://issues.jenkins-ci.org/browse/JENKINS-42457){.issue-link}, [JENKINS-33355](https://issues.jenkins-ci.org/browse/JENKINS-33355){.issue-link})\n\n#### Version 1.4.11 (21th September 2016)\n\nBecause XXXX happens\n\n-   Fix: Support configurable ID for developer profile (JENKINS-32987)\n\n#### Version 1.4.10 (20th September 2016)\n\n-   New: Support configurable ID for developer profile (JENKINS-32987)\n-   New: Allow the option not to sign the IPA with xcrun (JENKINS-32370)\n-   Fix: use textarea for Xcode Build Arguments (JENKINS-30228)\n-   Fix: Generating an archive builds the project twice (JENKINS-30362)\n-   Fix: Allowed the use of environment variables in plist url\n    (JENKINS-27236)\n\n#### Version 1.4.9 (23rd September 2015)\n\n-   Fix: only prepend -allTargets for -project builds (JENKINS-28256)\n-   New: Add support for Xcode 7 date format in Unit Testing build task\n    (pull request xcode-plugin/63)\n\n#### Version 1.4.8 (28th February, 2015)\n\n-   Fix: Add timeout to xcodebuild -list to avoid hang on xcode 6 (pull\n    request xcode-plugin/58)\n-   New: Support multiple targets to be passed into xcodebuild (pull\n    request xcode-plugin/43)\n\n#### Version 1.4.7 (5th January, 2015)\n\n-   Fix: XCTest output parsing: support nested/namespaced test suites\n    (JENKINS-26295)\n-   New: XCTest output parsing: handle tests suites exiting with an\n    error (pull request xcode-plugin/54)\n\n#### Version 1.4.6 (16th December, 2014)\n\n-   Fix: broken dSYM packaging (since 1.4.5)\n-   Fix: BUILD\\_DATE does not produce the correct last modified date if\n    built on a slave machine (pull request xcode-plugin/50)\n-   Fix: make sure to set provideApplicationVersion properly upon\n    upgrade from per-1.4.1 (JENKINS-26027)\n-   New: developerProfileLoader: use show-keychain-info to display job\n    specific keychain information\n-   New: support XC test output (JENKINS-19955)\n-   New: display warning when simulator SDK selected and IPA about to be\n    packaged (JENKINS-21293)\n-   New: document xcodebuildArguments (JENKINS-13930)\n\n#### Version 1.4.5 (10th December, 2014)\n\n-   Fix: only zip the DSYM if the DSYM file was actually created and\n    fail the build if the operation failed\n-   Fix: Fail the build if we fail to create an ipa.\n-   Fix: \"keychain with the same name already exists\" (JENKINS-22130)\n-   New: XCode 6 compatibility (pull request xcode-plugin/48)\n-   New: generate\\_manifest added ability to generate enterprise\n    distribution manifest plist (pull request xcode-plugin/45)\n-   Fix: getKeychain returns a global keychain preferred over path (pull\n    request xcode-plugin/41)\n-   New: Ability to change the Bundle identifier (CFBundleIdentifier)\n    for an xcode build (pull request xcode-plugin/39)\n\n#### Version 1.4.2 (31st December, 2013)\n\n-   Fix: Avoid NPE on plugin version update (JENKINS-19886, pull request\n    xcode-plugin/37)\n\n#### Version 1.4.1 (30th October, 2013)\n\n-   Fix: performance regression in output parsing (JENKINS-20037, pull\n    request xcode-plugin/36)\n\n#### Version 1.4 (2nd Oct, 2013)\n\n-   New: added an option to produce .xcarchive (JENKINS-14719)\n-   Fix: Fixing show-keychain-info call (JENKINS-xcode-plugin/30)\n-   New: Build wrapper to restore the keychain at the end of the build\n    (pull request xcode-plugin/31)\n-   New: Adding the possibility to provide a pattern for the .ipa file\n    name (pull request xcode-plugin/33)\n-   New: Added an ability to import \\*.developerprofile into a build\n    (pull request xcode-plugin/34)\n-   New: UI update: group options into 3 categories (pull request\n    xcode-plugin/28)\n-   New: Introduced the ability to create global keychain configurations\n-   New: Add new option \"allow failing build results\" (pull request\n    xcode-plugin/25)\n-   Fix: xcodebuild output parser is more lenient (pull request\n    xcode-plugin/19)\n-   Fix: Can't add xcodebuild parameters including whitespace\n    (JENKINS-12800)\n-   New: Add a field for entering code signing identity (pull request\n    xcode-plugin/6)\n\n#### Version 1.3.1 (27th March 2012)\n\n-   Fix: Custom xcodebuild arguments values are not persisted\n    (JENKINS-12510).\n\n#### Version 1.3 (20th January 2012)\n\n-   New : Ability to specify custom arguments to xcodebuild (so that\n    values in project file can be overridden). It is needed to specify\n    custom build options to make in-app unit tests work.\n-   New : Ability to disable clean up of test reports on per-target\n    level, so that it is possible to run several targets in single job\n    and not mess-up test reports.\n-   Fix : The plugin fails by searching for a double .app extension\n    while compressing .dsym (JENKINS-12273)\n-   Fix : The plugin fails to delete previous generated IPA results in a\n    failed build (JENKINS-12237).\n-   Fix : The plugin fails to set default keychain when using an\n    alternate (non login) keychain (By default the login keychain is the\n    default keychain) (JENKINS-12217).\n-   Fix : Restore Java 1.5 runtime compatibility. (JENKINS-12378)\n\n#### Version 1.2.2 (19th December 2011)\n\n-   Fix : Build IPA fails if the plugin is launched on a remote agent\n    using a relative path for its FS Root directory (JENKINS-12144)\n\n#### Version 1.2.1 (18th December 2011)\n\n-   Fix : Build IPA switch doesn't work properly for a default Xcode\n    project always results in FATAL error (JENKINS-12089)\n\n#### Version 1.2 (8th December 2011)\n\n-   New build parameter to specify the build output directory. This\n    overrides the setting in the user's project file, so it will be put\n    into a known directory rather than XcodeDerivedData, etc. This makes\n    it much easier to set up subsequent build steps in Jenkins that do\n    something with the output of the build. It does this by passing the\n    setting CONFIGURATION\\_BUILD\\_DIR to xcodebuild if a path is set for\n    this new job config value.\n-   Add support for building schemes and workspaces : The plugin now\n    supports two extra configuration parameters `xcodeScheme` and\n    `xcodeWorkspaceFile`. The scheme maps to xcodebuild's parameter\n    \"-scheme\" and the workspace to \"-workspace\". The scheme takes\n    precedence over the target setting and the workspace takes\n    precedence over the project setting.\n\n#### Version 1.1 (29th November 2011)\n\n-   Upgrade the token macro plugin to version 1.5.1 to support\n    environment and build variables (JENKINS-11892)\n-   New configuration parameter to set the SYMROOT value passed to the\n    build. This parameter accepts environment and build variables and\n    Macros (JENKINS-11813)\n-   Various code cleanup and improvements.\n\n#### Version 1.0.1 (14th November 2011)\n\n-   Minor fix about the default value and the documentation of the\n    keystore path parameter.\n\n#### Version 1.0 (14th November 2011)\n\n-   Initiated from [Ray Yamamoto Hilton's Xcode plugin for\n    Hudson](http://rayh.com.au/xcode-hudson-plugin) with few changes :\n    -   It improves jenkins compatibility, and is available in its\n        update center.\n    -   It uses the to configure values of `CFBundleVersion` and\n        `CFBundleShortVersionString`\n    -   It allows to configure the keychain to use and to unlock it\n    -   It is ready for internationalization\n\nIf you previously used the version provided by Ray you should be able to\ntest this one in parallel as it has a new identity. Also you'll have to\nreconfigure a large part of it if you want to upgrade thus don't forget\nto save your settings.\n\n"
  },
  {
    "path": "Jenkinsfile",
    "content": "buildPlugin(platforms: ['linux'])\n"
  },
  {
    "path": "README.md",
    "content": "Xcode plugin\n------------\n\nThis plugin adds the ability to call Xcode command line tools to automate build and packaging iOS applications (iPhone, iPad, ...).\n*  Report all issues or features requests in Jira : https://issues.jenkins-ci.org/issues/?jql=component%20%3D%20xcode-plugin\n\nContact the Jenkins Community by [mail](http://jenkins-ci.org/content/mailing-lists) or [irc](http://jenkins-ci.org/content/chat) to have support.\n\n*The maintainer is looking for a co-maintainer.\nI need your help!!*\n\nTo help us maintain the plugin, you can take contact to jerome.lacoste\n*at* gmail.com in particular if you are able to test upcoming releases\n\nThank you!\n\nA problem, An idea ?\n\n*Please use our tasks and issues tracker to report bugs, improvements or\nnew feature.*\n\n-   [Report a\n    bug](https://issues.jenkins-ci.org/secure/CreateIssueDetails!init.jspa?Create=Create&components=16124&pid=10172&issuetype=1)\n-   [Ask for a new\n    feature](https://issues.jenkins-ci.org/secure/CreateIssueDetails!init.jspa?Create=Create&components=16124&pid=10172&issuetype=2)\n-   [Ask for an improvement of an existing\n    feature](https://issues.jenkins-ci.org/secure/CreateIssueDetails!init.jspa?Create=Create&components=16124&pid=10172&issuetype=4)\n\nAlso if you want to propose some code change using a Github pull\nrequest, please open also a Jira issue. It is easier for developers to\ntrack them.\n\n*Important!*\n\nNewesth version is compatibility with the previous version priour 2.0.12 is maintained.\nHowever, major changes have been made to the handling of macOS\nkeychains.\n\nInformation to access the keychain is moved from configuration to\ncredentials.  \nAfter that, the information for accessing the keychain must be\nregistered in the credentials.\n\nThis plugin adds the ability to call Xcode command line tools to\nautomate build and packaging iOS applications (iPhone, iPad, ...).\n\n#### Features\n\n##### Versioning\n\nThis builder can invoke agvtool to dynamically update the\n`CFBundleVersion` (a.k.a. Technical Version) or\n`CFBundleShortVersionString` (a.k.a. Marketing Version). It supports all\nmacros from the . For example the value `${BUILD_NUMBER`} will be\nreplaced with the current build number. We advice you to generate a\nunique value for each build for the `CFBundleVersion` if you want for\nexample deploy it into a private store. In that case you can use for\nexample : `${JOB_NAME}-${BUILD_NUMBER`}\n\n##### Building\n\nThe target (optional), configuration (e.g. `Debug`, `Release`) and SDK\n(optional) can be specified in the per-project config along with whether\nto perform a clean before the build phase.\n\n##### Packaging\n\nThe builder can be used to package the .app into a .ipa. Since a .app is\nactually a directory, it can be awkward to work with and, especially,\ndistribute. We can simplify this by packaging the .app into a single\n.ipa file, which is just a  \nzip file with a well-known internal structure\n\n##### Signing\n\nThis plugin has two features that help you simplify the code signing\nprocess.\n\n###### Allowing Jenkins to stage developer profile\n\nThis plugin builds on top of to allow you to store your Apple Developer\nProfile (\\*.developerprofile) file. [This file contains a code signing\nprivate key, corresponding developer/distribution certificates, and\nmobile provisioning\nprofiles](http://stackoverflow.com/questions/15154211/what-data-are-stored-in-developer-profile-file-exported-from-xcode).\nYou can [create this file from your\nXCode](http://stackoverflow.com/questions/10404931/copying-keys-and-certificates-to-another-one-mac-for-iphone-development).\n\nTo upload the developer profile into Jenkins, go to \"Manage Credentials\"\nin the system configuration page, and select \"Apple Developer Profile\"\nfrom the \"Add\" button. See for further details.\n\nTo use this profile for signing, add \"Import developer profile\" as a\nbuild step before you run xcode, and select the developer profile to\nimport into the build machine. This build step will install the\ndeveloper profile into the slave's keychain.\n\n###### Work with existing populated keychains\n\nIf you create a dedicated keychain that stores the code signing private\nkey and certificate on every build slave, you can configure the plugin\nto just unlock this keychain (so that xcode can use it for signing)\n\nUnlocking\n\nIf you store your keys in the user keychain (most probably) and if you\nrun jenkins as daemon, make sure you installed a recent version of\njenkins for Mac, or configured the daemon to create a session (through\nthe CreationSession=true parameter in your org.jenkins-ci.plist daemon\nconfig file). [See\nalso](http://stackoverflow.com/questions/9626447/unable-to-sign-ios-builds-with-jenkins)\n\nTimeouts\n\nThe keychain has a default timeout of 300 seconds. One can override it\nusing the security set-keychain-settings command, which isn't supported\nin the plugin today. Support in the plugin could be improved by adding\noptions to modify the timeout as part of the build process. See\n[JENKINS-17184](https://issues.jenkins-ci.org/browse/JENKINS-17184).\n\n##### Unit Testing\n\nThis plugin will listen to the xcodebuild output when running OCUnit or\nXC tests and write out JUnit-format test reports that Jenkins can\nunderstand. Jenkins will then use these to publish test failure reports\nand graphs.\n\n##### Sample of the configuration panel\n\n![](docs/images/40d7bd30d112f7b90d88d57fce45ecb2abe29c2e.png)\n\n#### Documentation\n\n##### Installation guide\n\nObviously, the build machine has to be an OSX machine with XCode\ndeveloper tools installed.  \nCertificates, Identities and Provisions must be installed on the build\nmachine separately.  \nJust install the latest version of the plugin from the update center and\nconfigure a freestyle job (see \\#Usage Guide) that will use your OSX\nnode (If your central instance isn't running under OSX).  \nIf xcode related binaries aren't stored in the default location, update\nthe global configuration of the plugin (Manage Jenkins -\\> Configure\nSystem)  \n![](docs/images/46781a5731ff4fb8b72f4d780b2b02a402f34a2e.png)\n\nIf you want to use multiple versions of Xcode to build your application,\nuse ’Global Tool Configuration’ to register the distinguished name and\nlocation of the installed Xcode.\n![](docs/images/f3e88bf4404d395d55e82786142b77ee217ddbd1.png)\n\n##### Usage guide\n\n###### Import developer profile step\n\nBy adding the Import developer profile step to Build, you can import\ndeveloper profiles exported to Xcode into temporary keychains or\nexisting keychains.  \nThe developer profile contains a set of certificates, secret keys and\nprovisioning profiles necessary for compiling and signing applications,\nwhich is useful for distributing with multiple Jenkins nodes.\n\n###### Import developer profile configuration parameters\n\n| Parameter                     | Pipeline Parameter         | Since version | Description                                                                                                                                                                                                                                                                                                                                |\n|-------------------------------|----------------------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Developer Profile             | profileId                  | 2.0.1         | Select the developer profile you exported from Xcode Preference to import into the keychain. Developer profile must be registered with Jenkins in advance by \"Credentials\". If you do not select this column, you can specify the identifier of the developer profile registered in \"Credentials\" with the next \"Developer Profile ID\".    |\n| Import into existing Keychain | importIntoExistingKeychain | 2.0.6         | If it is checked, the developer profile will be imported into the existing keychain. If not checked, create a new key chain with the file name \"jenkins-\" + \"job name\" newly, and import the developer profile into this. (In this case, a random character string is automatically generated and used for the password)                   |\n| Target keychain               | keychainId                 | 2.0.13        | The ID of the configured keychain to use to import certificates from developer profile to sign the package.                                                                                                                                                                                                                              |\n| Target keychain               | keychainName<br>This has been deprecated and has now been replaced by \"keychainId\".| 2.0.6         | The name of the configured keychain to use to import certificates from developer profile to sign the package.                                                                                                                                                                                                                              |\n| Keychain path                 | keychainPath               | 2.0.6         | Keychain path to import developer profile.                                                                                                                                                                                                                                                                                                 |\n| Keychain password             | keychainPwd                | 2.0.6         | Password to unlock keychain importing developer profile.                                                                                                                                                                                                                                                                                   |\n\nLimitations\n\nThe Xcode Integration Plugin has the function of importing the secret\nkey and certificate of the developer account into the temporary key\nchain, but as the constraint of macOS can not handle different key chain\nfor each session, the job handling the key chain If you execute them in\nparallel, this will not work properly.\n\nAs one of workarounds, it is impossible to limit the maximum number of\njobs around Jenkins' node to 1 and to execute multiple nodes with\ndifferent macOS accounts.  \n\n###### Setting up a build step\n\nAdd the XCode build step to a free-style project and set the target\n(e.g. `MyApp`), configuration (e.g. `Release`) and check the build IPA\nand update version number options. This will give you a single,\nversioned .ipa file. You can also select to clean the project before a\nbuild; while this will make sure that the project is starting from a\nclean state, it will make large projects take a lot longer.\n\n###### Setting up a unit test step\n\nAdd the XCode build step and this time specify your unit test target\n(e.g. `MyAppTests`), configuration (e.g. `Debug`) and the SDK (e.g.\n`Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.1.sdk/`).  \nLeave all the checkboxes unselected. The SDK needs to be supplied here\nas the unit tests will only be run when building under the simulator's\nSDK.  \nCheck the \"Publish JUnit test result report\" option in the project\nconfig and set the value `\"*``/test-reports/``*.xml\"` under \"Test report\nXMLs\". This will tell Jenkins to pick up the JUnit-format test reports.\n\n###### XCode Builder configuration parameters\n\n| Parameter                     | Pipeline Parameter        | Since version | Description                                                                                                                                                                                                                                                                                                                                |\n|-------------------------------|---------------------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n|Xcode Workspace File           |xcodeWorkspaceFile         |1.2            |Only needed if you want to compile a workspace instead of a project. It takes precedence over 'Xcode Project File' setting and this job 'configuration' parameter.\"|\n|Xcode Tools Version            |xcodeName                  |2.0.3\t        |You can select the version of Xcode set by 'Global Tool Configuration' by plugin setting.<br>If you choose the 'System Default' for Xcode version, plugin will not do anything, so you can switch Xcode using environment variable 'DEVELOPER_DIR' as well.   \n|Xcode Schema File\t            |xcodeSchema\t            |1.2\t        |Needed if you want to compile for a specific schema instead of a target, or if you want to generate an archive or an IPA.|\n|Xcode Project File             |xcodeProjectFile       \t|1.0            |If there is more than one XCode project file in the project path, you will need to specify the file name of the project you wish to build.<br>If you need to build all project, you will need to create an XCode build step for each one manually.|\n|Xcode Project Directory        |xcodeProjectPath\t        |1.0            |This is the relative path from the workspace to the directory that contains the XCode project file.<br>You only need to supply this value if the XCode project you wish to build is not in the root of the workspace.|\n|Use Legacy Build System?   \t|useLegacyBuildSystem\t    |2.0.9      \t|Use the old 'Legacy Build System' instead of 'New Build System' of Xcode 9 and later.|\n|Upload Symbols?\t            |uploadSymbols\t            |2.0.3\t        |If Checked, include symbols in IPA exporting for App Store.<br>The default is \"Yes\" (check is on).|\n|Upload Bitcode?\t            |uploadBitcode\t            |2.0.3\t        |If Checked, include bitcode in IPA exporting for App Store.<br>The default is \"Yes\" (check is on).|\n|Unlock Keychain?           \t|unlockKeychain\t            |1.0\t        |Automatically unlock the keychain before signing the archive?|\n|Thinning\t                    |thinning\t                |2.0.3          |Set this to thin the packages for one or more devices in Xcode when exporting IPA by methods other than App Store.<br><br>Available options are:<br><br>- \\<none> (Xcode export non-thinned generic application),<br>- <thin-for-all-variants> (Xcode export universal applications and all available thinning variants),<br> -Or for a model identifier a specific device (eg \"iPhone 7, 1\").<br>The default is \\<none>.|\n|Technical version\t            |cfBundleVersionValue   \t|1.0            |This will set the CFBundleVersion to the specified string. Supports all macros and also environment and build variables from the Token Macro Plugin. For example the value ${BUILD_NUMBER} will be replaced with the current build number. We advice you to generate a unique value for each build if you want for example deploy it into a private store. In that case you can use for example : ${JOB_NAME}-${BUILD_NUMBER}|\n|Target                     \t|target\t                    |1.0            |The target to build. If left empty, this will build all targets in the project. If you wish to build your binary and the unit test module, it is best to do this as two separate steps each with their own target. This was, the iPhone Simulator SDK can be specified for the unit tests.|\n|SYMROOT                        |symRoot                    |1.1            |You only need to supply this value if you want to specify the SYMROOT path to use. If empty, the default SYMROOT path will be used (it could be different depending of your Xcode version). Supports all macros and also environment and build variables from the Token Macro Plugin. For example you can use the value : ${WORKSPACE}/build|\n|Strip Swift Symbols?\t        |stripSwiftSymbols\t        |2.0.5\t        |If checked, symbols be stripped from Swift libraries when exporting the application to IPA.|\n|SDK\t                        |sdk                    \t|1.0            |You only need to supply this value if you want to specify the SDK to build against. If empty, the SDK will be determined by XCode. If you wish to run OCUnit tests, you will need to use the iPhone Simulator's SDK, for example: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.1.sdk/|\n|ResultBundlePath           \t|resultBundlePath          \t|2.0.11\t        |Leave empty, it will not output a test result and will not analyze the test results. relative to the project-directory.|\n|Provisioning profiles UUID\t    |provisioningProfiles: [provisioningProfileUUID]    |2.0.1\t|Specify the UUID or Specifire of the provisioning profile to use to sign the application. If the location of the provisioning profile is set instead of the UUID or Specifire, read the UUID from the provisioning profile and use that value.     \n|Provisioning Profiles Bundle ID|provisioningProfiles: [provisioningProfileAppId]\t|2.0.1\t|Specify the Bundle ID of the application for which code sign to be performed.<br>If the location of the Info.plist file contained in the compiled archive is set instead of the Bundle ID, read the Bundle ID from the Info.plist file and use that value.<br>Provide version number and run avgtool?\tprovideApplicationVersion\t1.4\tProvide version number and run avgtool before invoking the build.\n|Pack on demand resources?      |~~embedOnDemandResourcesAssetPacksInBundle~~<br>assetPacksInBundle|\t2.0.3\t|Export settings for non App Store.<br>If the application is using on demand resources and this item is on, the asset pack is included in the application bundle, so you can test the app without the server hosting the asset pack.<br>If assetPacksBaseURL is not specified, the default is YES (check is on).|\n|Pack application, build and sign .ipa?\t|buildIpa\t        |1.0\t        |The target to build. If left empty, this will build all targets in the project. If you wish to build your binary and the unit test module, it is best to do this as two separate steps each with their own target. This was, the iPhone Simulator SDK can be specified for the unit tests.|\n|Output directory\t            |ipaOutputDirectory\t        |1.4\t        |The output directory for the .ipa file, relative to the build directory.|\n|On demand resources asset URL\t|~~onDemandResourcesAssetPacksBaseURL~~<br>assetPacksBaseURL\t|2.0.3\t|Export settings for non-App Store.<br>If the application is using an on demand resource and assetPacksInBundle is not YES, this must be the base URL that specifies the host of the asset pack. This will set up the app to download the asset pack from the specified URL. |\n|No Console Log?\t            |noConsoleLog\t            |2.0.1\t        |Checking this option will not log xcode build output to console output.|\n|New bundle ID\t                |bundleID\t                |1.4\t        |The new bundle ID. Usually something like com.companyname.projectname.|\n|Marketing version\t            |cfBundleShortVersionStringValue|1.0        |This will set the CFBundleShortVersionString to the specified string. Supports all macros and also environment and build variables from the Token Macro Plugin.|\n|Manual signing?\t            |manualSigning<br>This has been deprecated and has now been replaced by \"signingMethod\".|2.0.1\t|For this option you need to manually specify the combination of Provisioning profile UUID and BundleID.<br>This will be useful if you want to change the combination of Provisioning Profile and Certificate used for CodeSign when you build the application.|\n|Manifest Plist URL         \t|ipaManifestPlistUrl\t    |1.5\t        |The base URL to use to create a Manifest Plist. If omitted no Manifest Plist will be generated.|\n|Logfile Output directory   \t|logfileOutputDirectory\t    |2.0.1\t        |Specify the directory to output the log of xcodebuild.<br>If you leave it blank, it will be output to \"project directory/builds/${BUILD_NUMBER}/log\" with other logs.<br>If an output path is specified, it is output as a xcodebuild.log file in a relative directory under the \"build output directory\"|\n|Keychain path\t                |keychainPath\t            |1.0\t        |The path of the keychain to use to retrieve certificates to sign the package (default : ${HOME}/Library/Keychains/login.keychain).|\n|Keychain password\t            |keychainPwd\t            |1.0\t        |The password of the keychain to use to retrieve certificates to sign the package.|\n|Keychain Id\t                |keychainId<br>             |2.0.13\t        |The ID of the configured keychain to use to retrieve certificates to sign the package.|\n|Keychain name\t                |keychainName<br>This has been deprecated and has now been replaced by \"keychainId\".|1.4\t        |The name of the configured keychain to use to retrieve certificates to sign the package.|\n|Interpret As Regular Expression|interpretTargetAsRegEx\t    |1.4\t        |Build all entries listed under the \"Targets:\" section of the xcodebuild -list output that match the regexp.|  \n|Info.plist path\t            |bundleIDInfoPlistPath  \t|1.4\t        |The path to the info.plist file which contains the CFBundleIdentifier of your project.<br>Usually something like:<br>${WORKSPACE}/ProjectName/Project-Info.plist|\n|Generate Archive?          \t|generateArchive\t        |2.0\t        |Checking this option will generate an xcarchive of the specified scheme. A workspace and scheme are are also needed for archives.|\n|Full size image URL\t        |fullSizeImageURL\t        |2.0.3      \t|Export settings for non App Store.<br>Specify the URL of the image (512 x 512 pixels) of the icon to be displayed when installing the application using manifest.plist.|\n|Export method\t                |ipaExportMethod\t        |1.4\t        |The export method of the .app to generate the .ipa file. Should be one in 'development', 'ad-hoc', 'enterprise' or 'app-store'.|\n|Display image URL          \t|displayImageURL\t        |2.0.3\t        |Export settings for non App Store.<br>Specify the URL of the image (57 x 57 pixels) of the icon to be displayed when installing the application using manifest.plist.|\n|Development Team ID        \t|developmentTeamID\t        |1.4\t        |The ID of the Apple development team to use to sign the IPA If 'Development Team' is not selected.|\n|Development Team\t            |developmentTeamName\t    |1.4        \t|The name of the configured development team to use to sign the package. As of XCode 8.3, this is required now to sign an ipa (which now uses xcodebuilder).<br>A development team can be configured here by specifying a Development Team ID, or by creating one in the jenkins global configuration.|\n|Custom xcodebuild arguments\t|xcodebuildArguments\t    |1.3\t        |Passing custom arguments is convenient when you need to change some project options for Jenkins build, but don't want them to persist in project file. For example when running application tests, following settings often are nice fit: GCC_SYMBOLS_PRIVATE_EXTERN=NO COPY_PHASE_STRIP=NO. Otherwise Release build will usually fail because it won't be able to find application symbols to link with test bundle. Arguments are currently separated by space, enclosing them in quotes won't help.|\n|Copy provisioning profile  \t|copyProvisioningProfile\t|2.0.7      \t|If Checked, and the filename of provisioning profile is specified in \"Provisioning profile UUID\", the specified file is copied to a predetermined place. (\"/Users/${HOME}/Library/MobileDevice/Provisioning Profiles/\")<br>This can be used to overwrite the contents of the developer profile or system settings in the provisioning profile in the project deployed from SCM etc.<br>If the provisioning profile UUID or Specifire is set in \"provisioning profile UUID\", it does not do anything.<br>The default is \"Yes\" (check is on)|\n|Configuration\t                |configuration\t            |1.0\t        |This is the name of the configuration as defined in the XCode project. By default there are Debug and Release configurations.|\n|Compile Bitcode?\t            |compileBitcode\t            |2.0.3      \t|If checked, Xcode will recompiling Bitcode and exporting IPA for the non App Store.<br>The default is \"Yes\" (check is on).|\n|Code signing settings\t        |signingMethod\t            |2.0.7      \t|This attribute can take one of the following three values.<br>\"automatic\" (Check \"Automatic Signing\")<br>Checking this option will automatically generate Provisioning Profile and certificates for signing application.<br>However, please be aware that using this function will automatically create Provisioning profile and certificates as necessary, so that old Provisioning profile and certificates will be invalid at that time.<br>\"manual\" (Check \"Manual signing\")<br>For this option you need to manually specify the combination of Provisioning profile UUID and BundleID.<br>This will be useful if you want to change the combination of Provisioning Profile and Certificate used for CodeSign when you build the application.<br>\"readFromProject\" (Check \"Read from Xcode Project\")<br>With this option, it automatically retrieve and sets the combination of BundleID and Provisioning profile UUID from the Xcode project file.<br>This is useful when you want to take over the combination of BundleID and Provisioning profile UUID that you used in the Xcode project (GUI).|\n|Clean test reports?\t        |cleanTestReports\t        |1.3\t        |This will delete the processed test reports before invoking the build. Usually it is a good idea only to do it in test targets, otherwise if other Xcode target is built before tests – the build will fail to collect test reports.|\n|Clean ResultBundlePath?    \t|cleanResultBundlePath\t    |2.0.11     \t|This will delete the ResultBundlePath before invoking the build.|\n|Clean before build?\t        |cleanBeforeBuild\t        |1.0            |This will delete the build directories before invoking the build. This will force the rebuilding of ALL dependencies and can make large projects take a lot longer.|\n|Change bundle ID?\t            |changeBundleID\t            |1.4\t        |Checking this option will replace the bundle identifier.<br>You will need to specify which bundle ID (CFBundleIdentifier) to use and where is the Info.plist file located.<br>This is handy for example when you want to use a different code signing identity in your development projects.|\n|Build output directory         |buildDir\t                |1.2            |The value to use for CONFIGURATION_BUILD_DIR setting (BUILD_DIR in >= 2.0.0). You only need to supply this value if you want the product of the XCode build to be in a location other than the one specified in project settings and this job 'SYMROOT' parameter. Supports all macros and also environment and build variables from the Token Macro Plugin. For example you can use the value : ${WORKSPACE}/build|\n|Asset pack URL\t                |assetPackManifestURL\t    |2.0.3\t        |Export settings for non-App Store App.<br>If the application is using on-demand resources and the application will installing OTA with manifest.plist, this must be the base URL that specifies the host of the asset pack. This will set up the app to download the asset pack from the specified URL.|\n|Application URL\t            |appURL\t                    |2.0.3\t        |Specify the URL for installing the application when creating the manifest.plist that is necessary when OTA installing the application from Web pages or email.|\n|Allow failing build results?   |allowFailingBuildResults\t|1.4\t        |Checking this option will prevent this build step from failing if xcodebuild exits with a non-zero return code.|\n|.ipa filename pattern\t        |ipaName\t                |1.4\t        |A pattern for the ipa file name. You may use ${VERSION} and ${BUILD_DATE} (yyyy.MM.dd) in this string|\n\n###### Setting up a Export IPA step\n\nIf you add the Export IPA step and set up the information necessary for\nexporting the IPA file, the location of the archive, the export method,\ncode signature information, etc., you can export the IPA from the\narchive output in the Xcode Build step.\n\n###### Export IPA configuration parameters\n\n| Parameter                     | Pipeline Parameter        | Since version | Description                                                                                                                                                                                                                                                                                                                                |\n|-------------------------------|---------------------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n|Development Team\t            |developmentTeamName\t    |2.0.1\t        |The name of the configured development team to use to sign the package. As of XCode 8.3, this is required now to sign an ipa (which now uses xcodebuilder).<br>A development team can be configured here by specifying a Development Team ID, or by creating one in the jenkins global configuration.|\n|Development Team ID\t        |developmentTeamID\t        |2.0.1\t        |The ID of the Apple development team to use to sign the IPA If 'Development Team' is not selected.\n|Xcode Tools Version\t        |xcodeName\t                |2.0.3\t        |You can select the version of Xcode set by 'Global Tool Configuration' by plugin setting.<br>If you choose the 'System Default' for Xcode version, plugin will not do anything, so you can switch Xcode using environment variable 'DEVELOPER_DIR' as well.   \n|Archive directory\t            |archiveDir\t                |2.0.1\t        |Specify the location of the path (usually BUILD_DIR specified by xcodebuild) to read the Archive for exporting the IPA file.<br>Supports all macros and also environment and build variables from the Token Macro Plugin.<br><br>For example you can use the value :<br>${WORKSPACE}/build\n|Export method\t                |ipaExportMethod\t        |2.0.1\t        |The export method of the .app to generate the .ipa file. Should be one in 'development', 'ad-hoc', 'enterprise' or 'app-store'.\n|.ipa filename pattern\t        |ipaName\t                |2.0.1\t        |A pattern for the ipa file name. You may use ${VERSION} and ${BUILD_DATE} (yyyy.MM.dd) in this string\n|Output directory\t            |ipaOutputDirectory\t        |2.0.1\t        |The output directory for the .ipa file, relative to the build directory.\n|Upload Bitcode?\t            |uploadBitcode\t            |2.0.3\t        |If Checked, include bitcode in IPA exporting for App Store.<br>The default is \"Yes\" (check is on).\n|Upload Symbols?\t            |uploadSymbols\t            |2.0.3\t        |If Checked, include symbols in IPA exporting for App Store.<br>The default is \"Yes\" (check is on).\n|Compile Bitcode?\t            |compileBitcode\t            |2.0.3\t        |If checked, Xcode will recompiling Bitcode and exporting IPA for the non App Store.<br>The default is \"Yes\" (check is on).\n|Thinning\t                    |thinning\t                |2.0.3\t        |Set this to thin the packages for one or more devices in Xcode when exporting IPA by methods other than App Store.<br><br>Available options are:<br>    <none> (Xcode export non-thinned generic application),<br>    <thin-for-all-variants> (Xcode export universal applications and all available thinning variants),<br>    Or for a model identifier a specific device (eg \"iPhone 7, 1\").<br><br>The default is <none>.\n|Pack on demand resources?\t    |assetPacksInBundle         |2.0.3\t        |Export settings for non App Store.<br>If the application is using on demand resources and this item is on, the asset pack is included in the application bundle, so you can test the app without the server hosting the asset pack.<br>If assetPacksBaseURL is not specified, the default is YES (check is on).\n|On demand resources asset URL\t|assetPacksBaseURL\t        |2.0.3\t        |Export settings for non-App Store.<br>If the application is using an on demand resource and assetPacksInBundle is not YES, this must be the base URL that specifies the host of the asset pack. This will set up the app to download the asset pack from the specified URL. \n|Application URL\t            |appURL\t                    |2.0.3\t        |Specify the URL for installing the application when creating the manifest.plist that is necessary when OTA installing the application from Web pages or email.\n|Display image URL\t            |displayImageURL\t        |2.0.3\t        |Export settings for non App Store.<br>Specify the URL of the image (57 x 57 pixels) of the icon to be displayed when installing the application using manifest.plist.\n|Full size image URL\t        |fullSizeImageURL\t        |2.0.3\t        |Export settings for non App Store.<br>Specify the URL of the image (512 x 512 pixels) of the icon to be displayed when installing the application using manifest.plist.\n|Asset pack URL\t                |assetPackManifestURL\t    |2.0.3\t        |Export settings for non-App Store App.<br>If the application is using on-demand resources and the application will installing OTA with manifest.plist, this must be the base URL that specifies the host of the asset pack. This will set up the app to download the asset pack from the specified URL.\n|trip Swift Symbols?\t        |stripSwiftSymbols\t        |2.0.5\t        |If checked, symbols be stripped from Swift libraries when exporting the application to IPA.\n|Manual signing?                |manualSigning<br>This has been deprecated and has now been replaced by \"signingMethod\".|2.0.1|For this option you need to manually specify the combination of Provisioning profile UUID and BundleID.<br>This will be useful if you want to change the combination of Provisioning Profile and Certificate used for CodeSign when you build the application.\n|Code signing settings\t        |signingMethod\t            |2.0.7\t        |This attribute can take one of the following three values.<br>- \"automatic\" (Check \"Automatic Signing\")<br>Checking this option will automatically generate Provisioning Profile and certificates for signing application.<br>However, please be aware that using this function will automatically create Provisioning profile and certificates as necessary, so that old Provisioning profile and certificates will be invalid at that time.<br>- \"manual\" (Check \"Manual signing\")<br>For this option you need to manually specify the combination of Provisioning profile UUID and BundleID.<br>This will be useful if you want to change the combination of Provisioning Profile and Certificate used for CodeSign when you build the application.<br>- \"readFromProject\" (Check \"Read from Xcode Project\")<br>With this option, it automatically retrieve and sets the combination of BundleID and Provisioning profile UUID from the Xcode project file.<br>This is useful when you want to take over the combination of BundleID and Provisioning profile UUID that you used in the Xcode project (GUI).\n|Provisioning Profiles Bundle ID|provisioningProfiles: [provisioningProfileAppId]|2.0.1|Specify the Bundle ID of the application for which code sign to be performed.<br>If the location of the Info.plist file contained in the compiled archive is set instead of the Bundle ID, read the Bundle ID from the Info.plist file and use that value.     \n|Provisioning profiles UUID\t    |provisioningProfiles: [provisioningProfileUUID]|2.0.1|Specify the UUID or Specifire of the provisioning profile to use to sign the application. If the location of the provisioning profile is set instead of the UUID or Specifire, read the UUID from the provisioning profile and use that value.     \n|Unlock Keychain?\t            |unlockKeychain\t            |2.0.1\t        |Automatically unlock the keychain before signing the archive?\n|Copy provisioning profile\t    |copyProvisioningProfile\t|2.0.7\t        |If Checked, and the filename of provisioning profile is specified in \"Provisioning profile UUID\", the specified file is copied to a predetermined place. (\"/Users/${HOME}/Library/MobileDevice/Provisioning Profiles/\")<br>This can be used to overwrite the contents of the developer profile or system settings in the provisioning profile in the project deployed from SCM etc.<br>If the provisioning profile UUID or Specifire is set in \"provisioning profile UUID\", it does not do anything.<br>The default is \"Yes\" (check is on)\n|Keychain name\t                |keychainName\t            |2.0.1\t        |The name of the configured keychain to use to retrieve certificates to sign the package.\n|Keychain name\t                |keychainName\t            |2.0.1\t        |The name of the configured keychain to use to retrieve certificates to sign the package.\n|Keychain path\t                |keychainPath\t            |2.0.1\t        |The path of the keychain to use to retrieve certificates to sign the package (default : ${HOME}/Library/Keychains/login.keychain).\n|Keychain password\t            |keychainPwd\t            |2.0.1\t        |The password of the keychain to use to retrieve certificates to sign the package.\n    \n#### Compiling Xcode projects and exporting IPApackages using Jenkins's Pipeline function\n    \n1.  Import developer profile.\n\n    ``` syntaxhighlighter-pre\n            importDeveloperProfile(importIntoExistingKeychain: false,\n                profileId: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX')\n    ```\n\n2.  Build the project and output the archive.\n\n    ``` syntaxhighlighter-pre\n            xcodeBuild(\n              xcodeSchema: \"${PROJECT_SCHEMA}\",\n              ipaOutputDirectory: 'Release',\n              ipaExportMethod: 'app-store',\n              generateArchive: true,\n              buildIpa: true,\n              ipaName: \"${BUILD_TARGET}\",\n              bundleID: 'com.example.TargetApp',\n              developmentTeamName: \"${DEVELOPMENT_TEAM_NAME}\",\n              cleanBeforeBuild: true,\n              configuration: 'Release',\n              cfBundleShortVersionStringValue: '1.0.0',\n              cfBundleVersionValue: '1'\n            )\n    ```\n\n3.  Export the IPA file from the archive.\n\n    ``` syntaxhighlighter-pre\n        exportIpa(\n            archiveDir: \"${WORKSPACE}/${repositoryName}/build/Release-iphoneos\",\n            xcodeSchema: \"${PROJECT_SCHEMA}\",\n            developmentTeamName: \"${DEVELOPMENT_TEAM}\",\n            configuration: \"AdHoc\",\n            infoPlistPath: \"${INFO_PLIST}\",\n            manualSigning: true,\n            provisioningProfiles: [\n                [provisioningProfileAppId: \"${BUNDLE_ID}\", provisioningProfileUUID: 'TestApp_AdHoc_Profile.mobileprovision']\n                [provisioningProfileAppId: \"${BUNDLE_ID}.watchkitapp\", provisioningProfileUUID: 'TestApp_AdHoc_Profile.mobileprovision'],\n                [provisioningProfileAppId: \"${BUNDLE_ID}.watchkitapp.watchkitextension\", provisioningProfileUUID: 'TestApp_AdHoc_Profile.mobileprovision']\n            ],\n            ipaExportMethod: \"ad-hoc\",\n            ipaName: \"${BUILD_TARGET}\",\n            ipaOutputDirectory: \"AdHoc\"\n        )\n    ```\n\n4.  Upload the exported IPA file.  \n\n> When using \"XCode's\" Automatically manage signing \", various ways are required, so please note the points to be noted separately.\n\n#####  Using multiple versions of xcode.\n\nOne can easily support multiple versions by using environment variables.\nBut first one need to install multiple versions on the build server.\nHere's one strategy:\n\n###### install multiple versions of xcode\n\n0\\. Note current config.\n\nxcode-select -p\n\n1\\. download xcode DMGs from <http://developer.apple.com/downloads/>\n\n2\\. enable install from everywhere (under System preferences / Security)\n\nWithout that I had problems installing xcode, without graphical\nfeedback, tested on 10.9.5, freshly booted.\n\nSymptoms were:\n\n-   app not responsive\n-   Getting errors like in /var/log/system.log\n\nSomeone attempted to start application App:\"Xcode\" asn:0x0-1b62b61\npid:57656 refs=6 @ 0x7fa5d9f6df40 but it still has\n\\_kLSApplicationLockedInStoppedStateKey=true, so it is is staying\nstopped. : LASApplication.cp \\#2468 SetApplicationInStoppedState()\nq=LSSession 100027/0x186bb queue\n\n3\\. open DMG file, copy app to /Applications. This might take a while.\n\n4\\. close /Volumes/Xcode (otherwise installation won't start)\n\n5\\. start Xcode, accept agreement, install missing packages if necessary.\nThis might take a while. Close xcode after GUI opens.\n\n6\\. move freshly installed Xcode to new path, e.g.\n\nsudo mv /Applications/Xcode.app /Applications/Xcode6.1.app\n\n(I use this so that the xcode app appears with version number under\nspotlight)\n\n7\\. reset default xcode-select if necessary (installation might have\nchanged it / reset to /Applications/Xcode.app)\n\nsudo xcode-select -s /Applications/Xcode6.1.app\n\n(Note the part above could be fully automated....)\n\n###### Select the xcode version at runtime\n\n1\\. Use EnvInject plugin  \n2. for jobs that require the non default do something like\n\nDEVELOPER\\_DIR=/Applications/Xcode6.0.1.app/Contents/Developer\n\nunder Inject environment variables to the build process\n\n###### Select the xcode version at runtime (Version 2.0.3 or later)\n\n1. Register the distinguished name and location of the installed Xcode\nusing ’Global Tool Configuration’.  \n2. Select Xcode registered in 'Global Tool Configuration' in Job's\n'Xcode Tools Version'.\n\nThat's it.\n\n#### FAQ\n\n##### User interaction is not allowed\n\nWhen code-signing, a prompt may appear on the build machine asking\nwhether to allow keychain access.  \nThis will block the build with a message like\n`\"User interaction is not allowed\"` until it is dismissed.  \nJust select 'Always Allow' the first time and it shouldn't need to ask\nagain.  \n![](docs/images/308d472628999c9f1961068c9af34e49a31c76c7.png)\n\nIf this prompt is not showing on the build machine, you can force it to\nappear by running the codesign command that failed from a terminal on\nthe build machine:   /usr/bin/codesign --force --sign \"iPhone\nDistribution: .....\n\n##### No Xcode folder is set\n\n\\[sources\\] $ /usr/bin/xcodebuild -version xcode-select: Error: No Xcode\nfolder is set. Run xcode-select -switch \\<xcode\\_folder\\_path\\> to set\nthe path to the Xcode folder. Error: /usr/bin/xcode-select returned\nunexpected error. FATAL: Check your XCode installation. Jenkins cannot\nretrieve its version.\n\nYou probably just installed XCode (by default it is in `/Developer`) but\nits path isn't configured. You can fix it with\n\nxcode-select -switch /Developer/\n\nYou should now be able to execute `xcodebuild`. Ex :\n\nhost:\\~ user$ /usr/bin/xcodebuild -version Xcode 4.2 Build version 4C199\n\n##### Xcode 4.3\n\nXCode 4.3 changes [2\nthings](https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_4_3.html)\nthat are important for our usage on a slave or a master :\n\n-   **Command-Line Tools Are Optional** : The command-line tools are not\n    bundled with Xcode 4.3 by default. Instead, they have to be\n    installed using the Components tab of the Downloads preferences\n    panel\n    ![](docs/images/8f2803dc1d2d272296cfa2ba044a3286e29a374c.jpg)\n-   **/Developer No Longer Exists** : You may have to reconfigure its\n    path like this:\n\n    sudo xcode-select -switch\n    /Applications/Xcode.app/Contents/Developer/\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n  <parent>\n    <groupId>org.jenkins-ci.plugins</groupId>\n    <artifactId>plugin</artifactId>\n    <version>4.41</version>\n    <relativePath />\n  </parent>\n  <artifactId>xcode-plugin</artifactId>\n  <version>${revision}-${changelist}</version>\n  <packaging>hpi</packaging>\n  <name>Xcode integration</name>\n  <description>This plugin adds the ability to call Xcode command line tools to automate build and packaging iOS applications (iPhone, iPad, ...).</description>\n  <url>https://github.com/jenkinsci/xcode-plugin</url>\n  <licenses>\n    <license>\n      <name>MIT</name>\n      <url>LICENSE.txt</url>\n      <distribution>repo</distribution>\n    </license>\n  </licenses>\n  <developers>\n    <developer>\n      <id>rayhilton</id>\n      <name>Ray Yamamoto Hilton</name>\n      <email>ray.hilton@gmail.com</email>\n    </developer>\n    <developer>\n      <id>aheritier</id>\n      <name>Arnaud Heritier</name>\n      <email>aheritier@apache.org</email>\n    </developer>\n    <developer>\n      <id>lacostej</id>\n      <name>Jerome Lacoste</name>\n      <email>jerome.lacoste@gmail.com</email>\n    </developer>\n    <developer>\n      <id>kazuhidet</id>\n      <name>Kazuhide Takahashi</name>\n      <email>kazuhide.t@linux-powered.com</email>\n    </developer>\n  </developers>\n  <scm>\n    <connection>scm:git:https://github.com/${gitHubRepo}.git</connection>\n    <developerConnection>scm:git:git@github.com:${gitHubRepo}.git</developerConnection>\n    <url>https://github.com/${gitHubRepo}</url>\n    <tag>${scmTag}</tag>\n  </scm>\n  <repositories>\n    <repository>\n      <id>repo.jenkins-ci.org</id>\n      <url>https://repo.jenkins-ci.org/public/</url>\n    </repository>\n  </repositories>\n  <pluginRepositories>\n    <pluginRepository>\n      <id>repo.jenkins-ci.org</id>\n      <url>https://repo.jenkins-ci.org/public/</url>\n    </pluginRepository>\n  </pluginRepositories>\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>io.jenkins.tools.bom</groupId>\n        <artifactId>bom-2.319.x</artifactId>\n        <version>1466.v85a_616ea_b_87c </version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  <dependencies>\n    <dependency>\n      <groupId>org.jenkins-ci.plugins</groupId>\n      <artifactId>credentials</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.jenkins-ci.plugins</groupId>\n      <artifactId>token-macro</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.jenkins-ci.plugins.workflow</groupId>\n      <artifactId>workflow-cps</artifactId>\n      <optional>true</optional>\n    </dependency>\n    <dependency>\n      <groupId>com.googlecode.plist</groupId>\n      <artifactId>dd-plist</artifactId>\n      <version>1.23</version>\n    </dependency>\n    <dependency>\n      <groupId>org.jenkins-ci.plugins</groupId>\n      <artifactId>structs</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.jenkins-ci.plugins</groupId>\n      <artifactId>credentials-binding</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.jenkinsci.plugins</groupId>\n      <artifactId>pipeline-model-extensions</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.jenkinsci.plugins</groupId>\n      <artifactId>pipeline-model-definition</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.bouncycastle</groupId>\n      <artifactId>bcpkix-jdk15on</artifactId>\n      <version>1.70</version>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>io.jenkins.plugins</groupId>\n      <artifactId>jaxb</artifactId>\n      <version>2.3.6-1</version>\n    </dependency>\n  </dependencies>\n  <properties>\n    <revision>2.0.17</revision>\n    <changelist>999999-SNAPSHOT</changelist>\n    <gitHubRepo>jenkinsci/xcode-plugin</gitHubRepo>\n    <jenkins.version>2.319.1</jenkins.version>\n  </properties>\n  <build>\n    <plugins>\n      <plugin>\n        <groupId>org.jenkins-ci.tools</groupId>\n        <artifactId>maven-hpi-plugin</artifactId>\n        <extensions>true</extensions>\n        <configuration>\n          <compatibleSinceVersion>2.0.0</compatibleSinceVersion>\n        </configuration>\n      </plugin>\n    </plugins>\n  </build>\n</project>\n"
  },
  {
    "path": "src/main/java/au/com/rayh/BuildConfiguration.java",
    "content": "package au.com.rayh;\n\nimport com.dd.plist.NSDictionary; \nimport com.dd.plist.NSArray;\nimport com.dd.plist.NSNumber;\nimport com.dd.plist.NSObject;\nimport com.dd.plist.NSString;\nimport com.dd.plist.PropertyListFormatException; \nimport com.dd.plist.PropertyListParser; \n\npublic class BuildConfiguration {\n  public String uuid;\n  public String name;\n  public String bundleIdentifier;\n  public String infoPlistFile;\n  //public String codeSignStyle;\n  public String developmentTeamId;\n  public String provisioningProfileUUID;\n  public String provisioningProfileSpecifier;\n  public String productName;\n\n  BuildConfiguration(NSDictionary objectsDict, String buildConfigurationUUID, Boolean automatic) {\n    NSDictionary buildConfigurationDict = ((NSDictionary)objectsDict.objectForKey(buildConfigurationUUID.toString()));\n    //String baseConfigurationReference = buildConfigurationDict.objectForKey(\"baseConfigurationReference\").toString();\n    this.uuid = buildConfigurationUUID.toString();\n    this.name = buildConfigurationDict.objectForKey(\"name\").toString();\n    System.out.println(\"buildConfigurationUUID: \" + this.uuid);\n    NSDictionary buildSettingsDict = ((NSDictionary)buildConfigurationDict.objectForKey(\"buildSettings\"));\n    if ( buildSettingsDict == null ) {\n      System.out.println(\"buildSettings not exists!\");\n      return;\n    }\n    // LastUpgradeCheck = 0630, CreatedOnToolsVersion = 6.3.1\n    if ( buildSettingsDict.objectForKey(\"PRODUCT_BUNDLE_IDENTIFIER\") != null ) {\n\n        this.bundleIdentifier = buildSettingsDict.objectForKey(\"PRODUCT_BUNDLE_IDENTIFIER\").toString();\n    }\n    else if ( buildSettingsDict.objectForKey(\"PRODUCT_NAME\") != null ) {\n        this.productName = buildSettingsDict.objectForKey(\"PRODUCT_NAME\").toString();\n    }\n    this.infoPlistFile = buildSettingsDict.objectForKey(\"INFOPLIST_FILE\").toString();\n    //this.codeSignStyle = buildSettingsDict.objectForKey(\"CODE_SIGN_STYLE\").toString();\n    if ( buildSettingsDict.objectForKey(\"BUNDLE_LOADER\") == null && buildSettingsDict.objectForKey(\"TEST_TARGET_NAME\") == null && buildSettingsDict.objectForKey(\"DEVELOPMENT_TEAM\") != null ) {\n\tthis.developmentTeamId = buildSettingsDict.objectForKey(\"DEVELOPMENT_TEAM\").toString();\n    }\n    if ( !automatic ) {\n      this.provisioningProfileUUID = buildSettingsDict.objectForKey(\"PROVISIONING_PROFILE\").toString();\n      this.provisioningProfileSpecifier = buildSettingsDict.objectForKey(\"PROVISIONING_PROFILE_SPECIFIER\").toString();\n    }\n    //else {\n    //  this.codeSignStyle = \"Automatic\";\n    //}\n  }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/DSymFileFilter.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage au.com.rayh;\n\nimport java.io.File;\nimport java.io.FileFilter;\nimport java.io.Serializable;\n\n/**\n *\n * @author lampietti\n */\npublic class DSymFileFilter implements FileFilter, Serializable {\n\n    public boolean accept(File pathname) {\n        return pathname.isDirectory() && pathname.getName().endsWith(\".dSYM\");\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/DeveloperProfile.java",
    "content": "package au.com.rayh;\n\nimport com.cloudbees.plugins.credentials.CredentialsProvider;\nimport com.cloudbees.plugins.credentials.domains.DomainRequirement;\nimport hudson.Extension;\nimport hudson.security.ACL;\nimport hudson.util.IOUtils;\nimport hudson.util.Secret;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.security.GeneralSecurityException;\nimport java.security.KeyStore;\nimport java.security.cert.Certificate;\nimport java.security.cert.X509Certificate;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Enumeration;\nimport java.util.List;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipInputStream;\n\nimport edu.umd.cs.findbugs.annotations.CheckForNull;\nimport edu.umd.cs.findbugs.annotations.NonNull;\nimport javax.naming.InvalidNameException;\nimport javax.naming.ldap.LdapName;\nimport javax.naming.ldap.Rdn;\n\nimport jenkins.security.ConfidentialKey;\n\nimport org.apache.commons.fileupload.FileItem;\nimport org.kohsuke.stapler.DataBoundConstructor;\n\nimport com.cloudbees.plugins.credentials.CredentialsScope;\nimport com.cloudbees.plugins.credentials.impl.BaseStandardCredentials;\n\n/**\n * Apple developer profile, which consists of any number of PKCS12 of the private key\n * and the certificate for code signing, and mobile provisioning profiles.\n *\n * @author Kohsuke Kawaguchi\n */\npublic class DeveloperProfile extends BaseStandardCredentials {\n    /**\n     * Password of the PKCS12 files inside the profile.\n     */\n    private Secret password;\n\n    @DataBoundConstructor\n    public DeveloperProfile(@CheckForNull CredentialsScope scope, @CheckForNull String id, @CheckForNull String description,\n            Secret password, FileItem image) throws IOException {\n        super(scope, id, description);\n        this.password = password;\n\n        if (image!=null) {\n            // for added secrecy, store this in the confidential store\n            new ConfidentialKeyImpl(id).store(image);\n        }\n    }\n\n    @Deprecated\n    public DeveloperProfile(String id, String description, Secret password, FileItem image) throws IOException {\n        this(CredentialsScope.GLOBAL,id,description,password,image);\n    }\n\n    public Secret getPassword() {\n        return password;\n    }\n\n    /**\n     * Retrieves the PKCS12 byte image.\n     * @return PKCS12 byte image\n     * @throws IOException file I/O\n     */\n    public byte[] getImage() throws IOException {\n        return new ConfidentialKeyImpl(getId()).load();\n    }\n\n    /**\n     * Obtains the certificates in this developer profile.\n     * @return X509Certificates\n     * @throws IOException file I/O\n     * @throws GeneralSecurityException Certificate error\n     */\n    public @NonNull List<X509Certificate> getCertificates() throws IOException, GeneralSecurityException {\n        try (ZipInputStream zip = new ZipInputStream(new ByteArrayInputStream(getImage()))) {\n            List<X509Certificate> r = new ArrayList<>();\n\n            ZipEntry ze;\n            while ((ze = zip.getNextEntry()) != null) {\n                if (ze.getName().endsWith(\".p12\")) {\n                    KeyStore ks = KeyStore.getInstance(\"pkcs12\");\n                    ks.load(zip, password.getPlainText().toCharArray());\n                    Enumeration<String> en = ks.aliases();\n                    while (en.hasMoreElements()) {\n                        String s = en.nextElement();\n                        Certificate c = ks.getCertificate(s);\n                        if (c instanceof X509Certificate) {\n                            r.add((X509Certificate) c);\n                        }\n                    }\n                }\n            }\n\n            return r;\n        }\n    }\n\n    public String getDisplayNameOf(X509Certificate p) {\n        String name = p.getSubjectDN().getName();\n        try {\n            LdapName n = new LdapName(name);\n            for (Rdn rdn : n.getRdns()) {\n                if (rdn.getType().equalsIgnoreCase(\"CN\"))\n                    return rdn.getValue().toString();\n            }\n        } catch (InvalidNameException e) {\n            // fall through\n        }\n        return name; // fallback\n    }\n\n    @Extension\n    public static class DescriptorImpl extends BaseStandardCredentialsDescriptor {\n        @Override\n        public String getDisplayName() {\n            return \"Apple Developer Profile\";\n        }\n    }\n\n    static class ConfidentialKeyImpl extends ConfidentialKey {\n        ConfidentialKeyImpl(String id) {\n            super(DeveloperProfile.class.getName()+\".\"+id);\n        }\n\n        public void store(FileItem submitted) throws IOException {\n            super.store(IOUtils.toByteArray(submitted.getInputStream()));\n        }\n\n        public @CheckForNull byte[] load() throws IOException {\n            return super.load();\n        }\n    }\n\n    public static List<DeveloperProfile> getAllProfiles() {\n\treturn CredentialsProvider.lookupCredentials(DeveloperProfile.class, (hudson.model.Item)null, ACL.SYSTEM, Collections.<DomainRequirement>emptyList());\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/DeveloperProfileLoader.java",
    "content": "package au.com.rayh;\n\nimport com.cloudbees.plugins.credentials.CredentialsMatchers;\nimport com.cloudbees.plugins.credentials.CredentialsProvider;\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\nimport hudson.AbortException;\nimport hudson.EnvVars;\nimport hudson.Extension;\nimport hudson.FilePath;\nimport hudson.Launcher;\nimport hudson.model.AbstractBuild;\nimport hudson.model.AbstractProject;\nimport hudson.model.BuildListener;\nimport hudson.model.Item;\nimport hudson.model.Run;\nimport hudson.model.TaskListener;\nimport hudson.remoting.VirtualChannel;\nimport hudson.security.ACL;\nimport hudson.tasks.BuildStepDescriptor;\nimport hudson.tasks.Builder;\nimport hudson.util.ArgumentListBuilder;\nimport hudson.util.FormValidation;\nimport hudson.util.ListBoxModel;\nimport hudson.util.Secret;\nimport jenkins.model.Jenkins;\nimport jenkins.security.MasterToSlaveCallable;\nimport org.jenkinsci.plugins.tokenmacro.MacroEvaluationException;\nimport org.jenkinsci.plugins.tokenmacro.TokenMacro;\n\nimport jenkins.tasks.SimpleBuildStep;\nimport org.jenkinsci.Symbol;\nimport org.jenkinsci.remoting.RoleChecker;\nimport org.kohsuke.stapler.AncestorInPath;\nimport org.kohsuke.stapler.DataBoundConstructor;\nimport org.kohsuke.stapler.DataBoundSetter;\nimport org.kohsuke.stapler.QueryParameter;\nimport org.apache.commons.lang.BooleanUtils;\nimport org.apache.commons.lang.StringUtils;\n\nimport edu.umd.cs.findbugs.annotations.NonNull;\nimport edu.umd.cs.findbugs.annotations.CheckForNull;\nimport javax.inject.Inject;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.UUID;\n\n/**\n * Installs {@link DeveloperProfile} into the current slave and unlocks its keychain\n * in preparation for the signing that uses it.\n *\n * TODO: destroy identity in the end.\n *\n * @author Kohsuke Kawaguchi\n */\n@SuppressFBWarnings(\"NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE\")\npublic class DeveloperProfileLoader extends Builder implements SimpleBuildStep {\n    @CheckForNull\n    private String profileId;\n    @CheckForNull\n    private Boolean importIntoExistingKeychain;\n    @CheckForNull\n    private String keychainId;\n    @Deprecated\n    @CheckForNull\n    private String keychainName;\n    @CheckForNull\n    private String keychainPath;\n    @CheckForNull\n    private Secret keychainPwd;\n    @CheckForNull\n    public String getProfileId() {\n        return profileId;\n    }\n\n    @DataBoundSetter\n    public void setProfileId(String developerProfileId) {\n        this.profileId = developerProfileId;\n    }\n\n    public Boolean getImportIntoExistingKeychain() {\n        return importIntoExistingKeychain == null ? Boolean.valueOf(false) : importIntoExistingKeychain;\n    }\n\n    @DataBoundSetter\n    public void setImportIntoExistingKeychain(Boolean importIntoExistingKeychain ) {\n        this.importIntoExistingKeychain = importIntoExistingKeychain;\n    }\n\n    @CheckForNull\n    public String getKeychainId() {\n        return keychainId;\n    }\n\n    @Deprecated\n    @CheckForNull\n    public String getKeychainName() {\n        return keychainName;\n    }\n\n    @DataBoundSetter\n    public void setKeychainId(String keychainId) {\n        this.keychainId = keychainId;\n    }\n\n    @Deprecated\n    @DataBoundSetter\n    public void setKeychainName(String keychainName) {\n        this.keychainName = keychainName;\n    }\n\n    @CheckForNull\n    public String getKeychainPath() {\n        return keychainPath;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPath(String keychainPath) {\n        this.keychainPath = keychainPath;\n    }\n\n    @CheckForNull\n    public Secret getKeychainPwd() {\n        return keychainPwd;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPwd(Secret keychainPwd) {\n        this.keychainPwd = keychainPwd;\n    }\n\n    @DataBoundConstructor\n    public DeveloperProfileLoader() {\n    }\n\n    @Deprecated\n    public DeveloperProfileLoader(String profileId) {\n        this();\n\tthis.profileId = profileId;\n    }\n\n    @Override\n    public void perform(@NonNull Run<?, ?> run, @NonNull FilePath workspace, @NonNull Launcher launcher, @NonNull TaskListener listener) throws InterruptedException, IOException {\n\tEnvVars envs = run.getEnvironment(listener);\n\tString _profileId = envs.expand(this.profileId);\n        String _keychainId = envs.expand(this.keychainId);\n\tString _keychainName = envs.expand(this.keychainName);\n\tBoolean _importIntoExistingKeychain = this.importIntoExistingKeychain;\n        DeveloperProfile dp = getProfile(run.getParent(), _profileId);\n        if ( dp == null )\n            throw new AbortException(Messages.DeveloperProfile_NoDeveloperProfileConfigured());\n\n        String _keychainPath;\n        String _keychainPwd;\n        if ( BooleanUtils.isTrue(_importIntoExistingKeychain)) {\n            if ( StringUtils.isNotEmpty(_keychainName) ) {\n                // for backward compatibility\n                listener.getLogger().println(Messages.XCodeBuilder_UseDeprecatedKeychainInfo());\n                Keychain keychain = getKeychain(_keychainName);\n                if (keychain == null) {\n                    throw new AbortException(Messages.DeveloperProfileLoader_NoKeychainInfoConfigured());\n                }\n                else {\n                    _keychainPath = envs.expand(keychain.getKeychainPath());\n                    _keychainPwd = envs.expand(Secret.toString(keychain.getKeychainPassword()));\n                    _importIntoExistingKeychain = Boolean.valueOf(true);\n                }\n            }\n            else if ( StringUtils.isNotEmpty(_keychainId) ) {\n                KeychainPasswordAndPath keychain = getKeychainPasswordAndPath(run.getParent(), _keychainId);\n                if ( keychain == null ) {\n                    throw new AbortException(Messages.DeveloperProfileLoader_NoKeychainInfoConfigured());\n                }\n                else {\n                    _keychainPath = envs.expand(keychain.getKeychainPath());\n                    _keychainPwd = envs.expand(keychain.getPassword().getPlainText());\n                    _importIntoExistingKeychain = Boolean.valueOf(true);\n                }\n            }\n            else {\n                if ( StringUtils.isNotEmpty(this.keychainPath) && StringUtils.isNotEmpty(Secret.toString(this.keychainPwd)) ) {\n                    _keychainPath = envs.expand(this.keychainPath);\n                    _keychainPwd = envs.expand(Secret.toString(this.keychainPwd));\n                }\n                else {\n                    throw new AbortException(Messages.DeveloperProfileLoader_KeychainPathOrPasswordIsBlank());\n                }\n            }\n        }\n        else {\n            // Use temporary keychain with random UUID nasme.\n            _keychainPath = \"jenkins-\" + run.getParent().getFullName().replace('/', '-');\n\t    _keychainPwd = UUID.randomUUID().toString();\n\t    _importIntoExistingKeychain = Boolean.valueOf(false);\n        }\n\n        // Note: keychain are usualy suffixed with .keychain. If we change we should probably clean up the ones we created\n\n        ArgumentListBuilder args;\n\n        if ( BooleanUtils.isNotTrue(_importIntoExistingKeychain) ) {\n\t    // if the key chain is already present, delete it and start fresh\n            ByteArrayOutputStream out = new ByteArrayOutputStream();\n            args = new ArgumentListBuilder(\"security\", \"delete-keychain\", _keychainPath);\n            launcher.launch().cmds(args).stdout(out).join();\n\n            args = new ArgumentListBuilder(\"security\", \"create-keychain\");\n            args.add(\"-p\").addMasked(_keychainPwd);\n            args.add(_keychainPath);\n            invoke(launcher, listener, args, \"Failed to create a keychain\");\n\t}\n\n        args = new ArgumentListBuilder(\"security\", \"unlock-keychain\");\n        args.add(\"-p\").addMasked(_keychainPwd);\n        args.add(_keychainPath);\n        invoke(launcher, listener, args, \"Failed to unlock keychain\");\n\n\tif ( BooleanUtils.isNotTrue(_importIntoExistingKeychain) ) {\n            args = new ArgumentListBuilder(\"security\", \"list-keychains\");\n\t    args.add(\"-d\").add(\"user\");\n\t    args.add(\"-s\").add(\"login.keychain\");\n            args.add(_keychainPath);\n            invoke(launcher, listener, args, \"Failed to set keychain search path\");\n\t}\n\n        final FilePath secret = getSecretDir(workspace, _keychainPwd);\n\tfinal byte[] dpImage = dp.getImage();\n\tif ( dpImage == null )\n\t    throw new AbortException(Messages.DeveloperProfile_NoDeveloperProfileConfigured());\n        secret.unzipFrom(new ByteArrayInputStream(dpImage));\n\n        // import identities\n        for ( FilePath id : secret.list(\"**/*.p12\") ) {\n            args = new ArgumentListBuilder(\"security\", \"import\");\n            args.add(id).add(\"-k\", _keychainPath);\n            args.add(\"-P\").addMasked(dp.getPassword().getPlainText());\n            args.add(\"-T\", \"/usr/bin/codesign\");\n            args.add(\"-T\", \"/usr/bin/productsign\");\n            args.add(_keychainPath);\n            invoke(launcher, listener, args, \"Failed to import identity \" + id);\n        }\n\n        {\n            // display keychain info for potential troubleshooting\n            args = new ArgumentListBuilder(\"security\", \"show-keychain-info\");\n            args.add(_keychainPath);\n            ByteArrayOutputStream output = invoke(launcher, listener, args, \"Failed to show keychain info\");\n            listener.getLogger().write(output.toByteArray());\n        }\n\n\tif ( BooleanUtils.isNotTrue(_importIntoExistingKeychain) ) {\n            args = new ArgumentListBuilder(\"security\", \"set-key-partition-list\");\n            args.add(\"-S\").add(\"apple-tool:,apple:\");\n            args.add(\"-s\").add(\"-k\").addMasked(_keychainPwd);\n            args.add(_keychainPath);\n            invoke(launcher, listener, args, \"Failed to set key partition list to keychain\");\n        }\n\n\t{\n\t    // If default keychain is not set, set the specified keychain to default keychain.\n\t    args = new ArgumentListBuilder(\"security\", \"default-keychain\");\n\t    ByteArrayOutputStream output = new ByteArrayOutputStream();\n\t    if ( launcher.launch().cmds(args).stdout(output).join() != 0 ) {\n\t\tlistener.getLogger().write(output.toByteArray());\n\t\tString strResult = new String(output.toByteArray(), \"UTF-8\");\n\t        if ( strResult.contains(\"A default keychain could not be found.\") ) {\n\t\t    args = new ArgumentListBuilder(\"security\", \"default-keychain\");\n\t\t    args.add(\"-d\").add(\"user\");\n\t\t    args.add(\"-s\").add(_keychainPath);\n\t\t    invoke(launcher, listener, args, \"Failed to set default keychain\");\n\t\t}\n\t    }\n\t}\n\n\tif ( BooleanUtils.isNotTrue(_importIntoExistingKeychain) ) {\n\t    importAppleCert(launcher, listener, workspace, _keychainPath);\n\t}\n\n        // copy provisioning profiles\n        VirtualChannel ch = launcher.getChannel();\n        FilePath home = ch.call(new GetHomeDirectory());    // TODO: switch to FilePath.getHomeDirectory(ch) when we can\n        FilePath profiles = home.child(\"Library/MobileDevice/Provisioning Profiles\");\n        profiles.mkdirs();\n\n        for ( FilePath mp : secret.list(\"**/*.mobileprovision\") ) {\n            listener.getLogger().println(Messages.DeveloperProfile_Installing(mp.getName()));\n            mp.copyTo(profiles.child(mp.getName()));\n        }\n    }\n\n    @Override\n    public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {\n        perform(build, build.getWorkspace(), launcher, listener);\n\n        return true;\n    }\n\n    @Override\n    public DescriptorImpl getDescriptor() {\n        return (DescriptorImpl) super.getDescriptor();\n    }\n\n    public GlobalConfigurationImpl getGlobalConfiguration() {\n        return getDescriptor().getGlobalConfiguration();\n    }\n\n    public Keychain getKeychain(String keychainName) {\n        if ( !StringUtils.isEmpty(keychainName) ) {\n            for ( Keychain keychain : getGlobalConfiguration().getKeychains() ) {\n                if ( keychain.getKeychainName().equals(keychainName) )\n                    return keychain;\n            }\n        }\n\n        if ( !StringUtils.isEmpty(this.keychainPath) ) {\n            Keychain newKeychain = new Keychain();\n            newKeychain.setKeychainPath(this.keychainPath);\n            newKeychain.setKeychainPassword(this.keychainPwd);\n            return newKeychain;\n        }\n\n        return null;\n    }\n\n    public KeychainPasswordAndPath getKeychainPasswordAndPath(Item context, String keychainId) {\n        return (KeychainPasswordAndPath)CredentialsMatchers.firstOrNull(\n                CredentialsProvider.lookupCredentials(KeychainPasswordAndPath.class, context,\n                        ACL.SYSTEM, Collections.EMPTY_LIST),\n                CredentialsMatchers.withId(keychainId));\n    }\n\n    public void importAppleCert(Launcher launcher, TaskListener listener, FilePath workspace, String keychainPath) throws IOException, InterruptedException {\n\tByteArrayOutputStream out = new ByteArrayOutputStream();\n\tFilePath homeFolder = workspace.getHomeDirectory(workspace.getChannel());\n\tString homePath = homeFolder.getRemote();\n\tString cert = homePath + \"/AppleWWDRCA.cer\";\n\tlauncher\n\t    .launch()\n\t    .cmds(\"security\", \"import\", cert, \"-k\", keychainPath)\n\t    .stdout(out)\n\t    .join();\n\tlistener.getLogger().write(out.toByteArray());\n    }\n\n    private ByteArrayOutputStream invoke(Launcher launcher, TaskListener listener, ArgumentListBuilder args, String errorMessage) throws IOException, InterruptedException {\n        ByteArrayOutputStream output = new ByteArrayOutputStream();\n        if (launcher.launch().cmds(args).stdout(output).join()!=0) {\n            listener.getLogger().write(output.toByteArray());\n            throw new AbortException(errorMessage);\n        }\n        return output;\n    }\n\n    private FilePath getSecretDir(FilePath workspace, String keychainPwd) throws IOException, InterruptedException {\n        FilePath secrets = workspace.child(\"jenkins\").child(\"developer-profiles\");\n        secrets.mkdirs();\n        secrets.chmod(0700);\n        return secrets.child(keychainPwd);\n    }\n\n    public DeveloperProfile getProfile(Item context, String profileId) {\n        return (DeveloperProfile)CredentialsMatchers.firstOrNull(\n                CredentialsProvider.lookupCredentials(DeveloperProfile.class, context,\n                        ACL.SYSTEM, Collections.EMPTY_LIST),\n                CredentialsMatchers.withId(profileId));\n    }\n\n    @Extension\n    @Symbol(\"importDeveloperProfile\")\n    public static class DescriptorImpl extends BuildStepDescriptor<Builder> {\n\tGlobalConfigurationImpl globalConfiguration;\n\n        @SuppressFBWarnings(\"UWF_UNWRITTEN_FIELD\")\n        @Inject\n        void setGlobalConfiguration(GlobalConfigurationImpl c) {\n            this.globalConfiguration = c;\n\t}\n\n        @Override\n        public boolean isApplicable(Class<? extends AbstractProject> jobType) {\n            return true;\n        }\n\n        @Override\n        public String getDisplayName() {\n            return Messages.DeveloperProfile_ImportDeveloperProfile();\n        }\n\n        public ListBoxModel doFillProfileIdItems(@AncestorInPath Item context) {\n            List<DeveloperProfile> profiles = CredentialsProvider\n                    .lookupCredentials(DeveloperProfile.class, context, null);\n            ListBoxModel r = new ListBoxModel();\n            for (DeveloperProfile p : profiles) {\n                r.add(p.getDescription(), p.getId());\n            }\n            return r;\n        }\n\n        public GlobalConfigurationImpl getGlobalConfiguration() {\n            return globalConfiguration;\n        }\n\n        public String getUUID() {\n            return \"\" + UUID.randomUUID().getMostSignificantBits();\n        }\n\n        public FormValidation doCheckDeveloperProfileId(@QueryParameter String value) {\n            if ( StringUtils.isEmpty(value) ) {\n                return FormValidation.error(Messages.DeveloperProfileLoader_MustSelectDeveloperProfile());\n            }\n            return FormValidation.ok();\n        }\n\n        public FormValidation doCheckKeychainPath(@QueryParameter String value, @QueryParameter String keychainName, @QueryParameter Boolean importIntoExistingKeychain) {\n            if ( BooleanUtils.isTrue(importIntoExistingKeychain) ) {\n                if ( StringUtils.isEmpty(keychainName) && StringUtils.isEmpty(value) ) {\n                    return FormValidation.error(Messages.DeveloperProfileLoader_MustSpecifyKeychainPath());\n                }\n            }\n            return FormValidation.ok();\n        }\n\n        public FormValidation doCheckKeychainPwd(@QueryParameter Secret value, @QueryParameter String keychainName, @QueryParameter Boolean importIntoExistingKeychain) {\n            if ( BooleanUtils.isTrue(importIntoExistingKeychain) ) {\n                if ( StringUtils.isEmpty(keychainName) && StringUtils.isEmpty(Secret.toString(value)) ) {\n                    return FormValidation.error(Messages.DeveloperProfileLoader_MustSpecifyKeychainPwd());\n                }\n            }\n            return FormValidation.ok();\n        }\n    }\n\n    private static final class GetHomeDirectory extends MasterToSlaveCallable<FilePath,IOException> {\n        public FilePath call() throws IOException {\n            return new FilePath(new File(System.getProperty(\"user.home\")));\n        }\n\n        @Override\n        public void checkRoles(RoleChecker roleChecker) throws SecurityException {\n\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/ExportIpa.java",
    "content": "package au.com.rayh;\n\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\nimport hudson.*;\nimport hudson.model.*;\nimport hudson.tasks.BuildStepDescriptor;\nimport hudson.tasks.Builder;\nimport hudson.util.ArgumentListBuilder;\nimport hudson.util.FormValidation;\nimport hudson.util.Secret;\nimport jenkins.tasks.SimpleBuildStep;\nimport org.apache.commons.lang.ArrayUtils;\nimport org.apache.commons.lang.BooleanUtils;\nimport org.apache.commons.lang.StringUtils;\nimport org.jenkinsci.Symbol;\nimport org.kohsuke.stapler.DataBoundConstructor;\nimport org.kohsuke.stapler.DataBoundSetter;\nimport org.kohsuke.stapler.QueryParameter;\n\nimport javax.inject.Inject;\nimport edu.umd.cs.findbugs.annotations.CheckForNull;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.UUID;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class ExportIpa extends Builder implements SimpleBuildStep {\n    private static final String[] VALID_IPA_EXPORT_METHODS = { \"development\", \"ad-hoc\", \"enterprise\", \"app-store\" };\n\n    @CheckForNull\n    private String xcodeProjectPath;\n    @CheckForNull\n    private String xcodeProjectFile;\n    @CheckForNull\n    private Boolean unlockKeychain;\n    @Deprecated\n    @CheckForNull\n    private String keychainName;\n    @CheckForNull\n    private String keychainPath;\n    @CheckForNull\n    private Secret keychainPwd;\n    @CheckForNull\n    private String symRoot;\n    @CheckForNull\n    private String xcodeWorkspaceFile;\n    @CheckForNull\n    private String xcodeSchema;\n    @CheckForNull\n    private String archiveDir;\n    @CheckForNull\n    private String developmentTeamName;\n    @CheckForNull\n    private String developmentTeamID;\n    @CheckForNull\n    private String ipaName;\n    @CheckForNull\n    private String ipaOutputDirectory;\n    @CheckForNull\n    private String ipaExportMethod;\n    /**\n     * @deprecated 2.0.7\n     *\n    @CheckForNull\n    private Boolean manualSigning;\n     */\n    @CheckForNull\n    private String signingMethod;\n    @CheckForNull\n    private ArrayList<ProvisioningProfile> provisioningProfiles;\n    @CheckForNull\n    private String xcodeName;\n    @CheckForNull\n    private Boolean uploadBitcode;\n    @CheckForNull\n    private Boolean uploadSymbols;\n    @CheckForNull\n    private Boolean compileBitcode;\n    @CheckForNull\n    private String thinning;\n    @CheckForNull\n    private Boolean embedOnDemandResourcesAssetPacksInBundle;\n    @CheckForNull\n    private String onDemandResourcesAssetPacksBaseURL;\n    @CheckForNull\n    private String appURL;\n    @CheckForNull\n    private String displayImageURL;\n    @CheckForNull\n    private String fullSizeImageURL;\n    @CheckForNull\n    private String assetPackManifestURL;\n    /**\n     * @since 2.0.5\n     */\n    @CheckForNull\n    private Boolean stripSwiftSymbols;\n    /**\n     * @since 2.0.7\n     */\n    @CheckForNull\n    private Boolean copyProvisioningProfile;\n    /*\n     * @since 2.0.13\n     */\n    @CheckForNull\n    private String keychainId;\n\n    @CheckForNull\n    public String getXcodeProjectPath() {\n\treturn xcodeProjectPath;\n    }\n\n    @DataBoundSetter\n    public void setXcodeProjectPath(String xcodeProjectPath) {\n\tthis.xcodeProjectPath = xcodeProjectPath;\n    }\n\n    @CheckForNull\n    public String getXcodeProjectFile() {\n\treturn xcodeProjectFile;\n    }\n\n    public Boolean getUnlockKeychain() {\n\treturn unlockKeychain;\n    }\n\n    @DataBoundSetter\n    public void setUnlockKeychain(Boolean unlockKeychain) {\n\tthis.unlockKeychain = unlockKeychain;\n    }\n\n    @CheckForNull\n    public String getKeychainName() {\n\treturn keychainName;\n    }\n\n    @DataBoundSetter\n    public void setKeychainName(String keychainName) {\n\tthis.keychainName = keychainName;\n    }\n\n    @CheckForNull\n    public String getKeychainPath() {\n\treturn keychainPath;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPath(String keychainPath) {\n\tthis.keychainPath = keychainPath;\n    }\n\n    @CheckForNull\n    public Secret getKeychainPwd() {\n\treturn keychainPwd;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPwd(Secret keychainPwd) {\n\tthis.keychainPwd = keychainPwd;\n    }\n\n    @CheckForNull\n    public String getSymRoot() {\n\treturn symRoot;\n    }\n\n    @DataBoundSetter\n    public void setSymRoot(String symRoot) {\n\tthis.symRoot = symRoot;\n    }\n\n    @CheckForNull\n    public String getXcodeWorkspaceFile() {\n\treturn xcodeWorkspaceFile;\n    }\n\n    @DataBoundSetter\n    public void setXcodeWorkspaceFile(String xcodeWorkspaceFile) {\n\tthis.xcodeWorkspaceFile = xcodeWorkspaceFile;\n    }\n\n    @CheckForNull\n    public String getXcodeSchema() {\n\treturn xcodeSchema;\n    }\n\n    @DataBoundSetter\n    public void setXcodeSchema(String xcodeSchema) {\n\tthis.xcodeSchema = xcodeSchema;\n    }\n\n    @CheckForNull\n    public String getArchiveDir() {\n\treturn archiveDir;\n    }\n\n    @DataBoundSetter\n    public void setArchiveDir(String archiveDir) {\n\tthis.archiveDir = archiveDir;\n    }\n\n    @CheckForNull\n    public String getDevelopmentTeamName() {\n\treturn developmentTeamName;\n    }\n\n    @DataBoundSetter\n    public void setDevelopmentTeamName(String developmentTeamName) {\n\tthis.developmentTeamName = developmentTeamName;\n    }\n\n    @CheckForNull\n    public String getDevelopmentTeamID() {\n\treturn developmentTeamID;\n    }\n\n    @DataBoundSetter\n    public void setDevelopmentTeamID(String developmentTeamID) {\n\tthis.developmentTeamID = developmentTeamID;\n    }\n\n    @CheckForNull\n    public String getIpaName() {\n\treturn ipaName;\n    }\n\n    @DataBoundSetter\n    public void setIpaName(String ipaName) {\n\tthis.ipaName = ipaName;\n    }\n\n    @CheckForNull\n    public String getIpaOutputDirectory() {\n\treturn ipaOutputDirectory;\n    }\n\n    @DataBoundSetter\n    public void setIpaOutputDirectory(String ipaOutputDirectory) {\n\tthis.ipaOutputDirectory = ipaOutputDirectory;\n    }\n\n    @CheckForNull\n    public String getIpaExportMethod() {\n\treturn ipaExportMethod;\n    }\n\n    @DataBoundSetter\n    public void setIpaExportMethod(String ipaExportMethod) {\n\tthis.ipaExportMethod = ipaExportMethod;\n    }\n\n    @Deprecated\n    public Boolean getManualSigning() {\n\treturn ( signingMethod == null || signingMethod.equals(\"manual\") );\n    }\n\n    @Deprecated\n    @DataBoundSetter\n    public void setManualSigning(Boolean manualSigning) {\n\tthis.signingMethod = BooleanUtils.isTrue(manualSigning) ? \"manual\" : \"automatic\";\n    }\n\n    @CheckForNull\n    public String getSigningMethod() {\n\treturn signingMethod == null ? \"automatic\" : signingMethod;\n    }\n\n    @DataBoundSetter\n    public void setSigningMethod(String signingMethod) {\n\tthis.signingMethod = signingMethod;\n    }\n\n    @CheckForNull\n    public ArrayList<ProvisioningProfile> getProvisioningProfiles() {\n\treturn provisioningProfiles;\n    }\n\n    @DataBoundSetter\n    public void setProvisioningProfiles(ArrayList<ProvisioningProfile> provisioningProfiles) {\n\tthis.provisioningProfiles = provisioningProfiles;\n    }\n\n    @CheckForNull\n    public String getXcodeName() {\n\treturn xcodeName;\n    }\n\n    @DataBoundSetter\n    public void setXcodeName(String xcodeName) {\n\tthis.xcodeName = xcodeName;\n    }\n\n    public Boolean getUploadBitcode() {\n\treturn uploadBitcode;\n    }\n\n    @DataBoundSetter\n    public void setUploadBitcode(Boolean uploadBitcode) {\n\tthis.uploadBitcode = uploadBitcode;\n    }\n\n    public Boolean getUploadSymbols() {\n\treturn uploadSymbols;\n    }\n\n    @DataBoundSetter\n    public void setUploadSymbols(Boolean uploadSymbols) {\n\tthis.uploadSymbols = uploadSymbols;\n    }\n\n    public Boolean getCompileBitcode() {\n\treturn compileBitcode;\n    }\n\n    @DataBoundSetter\n    public void setCompileBitcode(Boolean compileBitcode) {\n\tthis.compileBitcode = compileBitcode;\n    }\n\n    @CheckForNull\n    public String getThinning() {\n\treturn thinning;\n    }\n\n    @DataBoundSetter\n    public void setThinning(String thinning) {\n\tthis.thinning = thinning;\n    }\n\n    public Boolean getPackResourcesAsset() {\n\treturn embedOnDemandResourcesAssetPacksInBundle;\n    }\n\n    @DataBoundSetter\n    public void setPackResourcesAsset(Boolean packResourcesAsset) {\n\tthis.embedOnDemandResourcesAssetPacksInBundle = packResourcesAsset;\n    }\n\n    @CheckForNull\n    public String getResourcesAssetURL() {\n\treturn onDemandResourcesAssetPacksBaseURL;\n    }\n\n    @DataBoundSetter\n    public void setResourcesAssetURL(String resourcesAssetURL) {\n\tthis.onDemandResourcesAssetPacksBaseURL = resourcesAssetURL;\n    }\n\n    @CheckForNull\n    public String getAppURL() {\n\treturn appURL;\n    }\n\n    @DataBoundSetter\n    public void setAppURL(String appURL) {\n\tthis.appURL = appURL;\n    }\n\n    @CheckForNull\n    public String getDisplayImageURL() {\n\treturn displayImageURL;\n    }\n\n    @DataBoundSetter\n    public void setDisplayImageURL(String displayImageURL) {\n\tthis.displayImageURL = displayImageURL;\n    }\n\n    @CheckForNull\n    public String getFullSizeImageURL() {\n\treturn fullSizeImageURL;\n    }\n\n    @DataBoundSetter\n    public void setFullSizeImageURL(String fullSizeImageURL) {\n\tthis.fullSizeImageURL = fullSizeImageURL;\n    }\n\n    @CheckForNull\n    public String getAssetPackManifestURL() {\n\treturn assetPackManifestURL;\n    }\n\n    @DataBoundSetter\n    public void setAssetPackManifestURL(String assetPackManifestURL) {\n\tthis.assetPackManifestURL = assetPackManifestURL;\n    }\n\n    public Boolean getStripSwiftSymbols() {\n\treturn stripSwiftSymbols == null ? Boolean.valueOf(true) : stripSwiftSymbols;\n    }\n\n    @DataBoundSetter\n    public void setStripSwiftSymbols(Boolean stripSwiftSymbols) {\n\tthis.stripSwiftSymbols = stripSwiftSymbols;\n    }\n\n    public Boolean getCopyProvisioningProfile() {\n\treturn copyProvisioningProfile == null ? Boolean.valueOf(true) : copyProvisioningProfile;\n    }\n\n    @DataBoundSetter\n    public void setCopyProvisioningProfile(Boolean copyProvisioningProfile) {\n\tthis.copyProvisioningProfile = copyProvisioningProfile;\n    }\n\n    @CheckForNull\n    public String getKeychainId() {\n\treturn keychainId;\n    }\n\n    @DataBoundSetter\n    public void setKeychainId(String keychainId) {\n\tthis.keychainId = keychainId;\n    }\n\n    @DataBoundConstructor\n    public ExportIpa() {\n    }\n\n    @Deprecated\n    public ExportIpa(String xcodeProjectPath, String xcodeProjectFile,\n                Boolean unlockKeychain, String keychainName, String keychainPath, String keychainPwd, String symRoot, String xcodeWorkspaceFile,\n                String xcodeSchema, String archiveDir, String developmentTeamName, String developmentTeamID,\n                String ipaName, String ipaOutputDirectory,\n                String ipaExportMethod,\n                String signingMethod, ArrayList<ProvisioningProfile> provisioningProfiles, String xcodeName,\n\t\tBoolean uploadBitcode, Boolean uploadSymbols, Boolean compileBitcode, String thinning,\n\t\tBoolean packResourcesAsset, String resourcesAssetURL,\n\t\tString appURL, String displayImageURL, String fullSizeImageURL,\n\t\tString assetPackManifestURL) {\n\tthis();\n        this.xcodeProjectPath = xcodeProjectPath;\n        this.xcodeProjectFile = xcodeProjectFile;\n        this.keychainName = keychainName;\n        this.xcodeWorkspaceFile = xcodeWorkspaceFile;\n        this.xcodeSchema = xcodeSchema;\n        this.developmentTeamName = developmentTeamName;\n        this.developmentTeamID = developmentTeamID;\n        this.unlockKeychain = unlockKeychain;\n        this.keychainPath = keychainPath;\n        this.keychainPwd = Secret.fromString(keychainPwd);\n        this.symRoot = symRoot;\n        this.archiveDir = archiveDir;\n        this.ipaName = ipaName;\n        this.ipaOutputDirectory = ipaOutputDirectory;\n        this.ipaExportMethod = ipaExportMethod;\n        this.signingMethod = signingMethod;\n        this.provisioningProfiles = provisioningProfiles;\n\tthis.xcodeName = xcodeName;\n        this.uploadBitcode = uploadBitcode;\n        this.uploadSymbols = uploadSymbols;\n        this.compileBitcode = compileBitcode;\n        this.thinning = thinning;\n        this.embedOnDemandResourcesAssetPacksInBundle = packResourcesAsset;\n        this.onDemandResourcesAssetPacksBaseURL = resourcesAssetURL;\n        this.appURL = appURL;\n        this.displayImageURL = displayImageURL;\n        this.fullSizeImageURL = fullSizeImageURL;\n        this.assetPackManifestURL = assetPackManifestURL;\n\tthis.stripSwiftSymbols = true;\n    }\n\n    @Override\n    public void perform(Run<?, ?> build, FilePath filePath, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {\n        _perform(build, filePath, launcher, build.getEnvironment(listener), listener);\n    }\n\n    @SuppressFBWarnings(\"DM_DEFAULT_ENCODING\")\n    private boolean _perform(Run<?,?> build, FilePath filePath, Launcher launcher, EnvVars envs, TaskListener listener) throws InterruptedException, IOException {\n\tXCodeBuilder builder = new XCodeBuilder(true, false, true, null, false, false, null,\n                null, null, xcodeProjectPath, xcodeProjectFile, null,\n                null, null, unlockKeychain,\n                keychainName, keychainPath, Secret.toString(keychainPwd), symRoot, xcodeWorkspaceFile,\n                xcodeSchema, archiveDir, developmentTeamName, developmentTeamID, false,\n                ipaName, false, ipaOutputDirectory, false, null,\n                null, false, ipaExportMethod, signingMethod, provisioningProfiles, xcodeName,\n\t\tuploadBitcode, uploadSymbols, compileBitcode, thinning,\n\t\tembedOnDemandResourcesAssetPacksInBundle, onDemandResourcesAssetPacksBaseURL,\n\t\tappURL, displayImageURL, fullSizeImageURL, assetPackManifestURL);\n\tbuilder.setStripSwiftSymbols(stripSwiftSymbols);\n\tbuilder.setCopyProvisioningProfile(copyProvisioningProfile);\n\t\t\n\tbuilder.setSkipBuildStep(true);\n\tbuilder.setKeychainId(keychainId);\n\tbuilder.perform(build, filePath, launcher, listener);\n\treturn true;\n    }\n\n    public GlobalConfigurationImpl getGlobalConfiguration() {\n        return getDescriptor().getGlobalConfiguration();\n    }\n\n    @Override\n    public DescriptorImpl getDescriptor() {\n        return (DescriptorImpl) super.getDescriptor();\n    }\n\n    @Extension\n    @Symbol(\"exportIpa\")\n    public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {\n        GlobalConfigurationImpl globalConfiguration;\n\n        @Override\n        public String getDisplayName() {\n            return Messages.ExportIpa_ExportIpa();\n        }\n\n        public DescriptorImpl() {\n            load();\n        }\n\n        @SuppressFBWarnings(\"UWF_UNWRITTEN_FIELD\")\n        @Inject\n        void setGlobalConfiguration(GlobalConfigurationImpl c) {\n            this.globalConfiguration = c;\n        }\n\n        public GlobalConfigurationImpl getGlobalConfiguration() {\n            return globalConfiguration;\n        }\n\n        @Override\n        public boolean isApplicable(Class<? extends AbstractProject> aClass) {\n            return true;\n        }\n\n        public String getUUID() {\n            return \"\" + UUID.randomUUID().getMostSignificantBits();\n        }\n\n\tpublic FormValidation doCheckArchiveDir(@QueryParameter String value) {\n\t    if ( value.isEmpty() ) {\n\t\treturn FormValidation.error(Messages.ExportIpa_NeedToSpecifyArchiveLocation());\n\t    }\n\t    return FormValidation.ok();\n\t}\n\n        public FormValidation doCheckResourcesAssetURL(@QueryParameter String value, @QueryParameter Boolean packResourcesAsset) {\n            if ( StringUtils.isEmpty(value) && !packResourcesAsset ) {\n                return FormValidation.error(Messages.XCodeBuilder_NeedOnDemandResourcesURL());\n            }\n            return FormValidation.ok();\n        }\n\n\tpublic FormValidation doCheckIpaExportMethod(@QueryParameter String value) {\n\t    if ( !ArrayUtils.contains(VALID_IPA_EXPORT_METHODS, value) ) {\n\t\tString validMethodsMsg = StringUtils.join(VALID_IPA_EXPORT_METHODS, \", \");\n\t\treturn FormValidation.error(Messages.XCodeBuilder_IpaExportMethodMuestBeOneOfTheFollowing(validMethodsMsg));\n\t    }\n\t    return FormValidation.ok();\n\t}\n\n\tpublic FormValidation doCheckXcodeWorkspaceFile(@QueryParameter String value, @QueryParameter String xcodeSchema, @QueryParameter String target) {\n\t    if ( !StringUtils.isEmpty(value) ) {\n\t\tif ( !StringUtils.isEmpty(target) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_WorkspaceAndTargetCantSpecifySameTime());\n\t\t}\n\t\tif ( StringUtils.isEmpty(xcodeSchema) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_SpecifyWorkspaceAlsoSetScheme());\n\t\t}\n\t    }\n\t    return FormValidation.ok();\n\t}\n\n\tpublic FormValidation doCheckXcodeSchema(@QueryParameter String value,  @QueryParameter Boolean generateArchive, @QueryParameter String xcodeWorkspaceFile, @QueryParameter String target) {\n\t    if ( !StringUtils.isEmpty(value) ) {\n\t\tif ( !StringUtils.isEmpty(target) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_SchemeAndTargetCantSpecifySameTime());\n\t\t}\n\t    }\n\t    else {\n\t\tif ( !StringUtils.isEmpty(xcodeWorkspaceFile) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_SpecifyWorkspaceAlsoSetScheme());\n\t\t}\n                return FormValidation.warning(Messages.XCodeBuilder_NeedSchema());\n\t    }\n\t    return FormValidation.ok();\n\t}\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/GlobalConfigurationImpl.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2013 Maur�cio Hanika\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage au.com.rayh;\n\nimport net.sf.json.JSONObject;\n\nimport org.apache.commons.lang.StringUtils;\nimport org.kohsuke.stapler.DataBoundConstructor;\nimport org.kohsuke.stapler.DataBoundSetter;\nimport org.kohsuke.stapler.QueryParameter;\nimport org.kohsuke.stapler.StaplerRequest;\n\nimport hudson.Extension;\nimport hudson.model.AbstractProject;\nimport hudson.model.AutoCompletionCandidates;\nimport hudson.util.FormValidation;\nimport jenkins.model.GlobalConfiguration;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.logging.Logger;\n\nimport edu.umd.cs.findbugs.annotations.CheckForNull;\nimport javax.servlet.ServletException;\n\n/**\n * Stores global configuration for XCode.\n *\n * @since 1.4\n */\n@Extension\npublic final class GlobalConfigurationImpl extends GlobalConfiguration {\n    private static final Logger LOGGER = Logger.getLogger(GlobalConfigurationImpl.class.getName());\n    @CheckForNull\n    private String xcodebuildPath = \"/usr/bin/xcodebuild\";\n    @CheckForNull\n    private String xcrunPath = \"/usr/bin/xcrun\";\n    @CheckForNull\n    private String agvtoolPath = \"/usr/bin/agvtool\";\n    // No one uses defaultKeychain.\n    @Deprecated\n    @CheckForNull\n    private String defaultKeychain = \"\";\n    @Deprecated\n    @CheckForNull\n    private ArrayList<Keychain> keychains = new ArrayList<>();\n    @Deprecated\n    @CheckForNull\n    private ArrayList<Team> teams = new ArrayList<>();\n\n    @DataBoundSetter\n    public void setXcodebuildPath(String xcodebuildPath) {\n        this.xcodebuildPath = xcodebuildPath;\n    }\n\n    @CheckForNull\n    public String getXcodebuildPath() {\n        return xcodebuildPath;\n    }\n\n    @DataBoundSetter\n    public void setXcrunPath(String xcrunPath) {\n        this.xcrunPath = xcrunPath;\n    }\n\n    @CheckForNull\n    public String getXcrunPath() {\n        return xcrunPath;\n    }\n\n    @DataBoundSetter\n    public void setAgvtoolPath(String agvtoolPath) {\n        this.agvtoolPath = agvtoolPath;\n    }\n\n    @CheckForNull\n    public String getAgvtoolPath() {\n        return agvtoolPath;\n    }\n\n    @Deprecated\n    @DataBoundSetter\n    public void setDefaultKeychain(String defaultKeychain) {\n        this.defaultKeychain = defaultKeychain;\n    }\n\n    @Deprecated\n    @CheckForNull\n    public String getDefaultKeychain() {\n        return defaultKeychain;\n    }\n\n    @Deprecated\n    @DataBoundSetter\n    public void setKeychains(ArrayList<Keychain> keychains) {\n        this.keychains = keychains;\n    }\n\n    @Deprecated\n    public ArrayList<Keychain> getKeychains() {\n\treturn keychains == null ? keychains : new ArrayList<Keychain>();\n    }\n\n    @Deprecated\n    @DataBoundSetter\n    public void setTeams(ArrayList<Team> teams) {\n        this.teams = teams;\n    }\n\n    @Deprecated\n    public ArrayList<Team> getTeams() {\n        return teams;\n    }\n\n    @DataBoundConstructor\n    public GlobalConfigurationImpl() {\n        super();\n        load();\n\tLOGGER.fine(\"[Xcode] Default constructor: \" + getKeychains().size());\n    }\n\n    @Deprecated\n    public GlobalConfigurationImpl(String xcodebuildPath, String xcrunPath, String agvtoolPath, String defaultKeychain, ArrayList<Keychain> keychains, ArrayList<Team> teams) {\n        this();\n\n        this.setXcodebuildPath(xcodebuildPath);\n        this.setXcrunPath(xcrunPath);\n        this.setAgvtoolPath(agvtoolPath);\n        this.setDefaultKeychain(defaultKeychain);\n        this.setKeychains(keychains);\n        this.setTeams(teams);\n\n        LOGGER.fine(\"[Xcode] DataBoundConstructor: keychains.size \" + keychains.size());\n        if(teams != null) {\n            LOGGER.fine(\"[Xcode] DataBoundConstructor: teams.size \" + teams.size());\n        }\n    }\n\n    @Deprecated\n    public GlobalConfigurationImpl(String xcodebuildPath, String xcrunPath, String agvtoolPath, String defaultKeychain, ArrayList<Keychain> keychains) {\n        this(xcodebuildPath, xcrunPath, agvtoolPath, defaultKeychain, keychains, null);\n    }\n\n    public FormValidation doCheckXcodebuildPath(@QueryParameter String value) throws IOException, ServletException {\n        if (StringUtils.isEmpty(value)) {\n            return FormValidation.error(Messages.XCodeBuilder_xcodebuildPathNotSet());\n        } else {\n            // TODO: check that the file exists (and if an agent is used ?)\n        }\n        return FormValidation.ok();\n    }\n\n    public FormValidation doCheckAgvtoolPath(@QueryParameter String value) throws IOException, ServletException {\n        if (StringUtils.isEmpty(value)) {\n            return FormValidation.error(Messages.XCodeBuilder_agvtoolPathNotSet());\n        } else {\n            // TODO: check that the file exists (and if an agent is used ?)\n        }\n        return FormValidation.ok();\n    }\n\n    public FormValidation doCheckXcrunPath(@QueryParameter String value) throws IOException, ServletException {\n        if (StringUtils.isEmpty(value)) {\n            return FormValidation.error(Messages.XCodeBuilder_xcrunPathNotSet());\n        } else {\n            // TODO: check that the file exists (and if an agent is used ?)\n        }\n        return FormValidation.ok();\n    }\n\n    /* Useless method that doesn't make sense.\n    public FormValidation doCheckDefaultKeychain(@QueryParameter String value) throws IOException, ServletException {\n        if (!StringUtils.isEmpty(value)) {\n            Boolean foundKeychain = false;\n            for (Keychain k : getKeychains()) {\n                if (k.getKeychainName().equals(value)) {\n                    foundKeychain = true;\n                    break;\n                }\n            }\n\n            if (!foundKeychain) {\n                return FormValidation.error(Messages.OSXKeychainBuildWrapper_invalidDefaultKeychainName(value));\n            }\n        }\n\n        return FormValidation.ok();\n    }\n     */\n\n    public AutoCompletionCandidates doAutoCompleteDefaultKeychain(@QueryParameter String value) {\n        AutoCompletionCandidates c = new AutoCompletionCandidates();\n        for (Keychain keychain : getKeychains()) {\n            if (keychain.getKeychainName().toLowerCase().startsWith(value.toLowerCase())) {\n                c.add(keychain.getKeychainName());\n            }\n        }\n        return c;\n    }\n\n    public boolean isApplicable(Class<? extends AbstractProject> aClass) {\n        // indicates that this builder can be used with all kinds of project types\n        return true;\n    }\n\n    @Override\n    public String getDisplayName() {\n        return Messages.XCodeBuilder_xcode();\n    }\n\n    @Override\n    public boolean configure(StaplerRequest req, JSONObject formData) throws FormException {\n        req.bindJSON(this, formData);\n        setKeychains(new ArrayList<>(req.bindParametersToList(Keychain.class, \"keychain.\")));\n        setTeams(new ArrayList<>(req.bindParametersToList(Team.class, \"team.\")));\n        save();\n\n        return super.configure(req, formData);\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/InfoPlist.java",
    "content": "package au.com.rayh;\n\nimport hudson.FilePath;\n\n//import org.kohsuke.stapler.DataBoundConstructor;\n\npublic class InfoPlist {\n\n    private FilePath infoPlistFile;\n    private String cfBundleIdentifier;\n    private String cfBundleVersion;\n    private String cfBundleShortVersionString;\n\n    InfoPlist() {\n\tinfoPlistFile = null;\n\tcfBundleIdentifier = null;\n\tcfBundleVersion = null;\n\tcfBundleShortVersionString = null;\n    }\n\n    //@DataBoundConstructor\n    InfoPlist(FilePath infoPlistFile, String cfBundleIdentifier, String cfBundleVersion, String cfBundleShortVersionString) {\n        this.infoPlistFile = infoPlistFile;\n        this.cfBundleIdentifier = cfBundleIdentifier;\n        this.cfBundleVersion = cfBundleVersion;\n        this.cfBundleShortVersionString = cfBundleShortVersionString;\n    }\n\n    public FilePath getInfoPlistFile() {\n        return this.infoPlistFile;\n    }\n\n    public void setInfoPlistFile(FilePath infoPlistFile) {\n        this.infoPlistFile = infoPlistFile;\n    }\n\n    public String getCfBundleIdentifier() {\n        return this.cfBundleIdentifier;\n    }\n\n    public void setCfBundleIdentifier(String cfBundleIdentifier) {\n        this.cfBundleIdentifier = cfBundleIdentifier;\n    }\n\n    public String getCfBundleVersion() {\n        return this.cfBundleVersion;\n    }\n\n    public void setCfBundleVersion(String cfBundleVersion) {\n        this.cfBundleVersion = cfBundleVersion;\n    }\n\n    public String getCfBundleShortVersionString() {\n        return this.cfBundleShortVersionString;\n    }\n\n    public void setCfBundleShortVersionString(String cfBundleShortVersionString) {\n        this.cfBundleShortVersionString = cfBundleShortVersionString;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/JenkinsXCodeBuildOutputParser.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage au.com.rayh;\n\nimport hudson.FilePath;\nimport hudson.Functions;\nimport hudson.model.TaskListener;\n\nimport java.io.BufferedOutputStream;\nimport java.io.FilterOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.text.SimpleDateFormat;\nimport java.util.GregorianCalendar;\n\nimport org.apache.commons.lang.StringUtils;\n\n/**\n *\n * @author ray\n */\npublic class JenkinsXCodeBuildOutputParser extends XCodeBuildOutputParser {\n    protected TaskListener buildListener;\n    private FilePath testReportsDir;\n    private OutputStream logFileOutputStream;\n    private boolean ignoreTestResults;\n\n\tpublic JenkinsXCodeBuildOutputParser(FilePath workspace, TaskListener buildListener) throws IOException, InterruptedException {\n\t\tsuper();\n        this.buildListener = buildListener;\n        this.captureOutputStream = new LineBasedFilterOutputStream();\n        this.consoleLog = true;\n        this.logFileOutputStream = null;\n\tthis.ignoreTestResults = false;\n\n        testReportsDir = workspace.child(\"test-reports\");\n        testReportsDir.mkdirs();\n    }\n\n    public void setConsoleLog(boolean consoleLog) {\n        this.consoleLog = consoleLog;\n    }\n\n    public void setIgnoreTestResults(boolean ignoreTestResults) {\n\tthis.ignoreTestResults = ignoreTestResults;\n    }\n    \n    public void setLogfilePath(final FilePath buildDirectory, final String logfileOutputDirectory) throws IOException, InterruptedException {\n\t// Remove buildDirectory.exists() && buildDirectory.isDirectory() from condition.\n\t// Because If Generate archive is not specified, directory was not created.\n        if(!StringUtils.isEmpty(logfileOutputDirectory)) {\n\t    // Fix not to use timestamp for log file name. (Use \"xcodebuild.log\" as a fixed file name)\n\t    // Because using a timestamp as a filename, No way to know it with a script etc.\n            FilePath logFilePath = buildDirectory.child(logfileOutputDirectory);\n            // clean Directory\n            if(logFilePath.exists()) {\n                logFilePath.deleteRecursive();\n            }\n            // Create if non-existent\n            if (!logFilePath.exists()) {\n                logFilePath.mkdirs();\n            }\n            logFileOutputStream = new BufferedOutputStream(logFilePath.child(\"xcodebuild.log\").write(),1024*512);\n        }\n    }\n    \n    public void closeLogfile() throws IOException {\n    \tif(logFileOutputStream != null) {\n            logFileOutputStream.flush();\n            logFileOutputStream.close();\n            logFileOutputStream = null;\n        }\n    }\n\n    public class LineBasedFilterOutputStream extends FilterOutputStream {\n        StringBuilder buffer = new StringBuilder();\n\n        public LineBasedFilterOutputStream() {\n            super(buildListener.getLogger());\n        }\n\n        @Override\n        public void write(int b) throws IOException {\n\t    if ( !ignoreTestResults ) {\n                if((char)b == '\\n') {\n                    try {\n                        handleLine(buffer.toString());\n                        buffer = new StringBuilder();\n                    } catch(Exception e) {  // Very fugly\n                        Functions.printStackTrace(e, buildListener.fatalError(e.getMessage()));\n                        throw new IOException(e);\n                    }\n                } else {\n                    buffer.append((char)b);\n                }\n\t    }\n            if(consoleLog) {\n                super.write(b);\n            }\n            if(logFileOutputStream != null) {\n                logFileOutputStream.write(b);\n            }\n        }\n        \n        @Override\n        public void close() throws IOException {\n            if(logFileOutputStream != null) {\n                logFileOutputStream.flush();\n                logFileOutputStream.close();\n                logFileOutputStream = null;\n            }\n            super.close();\n        }\n    }\n\n\t@Override\n\tprotected OutputStream outputForSuite() throws IOException,\n\t\t\tInterruptedException {\n\t\treturn testReportsDir.child(\"TEST-\" + currentTestSuite.getName() + \".xml\").write();\n\t}\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/Keychain.java",
    "content": "package au.com.rayh;\n\nimport hudson.util.Secret;\nimport org.apache.commons.lang.StringUtils;\nimport org.kohsuke.stapler.DataBoundConstructor;\nimport org.kohsuke.stapler.DataBoundSetter;\n\npublic class Keychain {\n    private String keychainName;\n    private String keychainPath;\n    private Secret keychainPassword;\n    private Boolean inSearchPath;\n\n    public Keychain() {\n    }\n\n    @Deprecated\n    @DataBoundConstructor\n    public Keychain(String keychainName, String keychainPath, String keychainPassword, Boolean inSearchPath) {\n        this.keychainName = keychainName;\n        this.keychainPath = keychainPath;\n        this.keychainPassword = Secret.fromString(keychainPassword);\n        this.inSearchPath = inSearchPath;\n    }\n\n    public String getKeychainName() {\n        return keychainName;\n    }\n\n    @DataBoundSetter\n    public void setKeychainName(String keychainName) {\n        this.keychainName = keychainName;\n    }\n\n    public String getKeychainPath() {\n        return keychainPath;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPath(String keychainPath) {\n        this.keychainPath = keychainPath;\n    }\n\n    public Secret getKeychainPassword() {\n        return keychainPassword;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPassword(Secret keychainPassword) {\n        this.keychainPassword = keychainPassword;\n    }\n\n    public Boolean isInSearchPath() {\n        return inSearchPath;\n    }\n\n    @DataBoundSetter\n    public void setInSearchPath(Boolean inSearchPath) {\n        this.inSearchPath = inSearchPath;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/KeychainPasswordAndPath.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011-2012, CloudBees, Inc., Stephen Connolly.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage au.com.rayh;\n\nimport com.cloudbees.plugins.credentials.CredentialsNameProvider;\nimport com.cloudbees.plugins.credentials.NameWith;\nimport com.cloudbees.plugins.credentials.common.PasswordCredentials;\nimport com.cloudbees.plugins.credentials.common.StandardCredentials;\nimport edu.umd.cs.findbugs.annotations.NonNull;\nimport hudson.Util;\nimport hudson.util.Secret;\n\nimport java.io.IOException;\n\n/**\n * Credentials that have an ID, description and macOS Keychain password and path.\n *\n */\n@NameWith(value = KeychainPasswordAndPath.NameProvider.class, priority = 32)\npublic interface KeychainPasswordAndPath extends StandardCredentials, PasswordCredentials {\n    /**\n     *\n     *\n     */\n    Secret getPassword();\n    String getKeychainPath();\n    boolean isInSearchPath();\n    String getInSearchPath();\n\n    /**\n     * Our name provider.\n     *\n     * @since 2.0.12\n     */\n    public static class NameProvider extends CredentialsNameProvider<KeychainPasswordAndPath> {\n\n        /**\n         * {@inheritDoc}\n         */\n        @NonNull\n        @Override\n        public String getName(@NonNull KeychainPasswordAndPath c) {\n            String description = Util.fixEmptyAndTrim(c.getDescription());\n            return c.getKeychainPath() + (description != null ? \" (\" + description + \")\" : \"\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/KeychainPasswordAndPathBinding.java",
    "content": "/*\n * The MIT License\n *\n *  Copyright (c) 2016, CloudBees, Inc.\n *\n *  Permission is hereby granted, free of charge, to any person obtaining a copy\n *  of this software and associated documentation files (the \"Software\"), to deal\n *  in the Software without restriction, including without limitation the rights\n *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *  copies of the Software, and to permit persons to whom the Software is\n *  furnished to do so, subject to the following conditions:\n *\n *  The above copyright notice and this permission notice shall be included in\n *  all copies or substantial portions of the Software.\n *\n *  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n *  THE SOFTWARE.\n *\n */\n\npackage au.com.rayh;\n\nimport edu.umd.cs.findbugs.annotations.NonNull;\nimport edu.umd.cs.findbugs.annotations.Nullable;\nimport hudson.Extension;\nimport hudson.FilePath;\nimport hudson.Launcher;\nimport hudson.model.Run;\nimport hudson.model.TaskListener;\nimport org.apache.commons.lang.StringUtils;\nimport org.jenkinsci.plugins.credentialsbinding.BindingDescriptor;\nimport org.jenkinsci.plugins.credentialsbinding.MultiBinding;\nimport org.kohsuke.stapler.DataBoundConstructor;\n\nimport edu.umd.cs.findbugs.annotations.NonNull;\nimport java.io.IOException;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Set;\n\n/**\n * @author <a href=\"mailto:kazuhide.t@linux-powered.com\">Kazuhide Takahashi</a>\n */\npublic class KeychainPasswordAndPathBinding extends MultiBinding<KeychainPasswordAndPath> {\n\n    public final static String DEFAULT_KEYCHAIN_PATH_VARIABLE_NAME = \"KEYCHAIN_PATH\";\n    private final static String DEFAULT_PASSWORD_VARIABLE_NAME = \"PASSWORD\";\n    private final static String DEFAULT_IN_SEARCH_PATH_VARIABLE_NAME = \"IN_SEARCH_PATH\";\n\n    @NonNull\n    private final String keychainPathVariable;\n    @NonNull\n    private final String passwordVariable;\n    @NonNull\n    private final String inSearchPathVariable;\n\n    /**\n     *\n     * @param keychainPathVariable if {@code null}, {@value DEFAULT_KEYCHAIN_PATH_VARIABLE_NAME} will be used.\n     * @param passwordVariable if {@code null}, {@value DEFAULT_PASSWORD_VARIABLE_NAME} will be used.\n     * @param inSearchPathVariable if {@code null}, {@value DEFAULT_IN_SEARCH_PATH_VARIABLE_NAME} will be used.\n     * @param credentialsId identifier which should be referenced when accessing the credentials from a job/pipeline.\n     */\n    @DataBoundConstructor\n    public KeychainPasswordAndPathBinding(@Nullable String keychainPathVariable, @Nullable String passwordVariable, @Nullable String inSearchPathVariable, String credentialsId) {\n        super(credentialsId);\n        this.keychainPathVariable = StringUtils.defaultIfBlank(keychainPathVariable, DEFAULT_KEYCHAIN_PATH_VARIABLE_NAME);\n        this.passwordVariable = StringUtils.defaultIfBlank(passwordVariable, DEFAULT_PASSWORD_VARIABLE_NAME);\n        this.inSearchPathVariable = StringUtils.defaultIfBlank(inSearchPathVariable, DEFAULT_IN_SEARCH_PATH_VARIABLE_NAME);\n    }\n\n    @NonNull\n    public String getKeychainPathVariable() {\n        return keychainPathVariable;\n    }\n\n    @NonNull\n    public String getPasswordVariable() {\n        return passwordVariable;\n    }\n\n    @NonNull\n    public String getInSearchPathVariable() {\n        return inSearchPathVariable;\n    }\n\n    @Override\n    protected Class<KeychainPasswordAndPath> type() {\n        return KeychainPasswordAndPath.class;\n    }\n\n    @Override\n    public MultiEnvironment bind(@NonNull Run<?, ?> build, FilePath workspace, Launcher launcher, TaskListener listener) throws IOException, InterruptedException {\n        KeychainPasswordAndPath credential = getCredentials(build);\n        Map<String,String> m = new HashMap<String,String>();\n        m.put(keychainPathVariable, credential.getKeychainPath());\n        m.put(passwordVariable, credential.getPassword().getPlainText());\n        m.put(inSearchPathVariable, credential.getInSearchPath());\n        return new MultiEnvironment(m);\n    }\n\n    @Override\n    public Set<String> variables() {\n        return new HashSet<String>(Arrays.asList(keychainPathVariable, passwordVariable, inSearchPathVariable));\n    }\n\n    @Extension\n    public static class DescriptorImpl extends BindingDescriptor<KeychainPasswordAndPath> {\n\n        @Override protected Class<KeychainPasswordAndPath> type() {\n            return KeychainPasswordAndPath.class;\n        }\n\n        @Override public String getDisplayName() {\n            return Messages.KeychainPasswordAndPath_DisplayName();\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/KeychainPasswordAndPathImpl.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011-2016, CloudBees, Inc., Stephen Connolly.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage au.com.rayh;\n\nimport com.cloudbees.plugins.credentials.CredentialsDescriptor;\nimport com.cloudbees.plugins.credentials.CredentialsProvider;\nimport com.cloudbees.plugins.credentials.domains.DomainRequirement;\nimport edu.umd.cs.findbugs.annotations.CheckForNull;\nimport edu.umd.cs.findbugs.annotations.NonNull;\nimport hudson.Extension;\nimport hudson.Util;\nimport hudson.security.ACL;\nimport hudson.util.Secret;\nimport org.kohsuke.stapler.DataBoundConstructor;\nimport com.cloudbees.plugins.credentials.CredentialsScope;\nimport com.cloudbees.plugins.credentials.impl.BaseStandardCredentials;\nimport org.kohsuke.stapler.DataBoundSetter;\n\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n *\n */\n@SuppressWarnings(\"unused\") // read resolved by extension plugins\npublic class KeychainPasswordAndPathImpl extends BaseStandardCredentials implements KeychainPasswordAndPath {\n\n    /**\n     * The Keychain path.\n     */\n    @NonNull\n    private String keychainPath;\n\n    /**\n     * The password.\n     */\n    @NonNull\n    private Secret password;\n\n    /**\n     * The flag for keychain in search path.\n     */\n    private String inSearchPath;\n\n    /**\n     * Constructor.\n     *\n     * @param scope           the credentials scope\n     * @param id              the ID or {@code null} to generate a new one.\n     * @param description     the description.\n     * @param keychainPath    the Keychain path.\n     * @param password        the password.\n     * @param inSearchPath    flag for keychain in search path.\n     */\n    @DataBoundConstructor\n    @SuppressWarnings(\"unused\") // by stapler\n    public KeychainPasswordAndPathImpl(@CheckForNull CredentialsScope scope,\n                                       @CheckForNull String id,\n                                       @CheckForNull String description,\n                                       @CheckForNull String keychainPath,\n                                       @CheckForNull String password,\n                                       @CheckForNull String inSearchPath) {\n        super(scope, id, description);\n        this.keychainPath = Util.fixNull(keychainPath);\n        this.password = Secret.fromString(password);\n        this.inSearchPath = inSearchPath;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public Secret getPassword() {\n        return password;\n    }\n\n    @DataBoundSetter\n    public void setPassword(Secret password) {\n        this.password = password;\n    }\n\n    /**\n     * macOS Keychain path.\n     * @return full path for macOS keychain\n     */\n    @NonNull\n    public String getKeychainPath() {\n        return keychainPath;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPath(String keychainPath) {\n        this.keychainPath = keychainPath;\n    }\n\n    /**\n     * Add keychain to search path.\n     * @return inSearchPath by String.\n     */\n    public String getInSearchPath() {\n        return inSearchPath;\n    }\n\n    @DataBoundSetter\n    public void setInSearchPath(String inSearchPath) {\n        this.inSearchPath = inSearchPath;\n    }\n\n    /**\n     * Add keyc hain to search path.\n     * @return check is inSearchPath equals \"true\".\n     */\n    public boolean isInSearchPath() {\n        return inSearchPath == null ? false : inSearchPath.equals(\"true\");\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    @Extension\n    public static class DescriptorImpl extends BaseStandardCredentialsDescriptor {\n\n        /**\n         * {@inheritDoc}\n         */\n        @Override\n        public String getDisplayName() {\n            return Messages.KeychainPasswordAndPath_DisplayName();\n        }\n\n        /*\n         * {@inheritDoc}\n         *\n        @Override\n        public String getIconClassName() {\n            return \"icon-credentials\";\n        }\n        */\n    }\n\n    public static List<KeychainPasswordAndPathImpl> getAllKeycainInfo() {\n        return CredentialsProvider.lookupCredentials(KeychainPasswordAndPathImpl.class, (hudson.model.Item)null, ACL.SYSTEM, Collections.<DomainRequirement>emptyList());\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/KeychainUnlockStep.java",
    "content": "package au.com.rayh;\n\nimport com.cloudbees.plugins.credentials.CredentialsMatchers;\nimport com.cloudbees.plugins.credentials.CredentialsProvider;\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\nimport hudson.AbortException;\nimport hudson.EnvVars;\nimport hudson.Extension;\nimport hudson.FilePath;\nimport hudson.Launcher;\nimport hudson.model.*;\nimport hudson.security.ACL;\nimport hudson.tasks.BuildStepDescriptor;\nimport hudson.tasks.Builder;\nimport hudson.util.ArgumentListBuilder;\nimport hudson.util.FormValidation;\nimport hudson.util.Secret;\n\nimport jenkins.tasks.SimpleBuildStep;\nimport org.jenkinsci.Symbol;\nimport org.kohsuke.stapler.DataBoundConstructor;\nimport org.kohsuke.stapler.DataBoundSetter;\nimport org.kohsuke.stapler.QueryParameter;\nimport org.apache.commons.lang.BooleanUtils;\nimport org.apache.commons.lang.StringUtils;\n\nimport edu.umd.cs.findbugs.annotations.NonNull;\nimport edu.umd.cs.findbugs.annotations.CheckForNull;\nimport javax.inject.Inject;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.UUID;\n\n/**\n * Installs {@link DeveloperProfile} into the current slave and unlocks its keychain\n * in preparation for the signing that uses it.\n *\n * TODO: destroy identity in the end.\n *\n * @author Kohsuke Kawaguchi\n */\n@SuppressFBWarnings(\"NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE\")\npublic class KeychainUnlockStep extends Builder implements SimpleBuildStep {\n    @Deprecated\n    @CheckForNull\n    private String keychainName;\n    @CheckForNull\n    private String keychainId;\n    @CheckForNull\n    private String keychainPath;\n    @CheckForNull\n    private Secret keychainPwd;\n\n    @Deprecated\n    @CheckForNull\n    public String getKeychainName() {\n        return keychainName;\n    }\n\n    @CheckForNull\n    public String getKeychainId() {\n        return keychainId;\n    }\n\n    @Deprecated\n    @DataBoundSetter\n    public void setKeychainName(String keychainName) {\n        this.keychainName = keychainName;\n    }\n\n    @DataBoundSetter\n    public void setKeychainId(String keychainId) {\n        this.keychainId = keychainId;\n    }\n\n    @CheckForNull\n    public String getKeychainPath() {\n        return keychainPath;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPath(String keychainPath) {\n        this.keychainPath = keychainPath;\n    }\n\n    @CheckForNull\n    public Secret getKeychainPwd() {\n        return keychainPwd;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPwd(Secret keychainPwd) {\n        this.keychainPwd = keychainPwd;\n    }\n\n    @DataBoundConstructor\n    public KeychainUnlockStep() {\n    }\n\n    @Deprecated\n    public KeychainUnlockStep(String keychainName) {\n\tthis();\n\tthis.keychainName = keychainName;\n    }\n\n    @Override\n    public void perform(@NonNull Run<?, ?> run, @NonNull FilePath workspace, @NonNull Launcher launcher, @NonNull TaskListener listener) throws InterruptedException, IOException {\n\tEnvVars envs = run.getEnvironment(listener);\n\tString _keychainId = envs.expand(this.keychainId);\n        String _keychainName = envs.expand(this.keychainName);\n\n        String _keychainPath;\n        String _keychainPwd;\n        if ( StringUtils.isNotEmpty(_keychainName) ) {\n            // for backward compatibility\n            listener.getLogger().println(Messages.XCodeBuilder_UseDeprecatedKeychainInfo());\n            Keychain keychain = getKeychain(_keychainName);\n            if ( keychain == null ) {\n                throw new AbortException(Messages.DeveloperProfileLoader_NoKeychainInfoConfigured());\n            }\n            else {\n                _keychainPath = envs.expand(keychain.getKeychainPath());\n                _keychainPwd = envs.expand(Secret.toString(keychain.getKeychainPassword()));\n            }\n        }\n        else if ( StringUtils.isNotEmpty(_keychainId) ) {\n            // for backward compatibility\n            KeychainPasswordAndPath keychain = getKeychainPasswordAndPath(run.getParent(), _keychainId);\n            if ( keychain == null ) {\n                throw new AbortException(Messages.DeveloperProfileLoader_NoKeychainInfoConfigured());\n            }\n            else {\n                _keychainPath = envs.expand(keychain.getKeychainPath());\n                _keychainPwd = envs.expand(keychain.getPassword().getPlainText());\n            }\n        }\n        else {\n            _keychainPath = envs.expand(this.keychainPath);\n            _keychainPwd = envs.expand(Secret.toString(this.keychainPwd));\n        }\n\n        ArgumentListBuilder args;\n\n        args = new ArgumentListBuilder(\"security\", \"unlock-keychain\");\n        args.add(\"-p\").addMasked(_keychainPwd);\n        args.add(_keychainPath);\n        invoke(launcher, listener, args, \"Failed to unlock keychain\");\n    }\n\n    @Override\n    public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {\n        perform(build, build.getWorkspace(), launcher, listener);\n\n        return true;\n    }\n\n    @Override\n    public DescriptorImpl getDescriptor() {\n        return (DescriptorImpl) super.getDescriptor();\n    }\n\n    public GlobalConfigurationImpl getGlobalConfiguration() {\n        return getDescriptor().getGlobalConfiguration();\n    }\n\n    public Keychain getKeychain(String keychainName) {\n        if ( !StringUtils.isEmpty(keychainName) ) {\n            for ( Keychain keychain : getGlobalConfiguration().getKeychains() ) {\n                if ( keychain.getKeychainName().equals(keychainName) )\n                    return keychain;\n            }\n        }\n\n        if ( !StringUtils.isEmpty(this.keychainPath) ) {\n            Keychain newKeychain = new Keychain();\n            newKeychain.setKeychainPath(keychainPath);\n            newKeychain.setKeychainPassword(this.keychainPwd);\n            return newKeychain;\n        }\n\n        return null;\n    }\n\n    public KeychainPasswordAndPath getKeychainPasswordAndPath(Item context, String keychainId) {\n        return (KeychainPasswordAndPath) CredentialsMatchers.firstOrNull(\n                CredentialsProvider.lookupCredentials(KeychainPasswordAndPath.class, context,\n                        ACL.SYSTEM, Collections.EMPTY_LIST),\n                CredentialsMatchers.withId(keychainId));\n    }\n\n    private ByteArrayOutputStream invoke(Launcher launcher, TaskListener listener, ArgumentListBuilder args, String errorMessage) throws IOException, InterruptedException {\n        ByteArrayOutputStream output = new ByteArrayOutputStream();\n        if (launcher.launch().cmds(args).stdout(output).join()!=0) {\n            listener.getLogger().write(output.toByteArray());\n            throw new AbortException(errorMessage);\n        }\n        return output;\n    }\n\n    @Extension\n    @Symbol(\"unlockMacOSKeychain\")\n    public static class DescriptorImpl extends BuildStepDescriptor<Builder> {\n\tGlobalConfigurationImpl globalConfiguration;\n\n        @SuppressFBWarnings(\"UWF_UNWRITTEN_FIELD\")\n        @Inject\n        void setGlobalConfiguration(GlobalConfigurationImpl c) {\n            this.globalConfiguration = c;\n\t}\n\n        @Override\n        public boolean isApplicable(Class<? extends AbstractProject> jobType) {\n            return true;\n        }\n\n        @Override\n        public String getDisplayName() {\n            return Messages.OSXKeychainUnclockStep_DisplayName();\n        }\n\n        public GlobalConfigurationImpl getGlobalConfiguration() {\n            return globalConfiguration;\n        }\n\n        public String getUUID() {\n            return \"\" + UUID.randomUUID().getMostSignificantBits();\n        }\n\n        public FormValidation doCheckKeychainPath(@QueryParameter String value, @QueryParameter String keychainName) {\n            if ( StringUtils.isEmpty(keychainName) && StringUtils.isEmpty(value) ) {\n                return FormValidation.error(Messages.DeveloperProfileLoader_MustSpecifyKeychainPath());\n            }\n            return FormValidation.ok();\n        }\n\n        public FormValidation doCheckKeychainPwd(@QueryParameter Secret value, @QueryParameter String keychainName) {\n            if ( StringUtils.isEmpty(keychainName) && StringUtils.isEmpty(Secret.toString(value)) ) {\n                return FormValidation.error(Messages.DeveloperProfileLoader_MustSpecifyKeychainPwd());\n            }\n            return FormValidation.ok();\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/MobileProvisionParser.java",
    "content": "package au.com.rayh;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.apache.commons.lang.StringUtils;\n\n\n/**\n * Created by ud10404 on 5/9/14.\n */\npublic class MobileProvisionParser {\n\n    private List<String> targets = new ArrayList<>();\n    private List<String> configurations = new ArrayList<>();\n    private List<String> schemes = new ArrayList<>();\n\n    public MobileProvisionParser(String xcodebuildListOutput) {\n\n        if(xcodebuildListOutput == null) {\n            return;\n        }\n\n        String [] lines = xcodebuildListOutput.split(\"\\n\");\n        List<String> curList = null;\n        for(String line : lines) {\n            line = line.trim();\n            if (StringUtils.isEmpty(line)) {\n                curList = null;\n            } else if(\"Targets:\".equals(line)) {\n                curList = targets;\n            } else if(\"Build Configurations:\".equals(line)) {\n                curList = configurations;\n            } else if(\"Schemes:\".equals(line)) {\n                curList = schemes;\n            } else if(curList != null) {\n                curList.add(line);\n            }\n        }\n    }\n\n    public List<String> getTargets() {\n        return this.targets;\n    }\n\n    public List<String> getConfigurations() {\n        return this.configurations;\n    }\n\n    public List<String> getSchemes() {\n        return this.schemes;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/ProjectScheme.java",
    "content": "package au.com.rayh;\n\npublic class ProjectScheme {\n    //public String parallelizeBuildables;\n    //public String buildImplicitDependencies;\n    //public String blueprintIdentifier;\n    //public String buildForTesting;\n    //public String buildForRunning;\n    //public String buildForProfiling;\n    //public String buildForArchiving;\n    //public String buildForAnalyzing;\n    //public String buildableIdentifier;\n    //public String buildableName;\n    public String blueprintName;\n    public String referencedContainer;\n\n    ProjectScheme() {\n\t//parallelizeBuildables = null;\n\t//buildImplicitDependencies = null;\n\t//blueprintIdentifier = null;\n\t//buildForTesting = null;\n\t//buildForRunning = null;\n\t//buildForProfiling = null;\n\t//buildForArchiving = null;\n\t//buildForAnalyzing = null;\n\t//buildableIdentifier = null;\n\t//buildableName = null;\n\tblueprintName = null;\n\treferencedContainer = null;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/ProjectTarget.java",
    "content": "package au.com.rayh;\n\nimport java.util.HashMap;\n\npublic class ProjectTarget {\n    public String uuid;\n    //public String name;\n    public String productType;\n    public String provisioningStyle;\n    public String testTargetID;\n    public String defaultConfigurationName;\n    public HashMap<String, BuildConfiguration> buildConfiguration;\n\n    ProjectTarget() {\n\tuuid = null;\n\t//name = null;\n\tproductType = null;\n\tprovisioningStyle = null;\n        testTargetID = null;\n\tdefaultConfigurationName = null;\n\t\n\tbuildConfiguration = new HashMap<String, BuildConfiguration>();\n    }\n}\n\n"
  },
  {
    "path": "src/main/java/au/com/rayh/ProvisioningProfile.java",
    "content": "package au.com.rayh;\n\nimport org.kohsuke.stapler.DataBoundConstructor;\nimport hudson.EnvVars;\n\npublic class ProvisioningProfile {\n\n    private static final String PLIST_FORMAT = \"<key>${APP_ID}</key><string>${UUID}</string>\";\n\n    private String provisioningProfileAppId;\n    private String provisioningProfileUUID;\n\n    public ProvisioningProfile() {\n    }\n\n    @DataBoundConstructor\n    public ProvisioningProfile(String provisioningProfileAppId, String provisioningProfileUUID) {\n        this.provisioningProfileAppId = provisioningProfileAppId;\n        this.provisioningProfileUUID = provisioningProfileUUID;\n    }\n\n    public String getProvisioningProfileAppId() {\n        return provisioningProfileAppId;\n    }\n\n    public void setProvisioningProfileAppId(String provisioningProfileAppId) {\n        this.provisioningProfileAppId = provisioningProfileAppId;\n    }\n\n    public String getProvisioningProfileUUID() {\n        return provisioningProfileUUID;\n    }\n\n    public void setProvisioningProfileUUID(String provisioningProfileUUID) {\n        this.provisioningProfileUUID = provisioningProfileUUID;\n    }\n\n    public String toPlist(EnvVars envs) {\n        return PLIST_FORMAT.replace(\"${APP_ID}\", envs.expand(provisioningProfileAppId))\n                .replace(\"${UUID}\", envs.expand(provisioningProfileUUID));\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/Team.java",
    "content": "package au.com.rayh;\n\nimport org.kohsuke.stapler.DataBoundConstructor;\n\npublic class Team {\n\n    private String teamName;\n    private String teamID;\n\n    public Team() {\n    }\n\n    @DataBoundConstructor\n    public Team(String teamName, String teamID) {\n        this.teamName = teamName;\n        this.teamID = teamID;\n    }\n\n    public String getTeamName() {\n        return teamName;\n    }\n\n    public void setTeamName(String teamName) {\n        this.teamName = teamName;\n    }\n\n    public String getTeamID() {\n        return teamID;\n    }\n\n    public void setTeamID(String teamID) {\n        this.teamID = teamID;\n    }\n    \n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XCArchiveFileFilter.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage au.com.rayh;\n\nimport java.io.File;\nimport java.io.FileFilter;\nimport java.io.Serializable;\n\n/**\n * @author lampietti\n */\npublic class XCArchiveFileFilter implements FileFilter, Serializable {\n\n    public boolean accept(File pathname) {\n        return pathname.isDirectory() && pathname.getName().endsWith(\".xcarchive\");\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XCodeAction.java",
    "content": "package au.com.rayh;\n\nimport hudson.model.InvisibleAction;\nimport org.kohsuke.stapler.DataBoundConstructor;\n\n/**\n * Simple Action for storing the build number\n * @author Reuben Bijl\n */\npublic class XCodeAction extends InvisibleAction {\n    private String buildDescription;\n\n    @DataBoundConstructor\n    public XCodeAction(String buildDescription) {\n        this.buildDescription = buildDescription;\n    }\n\n    public  String getBuildDescription() { return buildDescription; }\n}"
  },
  {
    "path": "src/main/java/au/com/rayh/XCodeBuildNumberTokenMacro.java",
    "content": "package au.com.rayh;\r\n\r\nimport hudson.Extension;\r\nimport hudson.model.AbstractBuild;\r\nimport hudson.model.TaskListener;\r\nimport org.jenkinsci.plugins.tokenmacro.DataBoundTokenMacro;\r\nimport org.jenkinsci.plugins.tokenmacro.MacroEvaluationException;\r\n\r\nimport java.io.IOException;\r\n\r\n\r\n@Extension\r\npublic class XCodeBuildNumberTokenMacro extends DataBoundTokenMacro {\r\n    @Override\r\n    public String evaluate(AbstractBuild<?, ?> context, TaskListener listener, String macroName)\r\n            throws MacroEvaluationException, IOException, InterruptedException {\r\n            XCodeAction a = context.getAction(XCodeAction.class);\r\n            if(a == null){\r\n                return \"\";\r\n            }\r\n\t\t\treturn a.getBuildDescription();\r\n    }\r\n\r\n    @Override\r\n    public boolean acceptsMacroName(String macroName) {\r\n        return macroName.equals(\"XCODE_BUILD_NUMBER\");\r\n    }\r\n}"
  },
  {
    "path": "src/main/java/au/com/rayh/XCodeBuildOutputParser.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage au.com.rayh;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.FilterOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.net.InetAddress;\nimport java.text.DateFormat;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport javax.xml.bind.JAXBContext;\nimport javax.xml.bind.JAXBException;\nimport javax.xml.bind.Marshaller;\n\nimport au.com.rayh.report.TestCase;\nimport au.com.rayh.report.TestError;\nimport au.com.rayh.report.TestFailure;\nimport au.com.rayh.report.TestSuite;\n\n/**\n * Parse Xcode output and transform into JUnit-style xml test result files.\n * This utility class creates and manages a FilterOutputStream to parse the Xcode output to capture the\n * results of ocunit tests. \n * @author John Bito &lt;jwbito@gmail.com&gt;\n */\n\npublic class XCodeBuildOutputParser {\n\n    private static DateFormat[] dateFormats = {\n\tnew SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss z\"),\n\tnew SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss.SSS\")\n    };\n    private static Pattern START_SUITE = Pattern.compile(\"Test Suite '([^\\\\/](?:\\\\.|[^'\\\\\\\\])*)'\\\\s+started at\\\\s+(.*)\");\n    private static Pattern END_SUITE = Pattern.compile(\"Test Suite '([^\\\\/](?:\\\\.|[^'\\\\\\\\])*)'\\\\s+\\\\S+\\\\s+at\\\\s+(.*).\");\n    private static Pattern START_TESTCASE = Pattern.compile(\"Test Case '-\\\\[(\\\\S+)\\\\s+(\\\\S+)\\\\]' started.\");\n    private static Pattern END_TESTCASE = Pattern.compile(\"Test Case '-\\\\[(\\\\S+)\\\\s+(\\\\S+)\\\\]' passed \\\\((.*) seconds\\\\).\");\n    private static Pattern ERROR_TESTCASE = Pattern.compile(\"(.*): error: -\\\\[(\\\\S+)\\\\s+(\\\\S+)\\\\] : (.*)\");\n    private static Pattern ERROR_UI_TESTCASE = Pattern.compile(\".*?Assertion Failure: (.+:\\\\d+): (.*)\");\n    private static Pattern FAILED_TESTCASE = Pattern.compile(\"Test Case '-\\\\[(\\\\S+)\\\\s+(\\\\S+)\\\\]' failed \\\\((\\\\S+) seconds\\\\).\");\n    private static Pattern FAILED_WITH_EXIT_CODE = Pattern.compile(\"failed with exit code (\\\\d+)\");\n    private static Pattern TERMINATING_EXCEPTION = Pattern.compile(\".*\\\\*\\\\*\\\\* Terminating app due to uncaught exception '(\\\\S+)', reason: '(.+[^\\\\\\\\])'.*\");\n    private File testReportsDir;\n    protected OutputStream captureOutputStream;\n    protected int exitCode;\n    protected HashMap<String, TestSuite> testSuitesHash = new HashMap<String, TestSuite>();\n    protected TestSuite currentTestSuite = null;\n    protected TestCase currentTestCase = null;\n    protected boolean consoleLog;\n\n    protected XCodeBuildOutputParser() {\n        super();\n    }\n\n    /**\n     * Initalize the FilterOutputStream and prepare to generate the JUnit result files\n     * @param workspace directory that will receive the result files\n     * @param log the Xcode output stream that should be parsed\n     */\n    public XCodeBuildOutputParser(File workspace, OutputStream log) {\n        this();\n        this.captureOutputStream = new LineBasedFilterOutputStream(log);\n        this.testReportsDir = workspace;\n        this.consoleLog = true;\n    }\n\n    public class LineBasedFilterOutputStream extends FilterOutputStream {\n        StringBuilder buffer = new StringBuilder();\n\n        public LineBasedFilterOutputStream(OutputStream log) {\n            super(log);\n        }\n\n        @Override\n        public void write(int b) throws IOException {\n            super.write(b);\n            if((char)b == '\\n') {\n                try {\n                    handleLine(buffer.toString());\n                    buffer = new StringBuilder();\n                } catch(Exception e) {  // Very fugly\n                    throw new IOException(e);\n                }\n            } else {\n                buffer.append((char)b);\n            }\n        }\n    }\n\n    private Date parseDate(String text) throws ParseException {\n\tDate date;\n\tParseException parseException;\n\n\tdate = null;\n\tparseException = null;\n\n\tfor (DateFormat dateFormat : dateFormats) {\n\t    try {\n\t\tdate = dateFormat.parse(text);\n\t\tbreak;\n\t    } catch (ParseException exception) {\n\t\tparseException = exception;\n\t    }\n\t}\n\n\tif ((date == null) && (parseException != null)) {\n\t    throw parseException;\n\t}\n\n\treturn date;\n    }\n\n    private void requireTestSuite() {\n\tif(testSuitesHash.size()==0) {\n\t    throw new RuntimeException(\"Log statements out of sync: current test suite was empty\");\n\t}\n\tif(currentTestSuite==null) {\n\t    throw new RuntimeException(\"Log statements out of sync: current test suite was null\");\n\t}\n    }\n\n    private void requireTestSuite(String name) {\n        currentTestSuite = testSuitesHash.get(name);\n\tif(currentTestSuite==null) {\n\t    // Swift \n\t    String[] testSuites = name.split(Pattern.quote(\".\"));\n\t    if ( testSuites.length == 2 ) {\n\t\tString xctestName = testSuites[0] + \".xctest\";\n\t\tString testSuite = testSuites[1];\n\t\tif ( !testSuitesHash.containsKey(xctestName) ) {\n\t\t    throw new RuntimeException(\"Log statements out of sync: current test suite '\" + xctestName + \"' not exists\");\n\t\t}\n\t\tcurrentTestSuite = testSuitesHash.get(testSuite);\n\t\tif ( currentTestSuite == null ) {\n\t    \t    throw new RuntimeException(\"Log statements out of sync: current test suite '\" + testSuite + \"' not exists\");\n\t\t}\n\t    }\n\t}\n    }\n\n    private void requireTestCase(String name) {\n\tcurrentTestCase = currentTestSuite.getTestCasesHash().get(name);\n        if(currentTestCase==null) {\n            throw new RuntimeException(\"Log statements out of sync: current test case '\" + currentTestSuite.getName() + \".\" + name + \"' not exists\");\n        }\n    }\n\n    private void writeTestReport() throws IOException, InterruptedException,\n            JAXBException {\n        try (OutputStream testReportOutputStream = outputForSuite()) {\n            JAXBContext jaxbContext;\n            Thread t = Thread.currentThread();\n            ClassLoader orig = t.getContextClassLoader();\n            t.setContextClassLoader(XCodeBuildOutputParser.class.getClassLoader());\n            try {\n                jaxbContext = JAXBContext.newInstance(TestSuite.class);\n            } finally {\n                t.setContextClassLoader(orig);\n            }\n            Marshaller marshaller = jaxbContext.createMarshaller();\n            marshaller.marshal(currentTestSuite, testReportOutputStream);\n        }\n    }\n\n    protected OutputStream outputForSuite() throws IOException,\n            InterruptedException {\n        return new FileOutputStream(new File(testReportsDir, \"TEST-\" + currentTestSuite.getName() + \".xml\"));\n    }\n\n    protected void handleLine(String line) throws ParseException, IOException, InterruptedException, JAXBException {\n        Matcher m = START_SUITE.matcher(line);\n        if(m.matches()) {\n\t    if (testSuitesHash.isEmpty()) {\n\t    \tconsoleLog = true;\n\t    }\n\t    String suite_name = m.group(1);\n\t    if ( m.group(1).endsWith(\".xctest\") ) {\n\t\tsuite_name = suite_name.replaceAll(\"-\", \"_\");\n\t    }\n            currentTestSuite = new TestSuite(InetAddress.getLocalHost().getHostName(), m.group(1), parseDate(m.group(2)));\n\t    testSuitesHash.put(suite_name, currentTestSuite);\n            return;\n        }\n\n        m = END_SUITE.matcher(line);\n        if(m.matches()) {\n            String suite_name = m.group(1);\n            if ( m.group(1).endsWith(\".xctest\") ) {\n                suite_name = suite_name.replaceAll(\"-\", \"_\");\n            }\n\t    requireTestSuite(suite_name);\n            currentTestSuite.setEndTime(parseDate(m.group(2)));\n            writeTestReport();\n            testSuitesHash.remove(suite_name);\n\t    currentTestSuite = null;\n\t    if ( testSuitesHash.size() == 1 ) {\n\t\t// If the last test suitev in nhash is Unknown, process it and exit.\n\t\tcurrentTestSuite = testSuitesHash.get(\"UnknownSuite\");\n\t\tif ( currentTestSuite != null ) {\n\t\t    currentTestSuite.setEndTime(parseDate(m.group(2)));\n\t\t    writeTestReport();\n\t\t    testSuitesHash.remove(suite_name);\n\t\t    currentTestSuite = null;\n\t\t}\n\t    }\n\t    if (testSuitesHash.isEmpty()) {\n                consoleLog = false;\n\t    }\n            return;\n        }\n\n        m = START_TESTCASE.matcher(line);\n        if(m.matches()) {\n\t    requireTestSuite(m.group(1));\n\t    currentTestCase = new TestCase(m.group(1), m.group(2));\n            currentTestSuite.getTestCasesHash().put(m.group(2), currentTestCase);\n            return;\n        }\n\n        m = END_TESTCASE.matcher(line);\n        if(m.matches()) {\n            requireTestSuite(m.group(1));\n            requireTestCase(m.group(2));\n            currentTestCase.setTime(Float.parseFloat(m.group(3)));\n            currentTestSuite.getTestCases().add(currentTestCase);\n            currentTestSuite.addTest();\n\t    // Actually, I think that the test case should be closed and deleted here.\n\t    // In case the error is reported late without synchronization.\n\t    //currentTestSuite.getTestCasesHash().remove(m.group(2));\n\t    currentTestCase = null;\n\t    return;\n\t}\n\n        m = ERROR_TESTCASE.matcher(line);\n        if(m.matches()) {\n            String errorLocation = m.group(1);\n            String testSuite = m.group(2);\n            String testCase = m.group(3);\n            String errorMessage = m.group(4);\n            requireTestSuite(testSuite);\n            requireTestCase(testCase);\n            TestFailure failure = new TestFailure(errorMessage, errorLocation);\n            currentTestCase.getFailures().add(failure);\n            return;\n        }\n\n\t// If the test result is returned asynchronously, there is a possibility\n\t//  that in this case the target test can not be decided and information\n\t//  is recorded in the wrong place.\n        m = ERROR_UI_TESTCASE.matcher(line);\n        if(m.matches()) {\n            String errorLocation = m.group(1);\n            String errorMessage = m.group(2);\n            TestFailure failure = new TestFailure(errorMessage, errorLocation);\n\n \t    if ( currentTestSuite == null ) {\n\t\tcurrentTestSuite = testSuitesHash.get(\"UnknownSuite\");\n\t\tif ( currentTestSuite == null ) {\n \t\t    currentTestSuite = new TestSuite(InetAddress.getLocalHost().getHostName(), \"UnknownSuite\", new Date());\n\t\t    testSuitesHash.put(\"UnknownSuite\", currentTestSuite);\n\t\t}\n \t    }\n                  \n\t    if ( currentTestCase == null ) {\n\t\tcurrentTestCase = currentTestSuite.getTestCasesHash().get(\"UnknownTestCase\");\n\t\tif ( currentTestCase == null ) {\n\t\t    currentTestCase = new TestCase(currentTestSuite.getName(), \"UnknownTestCase\");\n\t\t    currentTestSuite.getTestCasesHash().put(\"UnknownTestCase\", currentTestCase);\n\t\t    currentTestSuite.getTestCases().add(currentTestCase);\n\t\t    currentTestSuite.addTest();\n\t\t}\n\t    }\n\n            currentTestCase.getFailures().add(failure);\n            return;\n        }\n\n        m = FAILED_TESTCASE.matcher(line);\n        if(m.matches()) {\n            requireTestSuite(m.group(1));\n            requireTestCase(m.group(2));\n            currentTestSuite.addTest();\n            currentTestSuite.addFailure();\n            currentTestCase.setTime(Float.parseFloat(m.group(3)));\n            currentTestSuite.getTestCases().add(currentTestCase);\n\t    //currentTestSuite.getTestCasesHash().remove(m.group(2));\n\t    currentTestCase = null;\n            return;\n        }\n\n        m = FAILED_WITH_EXIT_CODE.matcher(line);\n        if(m.matches()) {\n            exitCode = Integer.parseInt(m.group(1));\n            return;\n        }\n\n        if(line.matches(\"BUILD FAILED\") || line.matches(\"\\\\*\\\\* TEST FAILED \\\\*\\\\*\")) {\n            exitCode = -1;\n        }\n        \n        m = TERMINATING_EXCEPTION.matcher(line);\n        if(m.matches()) {\n            exitCode = -1;\n            requireTestSuite();\n            if (currentTestCase != null) {\n                TestError error = new TestError(m.group(2), m.group(1));\n                currentTestCase.getErrors().add(error);\n                currentTestSuite.getTestCases().add(currentTestCase);\n                currentTestSuite.addTest();\n                currentTestSuite.addError();\n\t\t//currentTestSuite.getTestCasesHash().remove(currentTestCase.getName());\n                currentTestCase = null;\n            }\n            writeTestReport();\n            currentTestSuite = null;\n        }\n    }\n\n    public OutputStream getOutputStream() {\n        return captureOutputStream;\n    }\n\n    public int getExitCode() {\n        return exitCode;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XCodeBuilder.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage au.com.rayh;\n\nimport com.cloudbees.plugins.credentials.CredentialsMatchers;\nimport com.cloudbees.plugins.credentials.CredentialsProvider;\nimport com.google.common.base.Predicates;\nimport com.google.common.collect.Collections2;\nimport com.google.common.collect.Lists;\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\nimport hudson.AbortException;\nimport hudson.EnvVars;\nimport hudson.Extension;\nimport hudson.FilePath;\nimport hudson.Launcher;\nimport hudson.model.*;\nimport hudson.security.ACL;\nimport hudson.util.FormValidation;\nimport hudson.tasks.BuildStepDescriptor;\nimport hudson.tasks.Builder;\nimport hudson.util.CopyOnWriteList;\nimport hudson.util.QuotedStringTokenizer;\nimport hudson.plugins.xcode.XcodeInstallation;\nimport hudson.util.Secret;\nimport jenkins.tasks.SimpleBuildStep;\nimport org.jenkinsci.Symbol;\nimport org.apache.commons.lang.ArrayUtils;\nimport org.apache.commons.lang.BooleanUtils;\nimport org.apache.commons.lang.StringUtils;\nimport org.jenkinsci.plugins.tokenmacro.MacroEvaluationException;\nimport org.jenkinsci.plugins.tokenmacro.TokenMacro;\nimport org.kohsuke.stapler.DataBoundConstructor;\nimport org.kohsuke.stapler.DataBoundSetter;\nimport org.kohsuke.stapler.QueryParameter;\nimport jenkins.model.Jenkins;\n\nimport javax.inject.Inject;\nimport edu.umd.cs.findbugs.annotations.CheckForNull;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.ObjectStreamException;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.regex.Pattern;\nimport java.util.UUID;\nimport java.util.Collection;\nimport java.util.concurrent.TimeUnit;\n\nimport com.dd.plist.NSDictionary;\nimport com.dd.plist.PropertyListParser;\n\n/**\n * @author Ray Hilton\n */\n@SuppressFBWarnings(\"NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE\")\npublic class XCodeBuilder extends Builder implements SimpleBuildStep {\n\n    private static final int SIGTERM = 143;\n    private static final String DEVELOPMENT_ENV = \"Development\";\n    private static final String PRODUCTION_ENV = \"Production\";\n    private static final String DEV_SIGNING_CERTIFICATE_SELECTOR = \"iOS Developer\";\n    private static final String DIST_SIGNING_CERTIFICATE_SELECTOR = \"iOS Distribution\";\n    private static final String[] VALID_IPA_EXPORT_METHODS = { \"development\", \"ad-hoc\", \"enterprise\", \"app-store\" };\n\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private Boolean cleanBeforeBuild;\n    /**\n     * @since 1.3\n     */\n    @CheckForNull\n    private Boolean cleanTestReports;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private String configuration;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private String target;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private String sdk;\n    /**\n     * @since 1.1\n     */\n    @CheckForNull\n    private String symRoot;\n    /**\n     * @since 1.2\n     */\n    @CheckForNull\n    private String buildDir;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private String xcodeProjectPath;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private String xcodeProjectFile;\n    /**\n     * @since 1.3\n     */\n    @CheckForNull\n    private String xcodebuildArguments;\n    /**\n     * @since 1.2\n     */\n    @CheckForNull\n    private String xcodeSchema;\n    /**\n     * @since 1.2\n     */\n    @CheckForNull\n    private String xcodeWorkspaceFile;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private String cfBundleVersionValue;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private String cfBundleShortVersionStringValue;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private Boolean buildIpa;\n    /**\n     * @since 1.4.12\n     */\n    @CheckForNull\n    private String ipaExportMethod;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private Boolean generateArchive;\n    /**\n     * @since 2.0.1\n     */\n    @CheckForNull\n    private Boolean noConsoleLog;\n    /**\n     * @since 2.0.1\n     */\n    @CheckForNull\n    private String logfileOutputDirectory;\n    /**\n     * @since 1.5\n     **/\n    @CheckForNull\n    private Boolean unlockKeychain;\n    /**\n     * @since 1.4\n     */\n    @Deprecated\n    @CheckForNull\n    private String keychainName;\n    /**\n     * @since 2.0.12\n     */\n    @CheckForNull\n    private String keychainId;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private String keychainPath;\n    /**\n     * @since 1.0\n     */\n    @CheckForNull\n    private Secret keychainPwd;\n    /**\n     * @since 1.4.12\n     */\n    @CheckForNull\n    private String developmentTeamName;\n    /**\n     * @since 1.4.12\n     */\n    @CheckForNull\n    private String developmentTeamID;\n    /**\n     * @since 1.4\n     */\n    @CheckForNull\n    private Boolean allowFailingBuildResults;\n    /**\n     * @since 1.4\n     */\n    @CheckForNull\n    private String ipaName;\n    /**\n     * @since 1.4\n     */\n    @CheckForNull\n    private String ipaOutputDirectory;\n    /**\n     * @since 1.4\n     */\n    @CheckForNull\n    private Boolean provideApplicationVersion;\n    /**\n     * @since 1.4\n     */\n    @CheckForNull\n    private Boolean changeBundleID;\n    /**\n     * @since 1.4\n     */\n    @CheckForNull\n    private String bundleID;\n    /**\n     * @since 1.4\n     */\n    @CheckForNull\n    private String bundleIDInfoPlistPath;\n    /**\n     * @since 1.4\n     */\n    @CheckForNull\n    private Boolean interpretTargetAsRegEx;\n    /**\n     * @deprecated 2.0.3\n     *\n    @CheckForNull\n    private String ipaManifestPlistUrl;\n     */\n    /**\n     * @deprecated 2.0.7\n     *\n    @CheckForNull\n    private Boolean manualSigning;\n     */\n    /**\n     * @since 2.0.7\n     */\n    @CheckForNull\n    private String signingMethod;\n    /**\n     * @since 2.0.1\n     */\n    @CheckForNull\n    private ArrayList<ProvisioningProfile> provisioningProfiles;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private String xcodeName;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private Boolean uploadBitcode;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private Boolean uploadSymbols;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private Boolean compileBitcode;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private String thinning;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private Boolean embedOnDemandResourcesAssetPacksInBundle;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private String onDemandResourcesAssetPacksBaseURL;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private String appURL;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private String displayImageURL;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private String fullSizeImageURL;\n    /*\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private String assetPackManifestURL;\n    /**\n     * @since 2.0.3\n     */\n    @CheckForNull\n    private Boolean skipBuildStep;\n    /**\n     * @since 2.0.5\n     */\n    @CheckForNull\n    private Boolean stripSwiftSymbols;\n    /**\n     * @since 2.0.7\n     */\n    @CheckForNull\n    private Boolean copyProvisioningProfile;\n    /**\n     * @since 2.0.9\n     */\n    @CheckForNull\n    private Boolean useLegacyBuildSystem;\n    /**\n     * @since 2.0.11\n     */\n    @CheckForNull\n    private Boolean ignoreTestResults;\n    /**\n     * @since 2.0.11\n     */\n    @CheckForNull\n    private String resultBundlePath;\n    /**\n     * @since 2.0.11\n     */\n    @CheckForNull\n    private Boolean cleanResultBundlePath;\n\n    public Boolean getCleanBeforeBuild() {\n\treturn cleanBeforeBuild == null ? Boolean.valueOf(true) : cleanBeforeBuild;\n    }\n\n    @DataBoundSetter\n    public void setCleanBeforeBuild(Boolean cleanBeforeBuild) {\n\tthis.cleanBeforeBuild = cleanBeforeBuild;\n    }\n\n    public Boolean getCleanTestReports() {\n\treturn cleanTestReports == null ? Boolean.valueOf(false) : cleanTestReports;\n    }\n\n    @DataBoundSetter\n    public void setCleanTestReports(Boolean cleanTestReports) {\n\tthis.cleanTestReports = cleanTestReports;\n    }\n\n    @CheckForNull\n    public String getConfiguration() {\n\treturn configuration;\n    }\n\n    @DataBoundSetter\n    public void setConfiguration(String configuration) {\n\tthis.configuration = configuration;\n    }\n\n    @CheckForNull\n    public String getTarget() {\n\treturn target;\n    }\n\n    @DataBoundSetter\n    public void setTarget(String target) {\n\tthis.target = target;\n    }\n\n    @CheckForNull\n    public String getSdk() {\n\treturn sdk;\n    }\n\n    @DataBoundSetter\n    public void setSdk(String sdk) {\n\tthis.sdk = sdk;\n    }\n\n    @CheckForNull\n    public String getSymRoot() {\n\treturn symRoot;\n    }\n\n    @DataBoundSetter\n    public void setSymRoot(String symRoot) {\n\tthis.symRoot = symRoot;\n    }\n\n    @CheckForNull\n    public String getBuildDir() {\n\treturn buildDir;\n    }\n\n    @DataBoundSetter\n    public void setBuildDir(String buildDir) {\n\tthis.buildDir = buildDir;\n    }\n\n    @CheckForNull\n    public String getXcodeProjectPath() {\n\treturn xcodeProjectPath;\n    }\n\n    @DataBoundSetter\n    public void setXcodeProjectPath(String xcodeProjectPath) {\n\tthis.xcodeProjectPath = xcodeProjectPath;\n    }\n\n    @CheckForNull\n    public String getXcodeProjectFile() {\n\treturn xcodeProjectFile;\n    }\n\n    @DataBoundSetter\n    public void setXcodeProjectFile(String xcodeProjectFile) {\n\tthis.xcodeProjectFile = xcodeProjectFile;\n    }\n\n    @CheckForNull\n    public String getXcodebuildArguments() {\n\treturn xcodebuildArguments;\n    }\n\n    @DataBoundSetter\n    public void setXcodebuildArguments(String xcodebuildArguments) {\n\tthis.xcodebuildArguments = xcodebuildArguments;\n    }\n\n    @CheckForNull\n    public String getXcodeSchema() {\n\treturn xcodeSchema;\n    }\n\n    @DataBoundSetter\n    public void setXcodeSchema(String xcodeSchema) {\n\tthis.xcodeSchema = xcodeSchema;\n    }\n\n    @CheckForNull\n    public String getXcodeWorkspaceFile() {\n\treturn xcodeWorkspaceFile;\n    }\n\n    @DataBoundSetter\n    public void setXcodeWorkspaceFile(String xcodeWorkspaceFile) {\n\tthis.xcodeWorkspaceFile = xcodeWorkspaceFile;\n    }\n\n    @CheckForNull\n    public String getCfBundleVersionValue() {\n\treturn cfBundleVersionValue;\n    }\n\n    @DataBoundSetter\n    public void setCfBundleVersionValue(String cfBundleVersionValue) {\n\tthis.cfBundleVersionValue = cfBundleVersionValue;\n    }\n\n    @CheckForNull\n    public String getCfBundleShortVersionStringValue() {\n\treturn cfBundleShortVersionStringValue;\n    }\n\n    @DataBoundSetter\n    public void setCfBundleShortVersionStringValue(String cfBundleShortVersionStringValue) {\n\tthis.cfBundleShortVersionStringValue = cfBundleShortVersionStringValue;\n    }\n\n    public Boolean getBuildIpa() {\n\treturn buildIpa == null ? Boolean.valueOf(false) : buildIpa;\n    }\n\n    @DataBoundSetter\n    public void setBuildIpa(Boolean buildIpa) {\n\tthis.buildIpa = buildIpa;\n    }\n\n    public String getIpaExportMethod() {\n\treturn ipaExportMethod == null ? \"app-store\" : ipaExportMethod;\n    }\n\n    @DataBoundSetter\n    public void setIpaExportMethod(String ipaExportMethod) {\n\tthis.ipaExportMethod = ipaExportMethod;\n    }\n\n    public Boolean getGenerateArchive() {\n\treturn generateArchive == null ? Boolean.valueOf(false) : generateArchive;\n    }\n\n    @DataBoundSetter\n    public void setGenerateArchive(Boolean generateArchive) {\n\tthis.generateArchive = generateArchive;\n    }\n\n    public Boolean getNoConsoleLog() {\n\treturn noConsoleLog == null ? Boolean.valueOf(false) : noConsoleLog;\n    }\n\n    @DataBoundSetter\n    public void setNoConsoleLog(Boolean noConsoleLog) {\n\tthis.noConsoleLog = noConsoleLog;\n    }\n\n    @CheckForNull\n    public String getLogfileOutputDirectory() {\n\treturn logfileOutputDirectory;\n    }\n\n    @DataBoundSetter\n    public void setLogfileOutputDirectory(String logfileOutputDirectory) {\n\tthis.logfileOutputDirectory = logfileOutputDirectory;\n    }\n\n    public Boolean getUnlockKeychain() {\n\treturn unlockKeychain == null ? Boolean.valueOf(false) : unlockKeychain;\n    }\n\n    @DataBoundSetter\n    public void setUnlockKeychain(Boolean unlockKeychain) {\n\tthis.unlockKeychain = unlockKeychain;\n    }\n\n    @Deprecated\n    @CheckForNull\n    public String getKeychainName() {\n\treturn keychainName;\n    }\n\n    @CheckForNull\n    public String getKeychainId() {\n        return keychainId;\n    }\n\n    @Deprecated\n    @DataBoundSetter\n    public void setKeychainName(String keychainName) {\n\tthis.keychainName = keychainName;\n    }\n\n    @DataBoundSetter\n    public void setKeychainId(String keychainId) {\n        this.keychainId = keychainId;\n    }\n\n    @CheckForNull\n    public String getKeychainPath() {\n\treturn keychainPath;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPath(String keychainPath) {\n\tthis.keychainPath = keychainPath;\n    }\n\n    @CheckForNull\n    public Secret getKeychainPwd() {\n\treturn keychainPwd;\n    }\n\n    @DataBoundSetter\n    public void setKeychainPwd(Secret keychainPwd) {\n\tthis.keychainPwd = keychainPwd;\n    }\n\n    @CheckForNull\n    public String getDevelopmentTeamName() {\n\treturn developmentTeamName;\n    }\n\n    @DataBoundSetter\n    public void setDevelopmentTeamName(String developmentTeamName) {\n\tthis.developmentTeamName = developmentTeamName;\n    }\n\n    @CheckForNull\n    public String getDevelopmentTeamID() {\n\treturn developmentTeamID;\n    }\n\n    @DataBoundSetter\n    public void setDevelopmentTeamID(String developmentTeamID) {\n\tthis.developmentTeamID = developmentTeamID;\n    }\n\n    public Boolean getAllowFailingBuildResults() {\n\treturn allowFailingBuildResults == null ? Boolean.valueOf(false) : allowFailingBuildResults;\n    }\n\n    @DataBoundSetter\n    public void setAllowFailingBuildResults(Boolean allowFailingBuildResults) {\n\tthis.allowFailingBuildResults = allowFailingBuildResults;\n    }\n\n    @CheckForNull\n    public String getIpaName() {\n\treturn ipaName;\n    }\n\n    @DataBoundSetter\n    public void setIpaName(String ipaName) {\n\tthis.ipaName = ipaName;\n    }\n\n    @CheckForNull\n    public String getIpaOutputDirectory() {\n\treturn ipaOutputDirectory;\n    }\n\n    @DataBoundSetter\n    public void setIpaOutputDirectory(String ipaOutputDirectory) {\n\tthis.ipaOutputDirectory = ipaOutputDirectory;\n    }\n\n    public Boolean getProvideApplicationVersion() {\n\treturn provideApplicationVersion == null ? Boolean.valueOf(false) : provideApplicationVersion;\n    }\n\n    @DataBoundSetter\n    public void setProvideApplicationVersion(Boolean provideApplicationVersion) {\n\tthis.provideApplicationVersion = provideApplicationVersion;\n    }\n\n    public Boolean getChangeBundleID() {\n\treturn changeBundleID == null ? Boolean.valueOf(false) : changeBundleID;\n    }\n\n    @DataBoundSetter\n    public void setChangeBundleID(Boolean changeBundleID) {\n\tthis.changeBundleID = changeBundleID;\n    }\n\n    @CheckForNull\n    public String getBundleID() {\n\treturn bundleID;\n    }\n\n    @DataBoundSetter\n    public void setBundleID(String bundleID) {\n\tthis.bundleID = bundleID;\n    }\n\n    @CheckForNull\n    public String getBundleIDInfoPlistPath() {\n\treturn bundleIDInfoPlistPath;\n    }\n\n    @DataBoundSetter\n    public void setBundleIDInfoPlistPath(String bundleIDInfoPlistPath) {\n\tthis.bundleIDInfoPlistPath = bundleIDInfoPlistPath;\n    }\n\n    public Boolean getInterpretTargetAsRegEx() {\n\treturn interpretTargetAsRegEx == null ? Boolean.valueOf(false) : interpretTargetAsRegEx;\n    }\n\n    @DataBoundSetter\n    public void setInterpretTargetAsRegEx(Boolean interpretTargetAsRegEx) {\n\tthis.interpretTargetAsRegEx = interpretTargetAsRegEx;\n    }\n\n    @Deprecated\n    public Boolean getManualSigning() {\n\treturn ( signingMethod == null || signingMethod.equals(\"manual\") );\n    }\n\n    @Deprecated\n    @DataBoundSetter\n    public void setManualSigning(Boolean manualSigning) {\n\tthis.signingMethod = BooleanUtils.isTrue(manualSigning) ? \"manual\" : \"automatic\";\n    }\n\n    public String getSigningMethod() {\n\treturn signingMethod == null ? \"automatic\" : signingMethod;\n    }\n\n    @DataBoundSetter\n    public void setSigningMethod(String signingMethod) {\n\tthis.signingMethod = signingMethod;\n    }\n\n    @CheckForNull\n    public ArrayList<ProvisioningProfile> getProvisioningProfiles() {\n\treturn provisioningProfiles;\n    }\n\n    @DataBoundSetter\n    public void setProvisioningProfiles(ArrayList<ProvisioningProfile> provisioningProfiles) {\n\tthis.provisioningProfiles = provisioningProfiles;\n    }\n\n    @CheckForNull\n    public String getXcodeName() {\n\treturn xcodeName;\n    }\n\n    @DataBoundSetter\n    public void setXcodeName(String xcodeName) {\n\tthis.xcodeName = xcodeName;\n    }\n\n    public Boolean getUploadBitcode() {\n\treturn uploadBitcode == null ? Boolean.valueOf(true) : uploadBitcode;\n    }\n\n    @DataBoundSetter\n    public void setUploadBitcode(Boolean uploadBitcode) {\n\tthis.uploadBitcode = uploadBitcode;\n    }\n\n    public Boolean getUploadSymbols() {\n\treturn uploadSymbols == null ? Boolean.valueOf(true) : uploadSymbols;\n    }\n\n    @DataBoundSetter\n    public void setUploadSymbols(Boolean uploadSymbols) {\n\tthis.uploadSymbols = uploadSymbols;\n    }\n\n    public Boolean getCompileBitcode() {\n\treturn compileBitcode == null ? Boolean.valueOf(true) : compileBitcode;\n    }\n\n    @DataBoundSetter\n    public void setCompileBitcode(Boolean compileBitcode) {\n\tthis.compileBitcode = compileBitcode;\n    }\n\n    @CheckForNull\n    public String getThinning() {\n\treturn thinning;\n    }\n\n    @DataBoundSetter\n    public void setThinning(String thinning) {\n\tthis.thinning = thinning;\n    }\n\n    public Boolean getAssetPacksInBundle() {\n\treturn embedOnDemandResourcesAssetPacksInBundle == null ? Boolean.valueOf(true) : embedOnDemandResourcesAssetPacksInBundle;\n    }\n\n    @DataBoundSetter\n    public void setAssetPacksInBundle(Boolean assetPacksInBundle) {\n\tthis.embedOnDemandResourcesAssetPacksInBundle = assetPacksInBundle;\n    }\n\n    @CheckForNull\n    public String getAssetPacksBaseURL() {\n\treturn onDemandResourcesAssetPacksBaseURL;\n    }\n\n    @DataBoundSetter\n    public void setAssetPacksBaseURL(String assetPacksBaseURL) {\n\tthis.onDemandResourcesAssetPacksBaseURL = assetPacksBaseURL;\n    }\n\n    @CheckForNull\n    public String getAppURL() {\n\treturn appURL;\n    }\n\n    @DataBoundSetter\n    public void setAppURL(String appURL) {\n\tthis.appURL = appURL;\n    }\n\n    @CheckForNull\n    public String getDisplayImageURL() {\n\treturn displayImageURL;\n    }\n\n    @DataBoundSetter\n    public void setDisplayImageURL(String displayImageURL) {\n\tthis.displayImageURL = displayImageURL;\n    }\n\n    @CheckForNull\n    public String getFullSizeImageURL() {\n\treturn fullSizeImageURL;\n    }\n\n    @DataBoundSetter\n    public void setFullSizeImageURL(String fullSizeImageURL) {\n\tthis.fullSizeImageURL = fullSizeImageURL;\n    }\n\n    @CheckForNull\n    public String getAssetPackManifestURL() {\n\treturn assetPackManifestURL;\n    }\n\n    @DataBoundSetter\n    public void setAssetPackManifestURL(String assetPackManifestURL) {\n\tthis.assetPackManifestURL = assetPackManifestURL;\n    }\n\n    public Boolean getStripSwiftSymbols() {\n\treturn stripSwiftSymbols == null ? Boolean.valueOf(true) : stripSwiftSymbols;\n    }\n\n    @DataBoundSetter\n    public void setStripSwiftSymbols(Boolean stripSwiftSymbols) {\n\tthis.stripSwiftSymbols = stripSwiftSymbols;\n    }\n\n    public Boolean getCopyProvisioningProfile() {\n\treturn copyProvisioningProfile == null ? Boolean.valueOf(true) : copyProvisioningProfile;\n    }\n\n    @DataBoundSetter\n    public void setCopyProvisioningProfile(Boolean copyProvisioningProfile) {\n\tthis.copyProvisioningProfile = copyProvisioningProfile;\n    }\n\n    public Boolean getUseLegacyBuildSystem() {\n\treturn useLegacyBuildSystem == null ? Boolean.valueOf(false) : useLegacyBuildSystem;\n    }\n\n    @DataBoundSetter\n    public void setUseLegacyBuildSystem(Boolean useLegacyBuildSystem) {\n\tthis.useLegacyBuildSystem = useLegacyBuildSystem;\n    }\n\n    public Boolean getIgnoreTestResults() {\n\treturn ignoreTestResults == null ? Boolean.valueOf(false) : ignoreTestResults;\n    }\n\n    @DataBoundSetter\n    public void setIgnoreTestResults(Boolean ignoreTestResults) {\n\tthis.ignoreTestResults = ignoreTestResults;\n    }\n\n    public String getResultBundlePath() {\n        return resultBundlePath;\n    }\n\n    @DataBoundSetter\n    public void setResultBundlePath(String resultBundlePath) {\n        this.resultBundlePath = resultBundlePath;\n    }\n\n    @DataBoundSetter\n    public void setCleanResultBundlePath(Boolean cleanResultBundlePath) {\n        this.cleanResultBundlePath = cleanResultBundlePath;\n    }\n\n    public Boolean getCleanResultBundlePath() {\n        return cleanResultBundlePath == null ? Boolean.valueOf(true) : cleanResultBundlePath;\n    }\n\n    // Internally.\n    public void setSkipBuildStep(Boolean skipBuildStep) {\n        this.skipBuildStep = skipBuildStep;\n    }\n\n    // Fields in config.jelly must match the parameter names in the \"DataBoundConstructor\"\n    @DataBoundConstructor\n    public XCodeBuilder() {\n\tthis.skipBuildStep = Boolean.valueOf(false);\n    }\n\n    @Deprecated\n    public XCodeBuilder(Boolean buildIpa, Boolean generateArchive, Boolean noConsoleLog, String logfileOutputDirectory, Boolean cleanBeforeBuild, \n    \t\tBoolean cleanTestReports, String configuration,\n    \t\tString target, String sdk, String xcodeProjectPath, String xcodeProjectFile, String xcodebuildArguments,\n    \t\tString cfBundleVersionValue, String cfBundleShortVersionStringValue, Boolean unlockKeychain,\n    \t\tString keychainName, String keychainPath, String keychainPwd, String symRoot, String xcodeWorkspaceFile,\n    \t\tString xcodeSchema, String buildDir, String developmentTeamName, String developmentTeamID, Boolean allowFailingBuildResults,\n    \t\tString ipaName, Boolean provideApplicationVersion, String ipaOutputDirectory, Boolean changeBundleID, String bundleID,\n    \t\tString bundleIDInfoPlistPath, Boolean interpretTargetAsRegEx, String ipaExportMethod,\n\t\tString signingMethod, ArrayList<ProvisioningProfile> provisioningProfiles, String xcodeName,\n\t\tBoolean uploadBitcode, Boolean uploadSymbols, Boolean compileBitcode, String thinning,\n\t\tBoolean embedOnDemandResourcesAssetPacksInBundle, String onDemandResourcesAssetPacksBaseURL,\n\t\tString appURL, String displayImageURL, String fullSizeImageURL,\n\t\tString assetPackManifestURL) {\n\tthis();\n        this.buildIpa = buildIpa;\n        this.generateArchive = generateArchive;\n        this.noConsoleLog = noConsoleLog;\n        this.logfileOutputDirectory = logfileOutputDirectory;\n        this.sdk = sdk;\n        this.target = target;\n        this.cleanBeforeBuild = cleanBeforeBuild;\n        this.cleanTestReports = cleanTestReports;\n        this.configuration = configuration;\n        this.xcodeProjectPath = xcodeProjectPath;\n        this.xcodeProjectFile = xcodeProjectFile;\n        this.xcodebuildArguments = xcodebuildArguments;\n        this.keychainName = keychainName;\n        this.xcodeWorkspaceFile = xcodeWorkspaceFile;\n        this.xcodeSchema = xcodeSchema;\n        this.developmentTeamName = developmentTeamName;\n        this.developmentTeamID = developmentTeamID;\n        this.cfBundleVersionValue = cfBundleVersionValue;\n        this.cfBundleShortVersionStringValue = cfBundleShortVersionStringValue;\n        this.unlockKeychain = unlockKeychain;\n        this.keychainPath = keychainPath;\n        this.keychainPwd = Secret.fromString(keychainPwd);\n        this.symRoot = symRoot;\n        this.buildDir = buildDir;\n        this.allowFailingBuildResults = allowFailingBuildResults;\n        this.ipaName = ipaName;\n        this.ipaOutputDirectory = ipaOutputDirectory;\n        this.provideApplicationVersion = provideApplicationVersion;\n        this.changeBundleID = changeBundleID;\n        this.bundleID = bundleID;\n        this.bundleIDInfoPlistPath = bundleIDInfoPlistPath;\n        this.interpretTargetAsRegEx = interpretTargetAsRegEx;\n        //this.ipaManifestPlistUrl = null;\n        this.ipaExportMethod = ipaExportMethod;\n        this.signingMethod = signingMethod;\n        this.provisioningProfiles = provisioningProfiles;\n\tthis.xcodeName = xcodeName;\n\tthis.uploadBitcode = uploadBitcode;\n\tthis.uploadSymbols = uploadSymbols;\n\tthis.compileBitcode = compileBitcode;\n\tthis.thinning = thinning;\n\tthis.embedOnDemandResourcesAssetPacksInBundle = embedOnDemandResourcesAssetPacksInBundle;\n\tthis.onDemandResourcesAssetPacksBaseURL = onDemandResourcesAssetPacksBaseURL;\n\n\tthis.appURL = appURL;\n\tthis.displayImageURL = displayImageURL;\n\tthis.fullSizeImageURL = fullSizeImageURL;\n\tthis.assetPackManifestURL = assetPackManifestURL;\n\tthis.stripSwiftSymbols = Boolean.valueOf(true);\n\n\tthis.skipBuildStep = Boolean.valueOf(false);\n    }\n\n    @Deprecated\n    public XCodeBuilder(Boolean buildIpa, Boolean generateArchive, Boolean noConsoleLog, String logfileOutputDirectory, Boolean cleanBeforeBuild,\n\t\t\tBoolean cleanTestReports, String configuration,\n\t\t\tString target, String sdk, String xcodeProjectPath, String xcodeProjectFile, String xcodebuildArguments,\n\t\t\tString cfBundleVersionValue, String cfBundleShortVersionStringValue, Boolean unlockKeychain,\n\t\t\tString keychainName, String keychainPath, String keychainPwd, String symRoot, String xcodeWorkspaceFile,\n\t\t\tString xcodeSchema, String buildDir, String developmentTeamName, String developmentTeamID, Boolean allowFailingBuildResults,\n\t\t\tString ipaName, Boolean provideApplicationVersion, String ipaOutputDirectory, Boolean changeBundleID, String bundleID,\n\t\t\tString bundleIDInfoPlistPath, String ipaManifestPlistUrl, Boolean interpretTargetAsRegEx, String ipaExportMethod,\n\t\t\tString signingMethod, ArrayList<ProvisioningProfile> provisioningProfiles, String xcodeName) {\n\tthis(buildIpa, generateArchive, noConsoleLog, logfileOutputDirectory, cleanBeforeBuild, cleanTestReports, configuration,\n\t\ttarget, sdk, xcodeProjectPath, xcodeProjectFile, xcodebuildArguments,\n\t\tcfBundleVersionValue, cfBundleShortVersionStringValue, unlockKeychain,\n\t\tkeychainName, keychainPath, keychainPwd, symRoot, xcodeWorkspaceFile,\n\t\txcodeSchema, buildDir, developmentTeamName, developmentTeamID, allowFailingBuildResults,\n\t\tipaName, provideApplicationVersion, ipaOutputDirectory, changeBundleID, bundleID,\n\t\tbundleIDInfoPlistPath, interpretTargetAsRegEx, ipaExportMethod,\n\t\tsigningMethod, provisioningProfiles, xcodeName, true, true, true, null, false, null, ipaManifestPlistUrl, null, null, null);\n    }\n\n    @Deprecated\n    public XCodeBuilder(Boolean buildIpa, Boolean generateArchive, Boolean noConsoleLog, String logfileOutputDirectory, Boolean cleanBeforeBuild,\n                        Boolean cleanTestReports, String configuration,\n                        String target, String sdk, String xcodeProjectPath, String xcodeProjectFile, String xcodebuildArguments,\n                        String cfBundleVersionValue, String cfBundleShortVersionStringValue, Boolean unlockKeychain,\n                        String keychainName, String keychainPath, String keychainPwd, String symRoot, String xcodeWorkspaceFile,\n                        String xcodeSchema, String buildDir, String developmentTeamName, String developmentTeamID, Boolean allowFailingBuildResults,\n                        String ipaName, Boolean provideApplicationVersion, String ipaOutputDirectory, Boolean changeBundleID, String bundleID,\n                        String bundleIDInfoPlistPath, String ipaManifestPlistUrl, Boolean interpretTargetAsRegEx, String ipaExportMethod,\n                        Boolean manualSigning, ArrayList<ProvisioningProfile>provisioningProfiles) {\n        this(buildIpa, generateArchive, noConsoleLog, logfileOutputDirectory, cleanBeforeBuild, cleanTestReports, configuration,\n                target, sdk, xcodeProjectPath, xcodeProjectFile, xcodebuildArguments,\n                cfBundleVersionValue, cfBundleShortVersionStringValue, unlockKeychain,\n                keychainName, keychainPath, keychainPwd, symRoot, xcodeWorkspaceFile,\n                xcodeSchema, buildDir, developmentTeamName, developmentTeamID, allowFailingBuildResults,\n                ipaName, provideApplicationVersion, ipaOutputDirectory, changeBundleID, bundleID,\n                bundleIDInfoPlistPath, ipaManifestPlistUrl, interpretTargetAsRegEx, ipaExportMethod, (manualSigning ? \"manual\" : \"automatic\"), provisioningProfiles, null);\n    }\n\n    @Deprecated\n    public XCodeBuilder(Boolean buildIpa, Boolean generateArchive, Boolean noConsoleLog, String logfileOutputDirectory, Boolean cleanBeforeBuild,\n                        Boolean cleanTestReports, String configuration,\n                        String target, String sdk, String xcodeProjectPath, String xcodeProjectFile, String xcodebuildArguments,\n                        String cfBundleVersionValue, String cfBundleShortVersionStringValue, Boolean unlockKeychain,\n                        String keychainName, String keychainPath, String keychainPwd, String symRoot, String xcodeWorkspaceFile,\n                        String xcodeSchema, String buildDir, String developmentTeamName, String developmentTeamID, Boolean allowFailingBuildResults,\n                        String ipaName, Boolean provideApplicationVersion, String ipaOutputDirectory, Boolean changeBundleID, String bundleID,\n                        String bundleIDInfoPlistPath, String ipaManifestPlistUrl, Boolean interpretTargetAsRegEx, String ipaExportMethod) {\n        this(buildIpa, generateArchive, noConsoleLog, logfileOutputDirectory, cleanBeforeBuild, cleanTestReports, configuration,\n                target, sdk, xcodeProjectPath, xcodeProjectFile, xcodebuildArguments,\n                cfBundleVersionValue, cfBundleShortVersionStringValue, unlockKeychain,\n                keychainName, keychainPath, keychainPwd, symRoot, xcodeWorkspaceFile,\n                xcodeSchema, buildDir, developmentTeamName, developmentTeamID, allowFailingBuildResults,\n                ipaName, provideApplicationVersion, ipaOutputDirectory, changeBundleID, bundleID,\n                bundleIDInfoPlistPath, ipaManifestPlistUrl, interpretTargetAsRegEx, ipaExportMethod, true, null);\n    }\n\n    @Deprecated\n    public XCodeBuilder(Boolean buildIpa, Boolean generateArchive, Boolean cleanBeforeBuild, Boolean cleanTestReports, String configuration,\n                        String target, String sdk, String xcodeProjectPath, String xcodeProjectFile, String xcodebuildArguments,\n                        String cfBundleVersionValue, String cfBundleShortVersionStringValue, Boolean unlockKeychain,\n                        String keychainName, String keychainPath, String keychainPwd, String symRoot, String xcodeWorkspaceFile,\n                        String xcodeSchema, String buildDir, String developmentTeamName, String developmentTeamID, Boolean allowFailingBuildResults,\n                        String ipaName, Boolean provideApplicationVersion, String ipaOutputDirectory, Boolean changeBundleID, String bundleID,\n                        String bundleIDInfoPlistPath, String ipaManifestPlistUrl, Boolean interpretTargetAsRegEx, String ipaExportMethod) {\n\n        this(buildIpa, generateArchive, false, null, cleanBeforeBuild, cleanTestReports, configuration,\n                target, sdk, xcodeProjectPath, xcodeProjectFile, xcodebuildArguments,\n                cfBundleVersionValue, cfBundleShortVersionStringValue, unlockKeychain,\n                keychainName, keychainPath, keychainPwd, symRoot, xcodeWorkspaceFile,\n                xcodeSchema, buildDir, developmentTeamName, developmentTeamID, allowFailingBuildResults,\n                ipaName, provideApplicationVersion, ipaOutputDirectory, changeBundleID, bundleID,\n                bundleIDInfoPlistPath, ipaManifestPlistUrl, interpretTargetAsRegEx, ipaExportMethod);\n    }\n\n    @Deprecated\n    public XCodeBuilder(Boolean buildIpa, Boolean generateArchive, Boolean cleanBeforeBuild, Boolean cleanTestReports, String configuration,\n                        String target, String sdk, String xcodeProjectPath, String xcodeProjectFile, String xcodebuildArguments,\n                        String embeddedProfileFile, String cfBundleVersionValue, String cfBundleShortVersionStringValue, Boolean unlockKeychain,\n                        String keychainName, String keychainPath, String keychainPwd, String symRoot, String xcodeWorkspaceFile,\n                        String xcodeSchema, String configurationBuildDir, String codeSigningIdentity, Boolean allowFailingBuildResults,\n                        String ipaName, Boolean provideApplicationVersion, String ipaOutputDirectory, Boolean changeBundleID, String bundleID,\n                        String bundleIDInfoPlistPath, String ipaManifestPlistUrl, Boolean interpretTargetAsRegEx, Boolean signIpaOnXcrun) {\n\n        this(buildIpa, generateArchive, false, null, cleanBeforeBuild, cleanTestReports, configuration,\n                target, sdk, xcodeProjectPath, xcodeProjectFile, xcodebuildArguments,\n                cfBundleVersionValue, cfBundleShortVersionStringValue, unlockKeychain,\n                keychainName, keychainPath, keychainPwd, symRoot, xcodeWorkspaceFile,\n                xcodeSchema, configurationBuildDir, \"\", \"\", allowFailingBuildResults,\n                ipaName, provideApplicationVersion, ipaOutputDirectory, changeBundleID, bundleID,\n                bundleIDInfoPlistPath, ipaManifestPlistUrl, interpretTargetAsRegEx, \"ad-hoc\");\n    }\n\n    @SuppressWarnings(\"unused\")\n    private Object readResolve() throws ObjectStreamException {\n        if (provideApplicationVersion == null) {\n            if (!StringUtils.isEmpty(cfBundleVersionValue)\n                || !StringUtils.isEmpty(cfBundleShortVersionStringValue)) {\n                provideApplicationVersion = Boolean.valueOf(true);\n            }\n        }\n        return this;\n    }\n\n    @Override\n    public void perform(Run<?, ?> build, FilePath filePath, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {\n\t\tboolean result = _perform(build, filePath, launcher, build.getEnvironment(listener), listener);\n\t\tif (!result) {\n\t\t    throw new AbortException(Messages.XCodeBuilder_AbortXcodeBuildFailed());\n        }\n    }\n\n    @Override\n    public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {\n\t\treturn _perform(build, build.getWorkspace(), launcher, build.getEnvironment(listener), listener);\n\t}\n\n    @SuppressFBWarnings(\"DM_DEFAULT_ENCODING\")\n    private boolean _perform(Run<?,?> build, FilePath projectRoot, Launcher launcher, EnvVars envs, TaskListener listener) throws InterruptedException, IOException {\n\n        // check that the configured tools exist\n        if (!new FilePath(projectRoot.getChannel(), getGlobalConfiguration().getXcodebuildPath()).exists()) {\n            listener.fatalError(Messages.XCodeBuilder_xcodebuildNotFound(getGlobalConfiguration().getXcodebuildPath()));\n            return false;\n        }\n        if (!new FilePath(projectRoot.getChannel(), getGlobalConfiguration().getAgvtoolPath()).exists()) {\n            listener.fatalError(Messages.XCodeBuilder_avgtoolNotFound(getGlobalConfiguration().getAgvtoolPath()));\n            return false;\n        }\n\n        // Start expanding all string variables in parameters\n        // NOTE: we currently use variable shadowing to avoid having to rewrite all code (and break pull requests), this will be cleaned up at later stage.\n        String configuration = envs.expand(this.configuration);\n        String target = envs.expand(this.target);\n        String sdk = envs.expand(this.sdk);\n        String symRoot = envs.expand(this.symRoot);\n        String buildDir = envs.expand(this.buildDir);\n        String xcodeProjectPath = envs.expand(this.xcodeProjectPath);\n        String xcodeProjectFile = envs.expand(this.xcodeProjectFile);\n        String xcodebuildArguments = envs.expand(this.xcodebuildArguments);\n        String xcodeSchema = envs.expand(this.xcodeSchema);\n        String xcodeWorkspaceFile = envs.expand(this.xcodeWorkspaceFile);\n        String cfBundleVersionValue = envs.expand(this.cfBundleVersionValue);\n        String cfBundleShortVersionStringValue = envs.expand(this.cfBundleShortVersionStringValue);\n        String ipaName = envs.expand(this.ipaName);\n        String ipaOutputDirectory = envs.expand(this.ipaOutputDirectory);\n        String bundleID = envs.expand(this.bundleID);\n        String bundleIDInfoPlistPath = envs.expand(this.bundleIDInfoPlistPath);\n        //String ipaManifestPlistUrl = envs.expand(this.ipaManifestPlistUrl);\n        String ipaExportMethod = envs.expand(this.ipaExportMethod);\n\tString thinning = envs.expand(this.thinning);\n\tString onDemandResourcesAssetPacksBaseURL = envs.expand(this.onDemandResourcesAssetPacksBaseURL);\n\tString appURL = envs.expand(this.appURL);\n\tString displayImageURL = envs.expand(this.displayImageURL);\n\tString fullSizeImageURL = envs.expand(this.fullSizeImageURL);\n\tString assetPackManifestURL = envs.expand(this.assetPackManifestURL);\n        // End expanding all string variables in parameters\n\n        // Set the working directory\n        if (!StringUtils.isEmpty(xcodeProjectPath)) {\n            projectRoot = projectRoot.child(xcodeProjectPath);\n        }\n        listener.getLogger().println(Messages.XCodeBuilder_workingDir(projectRoot));\n\n        if (!StringUtils.isEmpty(this.xcodeName)) {\n            Jenkins jenkinsInstance = Jenkins.getInstance();\n            XcodeInstallation.DescriptorImpl descriptor = (XcodeInstallation.DescriptorImpl)jenkinsInstance.getDescriptor(XcodeInstallation.class);\n            XcodeInstallation[] installations = descriptor.getInstallations();\n            if ( installations != null ) {\n                for ( XcodeInstallation installation : installations ) {\n                    if ( installation.getName().equals(this.xcodeName) ) {\n                        envs.put(\"DEVELOPER_DIR\", installation.getHome());\n\t\t\tlistener.getLogger().println(Messages.XCodeBuilder_XcodeToolsDir(installation.getHome()));\n                        break;\n                    }\n                }\n            }\n        }\n\n        // Infer as best we can the build platform\n        String buildPlatform = \"iphoneos\";\n        if (!StringUtils.isEmpty(sdk)) {\n            if (StringUtils.contains(sdk.toLowerCase(), \"iphonesimulator\")) {\n                // Building for the simulator\n                buildPlatform = \"iphonesimulator\";\n            }\n        }\n\n        // Set the build directory and the symRoot\n        //\n        String symRootValue = null;\n        if (!StringUtils.isEmpty(symRoot)) {\n            try {\n                // If not empty we use the Token Expansion to replace it\n                // https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\n                symRootValue = TokenMacro.expandAll(build, projectRoot, listener, symRoot).trim();\n            } catch (MacroEvaluationException e) {\n                listener.error(Messages.XCodeBuilder_symRootMacroError(e.getMessage()));\n                return false;\n            }\n        }\n\n        ByteArrayOutputStream output = new ByteArrayOutputStream();\n\n        // Try to read CFBundleShortVersionString from project\n        listener.getLogger().println(Messages.XCodeBuilder_fetchingCFBundleShortVersionString());\n        String cfBundleShortVersionString = \"\";\n        int returnCode = launcher.launch().envs(envs).cmds(getGlobalConfiguration().getAgvtoolPath(), \"mvers\", \"-terse1\").stdout(output).pwd(projectRoot).join();\n        // only use this version number if we found it\n        if (returnCode == 0)\n            cfBundleShortVersionString = output.toString().trim();\n        if (StringUtils.isEmpty(cfBundleShortVersionString))\n            listener.getLogger().println(Messages.XCodeBuilder_CFBundleShortVersionStringNotFound());\n        else\n            listener.getLogger().println(Messages.XCodeBuilder_CFBundleShortVersionStringFound(cfBundleShortVersionString));\n        listener.getLogger().println(Messages.XCodeBuilder_CFBundleShortVersionStringValue(cfBundleShortVersionString));\n\n        output.reset();\n\n        // Try to read CFBundleVersion from project\n        listener.getLogger().println(Messages.XCodeBuilder_fetchingCFBundleVersion());\n        String cfBundleVersion = \"\";\n        returnCode = launcher.launch().envs(envs).cmds(getGlobalConfiguration().getAgvtoolPath(), \"vers\", \"-terse\").stdout(output).pwd(projectRoot).join();\n        // only use this version number if we found it\n        if (returnCode == 0)\n            cfBundleVersion = output.toString().trim();\n        if (StringUtils.isEmpty(cfBundleVersion))\n            listener.getLogger().println(Messages.XCodeBuilder_CFBundleVersionNotFound());\n        else\n            listener.getLogger().println(Messages.XCodeBuilder_CFBundleVersionFound(cfBundleVersion));\n        listener.getLogger().println(Messages.XCodeBuilder_CFBundleVersionValue(cfBundleVersion));\n\n        String buildDescription = cfBundleShortVersionString + \" (\" + cfBundleVersion + \")\";\n        XCodeAction a = new XCodeAction(buildDescription);\n        build.addAction(a);\n\n        // Update the bundle ID\n        if ( BooleanUtils.isTrue(this.changeBundleID) ) {\n        \tlistener.getLogger().println(Messages.XCodeBuilder_CFBundleIdentifierChanged(bundleIDInfoPlistPath, bundleID));\n        \treturnCode = launcher.launch().envs(envs).cmds(\"/usr/libexec/PlistBuddy\", \"-c\",  \"Set :CFBundleIdentifier \" + bundleID, bundleIDInfoPlistPath).stdout(listener).pwd(projectRoot).join();\n\n        \tif (returnCode > 0) {\n        \t\tlistener.fatalError(Messages.XCodeBuilder_CFBundleIdentifierInfoPlistNotFound(bundleIDInfoPlistPath));\n        \t\treturn false;\n        \t}\n        }\n\n        // Update the Marketing version (CFBundleShortVersionString)\n        if ( BooleanUtils.isTrue(this.provideApplicationVersion) && !StringUtils.isEmpty(cfBundleShortVersionStringValue)) {\n            try {\n                // If not empty we use the Token Expansion to replace it\n                // https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\n                cfBundleShortVersionString = TokenMacro.expandAll(build, projectRoot, listener, cfBundleShortVersionStringValue);\n                listener.getLogger().println(Messages.XCodeBuilder_CFBundleShortVersionStringUpdate(cfBundleShortVersionString));\n                returnCode = launcher.launch().envs(envs).cmds(getGlobalConfiguration().getAgvtoolPath(), \"new-marketing-version\", cfBundleShortVersionString).stdout(listener).pwd(projectRoot).join();\n                if (returnCode > 0) {\n                    listener.fatalError(Messages.XCodeBuilder_CFBundleShortVersionStringUpdateError(cfBundleShortVersionString));\n                    return false;\n                }\n            } catch (MacroEvaluationException e) {\n                listener.fatalError(Messages.XCodeBuilder_CFBundleShortVersionStringMacroError(e.getMessage()));\n                // Fails the build\n                return false;\n            }\n        }\n\n        // Update the Technical version (CFBundleVersion)\n        if ( BooleanUtils.isTrue(this.provideApplicationVersion) && !StringUtils.isEmpty(cfBundleVersionValue)) {\n            try {\n                // If not empty we use the Token Expansion to replace it\n                // https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\n                cfBundleVersion = TokenMacro.expandAll(build, projectRoot, listener, cfBundleVersionValue);\n                listener.getLogger().println(Messages.XCodeBuilder_CFBundleVersionUpdate(cfBundleVersion));\n                returnCode = launcher.launch().envs(envs).cmds(getGlobalConfiguration().getAgvtoolPath(), \"new-version\", \"-all\", cfBundleVersion).stdout(listener).pwd(projectRoot).join();\n                if (returnCode > 0) {\n                    listener.fatalError(Messages.XCodeBuilder_CFBundleVersionUpdateError(cfBundleVersion));\n                    return false;\n                }\n            } catch (MacroEvaluationException e) {\n                listener.fatalError(Messages.XCodeBuilder_CFBundleVersionMacroError(e.getMessage()));\n                // Fails the build\n                return false;\n            }\n        }\n\n        listener.getLogger().println(Messages.XCodeBuilder_CFBundleShortVersionStringUsed(cfBundleShortVersionString));\n        listener.getLogger().println(Messages.XCodeBuilder_CFBundleVersionUsed(cfBundleVersion));\n\n\tString developmentTeamID = null;\n        boolean archiveAutomaticSigning = false;\n        if ( signingMethod != null && signingMethod.equals(\"readFromProject\") ) {\n\t    provisioningProfiles = new ArrayList<>();\n\t    listener.getLogger().println(Messages.XCodeBuilder_ReadSigningInfoFromProject());\n\t    XcodeProject xcodeProject = null;\n\t    ArrayList<FilePath> projectLocations = new ArrayList<FilePath>();\n\t    // Retrieve target from Xcode project.\n\t    FilePath projectLocation = null;\n\t    if ( !StringUtils.isEmpty(xcodeProjectFile) ) {\n\t\t// Retrieve provisioning profile information from Xcode project file.\n\t\tprojectLocation = projectRoot.child(xcodeProjectFile);\n\t\tif ( !projectLocation.exists() || !projectLocation.isDirectory() ) {\n\t\t    listener.getLogger().println(Messages.XCodeBuilder_CouldNotReadInfoFrom(projectLocation.absolutize().getRemote()));\n\t\t    projectLocation = null;\n\t\t}\n\t    }\n\n\t    // JENKINS-54113\n\t    if ( !StringUtils.isEmpty(xcodeWorkspaceFile) ) {\n\t\t// Retrieve target from Xcode workspace.\n\t\tlistener.getLogger().println(Messages.XCodeBuilder_ReadInfoFromWorkspace(xcodeWorkspaceFile));\n\t\tList<String> projectList = XcodeProjectParser.parseXcodeWorkspace(projectRoot.child(xcodeWorkspaceFile + \".xcworkspace\"));\n\t\tif ( projectList == null ) {\n\t\t    listener.getLogger().println(\"Empty or Invalid workspacefile: \" + projectRoot.child(xcodeWorkspaceFile + \".xcworkspace\").absolutize().getRemote());\n\t\t}\n\t\telse if ( projectList.size() > 0 && xcodeSchema != null && !StringUtils.isEmpty(xcodeSchema) ) {\n\t\t    for ( String location : projectList ) {\n\t\t\tHashMap<String, ProjectScheme> xcodeSchemes = XcodeProjectParser.listXcodeSchemes(projectRoot.child(location));\n\t\t\t// JENKINS-59523, JENKINS-59609\n\t\t\tif ( xcodeSchemes == null ) {\n\t\t\t    listener.getLogger().println(\"Skipping empty or invalid scheme file: \" + location);\n\t\t\t    continue;\n\t\t\t}\n\t\t\tProjectScheme projectScheme = xcodeSchemes.get(xcodeSchema);\n\t\t\t// JENKINS-59523, JENKINS-59609\n\t\t\tif ( projectScheme == null ) {\n\t\t\t    listener.getLogger().println(\"Skipping undefined schema: \" + xcodeSchema);\n\t\t\t    continue;\n\t\t\t}\n\t\t\tString referencedContainerLocation = projectScheme.referencedContainer.replaceAll(\"^container:\", \"\");\n\t\t\tprojectLocation = projectRoot.child(referencedContainerLocation);\n\t\t\ttarget = projectScheme.blueprintName;\n\t\t\tbreak;\n\t\t    }\n                }\n\t\telse if ( projectList.size() > 1 ) {\n\t\t    // Xcode build generates an error if there are multiple xcodeproj.\n\t\t    listener.fatalError(Messages.XCodeBuilder_MultipleProjectInWorkSpace());\n\t\t    return false;\n\t\t}\n\t\telse {\n\t\t    // Workspace file have only one project.\n\t\t    projectLocation = projectRoot.child(projectList.get(0));\n\t\t}\n            }\n\n\t    if ( projectLocation == null ) {\n\t\t// Retrieve xcodeproj from current working directory.\n\t\tList<FilePath> xcodeProjects = projectRoot.list(new XcodeProjectFileFilter());\n\t\tif ( xcodeProjects == null ) {\n\t\t    listener.fatalError(Messages.XCodeBuilder_NoArchivesInBuildDirectory(projectRoot.absolutize().getRemote()));\n\t\t    return false;\n\t\t}\n\n\t\tif ( xcodeProjects.size() > 1 ) {\n\t\t    // Xcode build generates an error if there are multiple xcodeproj.\n\t\t    listener.fatalError(Messages.XCodeBuilder_MultipleProjectInWorkSpace());\n\t\t    return false;\n\t\t}\n\t\tprojectLocation = xcodeProjects.get(0);\n\t    }\n\t   \n\t    projectLocations.add(projectLocation); \n\t    for ( FilePath examineLocation : projectLocations ) {\n                // Parse Xcode project file.\n                xcodeProject = XcodeProjectParser.parseXcodeProject(examineLocation);\n                if ( xcodeProject == null ) {\n\t\t    listener.getLogger().println(Messages.XCodeBuilder_CouldNotReadProjectInfoFrom(examineLocation.absolutize().getRemote()));\n                    return false;      \n                }\n\t\t// Examine all targets.\n\t\tfor ( String key : xcodeProject.projectTarget.keySet() ) {\n\t\t    ProjectTarget projectTarget = xcodeProject.projectTarget.get(key);\n\t\t    String exportConfiguration = null;\n\t\t    if ( !StringUtils.isEmpty(ipaExportMethod) ) {\n\t\t\tif ( ipaExportMethod.equals(\"app-store\") ) {\n\t\t\t    exportConfiguration = \"Release\";\n\t\t\t}\n                        else if ( ipaExportMethod.equals(\"enterprise\") ) {\n                            exportConfiguration = \"Enterprise\";\n                        }\n\t\t\telse if ( ipaExportMethod.equals(\"ad-hoc\") ) {\n\t\t\t    exportConfiguration = \"AdHoc\";\n\t\t\t}\n\t\t\telse {\n\t\t\t    exportConfiguration = \"Debug\";\n\t\t\t}\n                    }\n\t\t    else if ( StringUtils.isEmpty(configuration) ) {\n\t\t\texportConfiguration = projectTarget.defaultConfigurationName;\n\t\t    }\n\t\t    boolean automaticSigning = projectTarget.provisioningStyle.equals(\"Automatic\");\n                    if ( projectTarget.testTargetID == null ) {\n                        // The target is not a test.\n                        archiveAutomaticSigning = automaticSigning;\n                    }\n\t\t    BuildConfiguration buildConfiguration = projectTarget.buildConfiguration.get(exportConfiguration);\n\t\t    if ( buildConfiguration == null ) {\n\t\t\tlistener.getLogger().println(Messages.XCodeBuilder_CouldNotGetBuildConfig(exportConfiguration, examineLocation.absolutize().getRemote()));\n\t\t\texportConfiguration = \"Release\";\n\t\t\tbuildConfiguration = projectTarget.buildConfiguration.get(exportConfiguration);\n\t\t\tif ( buildConfiguration == null ) {\n\t\t\t    return false;\n\t\t\t}\n\t\t\telse {\n\t\t\t    // Fallback to Release configuretion.`\n\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_UseingReleaseConfigFor());\n\t\t\t}\n\t\t    }\n\t\t    if ( buildConfiguration.developmentTeamId != null ) {\n\t\t\tdevelopmentTeamID = buildConfiguration.developmentTeamId;\n\t\t\tlistener.getLogger().println(Messages.XCodeBuilder_FoundDevelopmentTeamID(developmentTeamID, examineLocation.absolutize().getRemote()));\n\t\t    }\n\t\t    if ( !automaticSigning ) {\n\t\t\tString provisioningProfileUUID = buildConfiguration.provisioningProfileUUID;\n\t\t\tString provisioningProfileSpecifier = buildConfiguration.provisioningProfileSpecifier;\n\t\t\tString bundleIdentifier = null;\n\t\t\tif ( buildConfiguration.bundleIdentifier != null ) {\n\t\t\t    bundleIdentifier = buildConfiguration.bundleIdentifier;\n\t\t\t}\n\t\t\telse {\n\t\t\t    // Placeholder replacement.\n\t\t\t    // Currentry only support \"${TARGET_NAME}\" and \"$(TARGET_NAME)\"\n\t\t\t    String productName = buildConfiguration.productName;\n\t\t\t    productName = productName.replaceAll(Pattern.quote(\"${TARGET_NAME}\"), key);\n\t\t\t    productName = productName.replaceAll(Pattern.quote(\"$(TARGET_NAME)\"), key);\n\t\t\t    InfoPlist infoPlist = XcodeProjectParser.parseInfoPlist(projectRoot.child(buildConfiguration.infoPlistFile));\n\t\t\t    if ( infoPlist == null ) {\n\t\t\t\tlistener.getLogger().println(Messages.XCodeBuilder_CouldNotReadInfoFrom(projectRoot.child(buildConfiguration.infoPlistFile).absolutize().getRemote()));\n\t\t\t\treturn false;\n\t\t\t    }\n\t\t\t    // Placeholder replacement.\n\t\t\t    // Currentry only support \"$(PRODUCT_NAME:rfc1034identifier)\"\n\t\t\t    bundleIdentifier = infoPlist.getCfBundleIdentifier();\n\t\t\t    productName = productName.replaceAll(\" \", \"-\");\n\t\t\t    bundleIdentifier = bundleIdentifier.replaceAll(Pattern.quote(\"$(PRODUCT_NAME:rfc1034identifier)\"), productName);\n\t\t\t}\n\t\t\t// PROVISIONING_PROFILE(UUID) or PROVISIONING_PROFILE_SPECIFIER\n\t\t\tString provisioningProfileIdentifier = null;\n\t\t\tif ( provisioningProfileSpecifier != null ) {\n\t\t\t    // We will use SPECIFIE instead UUID.\n\t\t\t    provisioningProfileIdentifier = provisioningProfileSpecifier;\n\t\t\t}\n\t\t\telse {\n\t\t\t    provisioningProfileIdentifier = provisioningProfileUUID;\n\t\t\t}\n\t\t\tif ( provisioningProfileIdentifier != null ) {\n\t\t\t    provisioningProfiles.add(new ProvisioningProfile(bundleIdentifier, provisioningProfileIdentifier));\n\t\t\t}\n\t\t    }\n\t\t    if ( StringUtils.isEmpty(configuration) && projectTarget.productType.equals(\"com.apple.product-type.application\") ) {\n\t\t\tconfiguration = exportConfiguration;\n\t\t    }\n\t\t}\n\t    }\n\t    for ( ProvisioningProfile rp : provisioningProfiles ) {\n\t\tlistener.getLogger().println(\"UUID/SPECIFIER                       CFbundleIdentifier\");\n\t\tlistener.getLogger().println(rp.getProvisioningProfileUUID() + \" \" + rp.getProvisioningProfileAppId());\n\t    }\n        }\n        else {\n            // If developmentTeamName is set the developmentTeamID is invalid.\n\t    if ( StringUtils.isEmpty(developmentTeamName) ) {\n                developmentTeamID = envs.expand(this.developmentTeamID);\n            }\n\t    if (StringUtils.isEmpty(developmentTeamID)) {\n\t        Team team = getDevelopmentTeam();\n                if (team == null) {\n\t\t    listener.getLogger().println(Messages.XCodeBuilder_teamNotConfigured());\n\t        } else {\n\t\t    developmentTeamID = envs.expand(team.getTeamID());\n\t\t    if (!StringUtils.isEmpty(developmentTeamID)) {\n\t\t        listener.getLogger().println(Messages.XCodeBuilder_DebugInfoCanFindCertificates());\n\t\t        /*returnCode =*/\n\t\t        launcher.launch().envs(envs).cmds(\"/usr/bin/security\", \"find-certificate\", \"-a\", \"-c\", developmentTeamID, \"-Z\", \"|\", \"grep\", \"^SHA-1\").stdout(listener).pwd(projectRoot).join();\n\t\t        // We could fail here, but this doesn't seem to work as it should right now (output not properly redirected. We might need a parser)\n\t\t    }\n\t        }\n\t    }\n        }\n\n        listener.getLogger().println(Messages.XCodeBuilder_DebugInfoAvailableSDKs());\n        /*returnCode =*/ launcher.launch().envs(envs).cmds(getGlobalConfiguration().getXcodebuildPath(), \"-showsdks\").stdout(listener).pwd(projectRoot).join();\n\n        XcodeBuildListParser xcodebuildListParser;\n        {\n            List<String> commandLine = Lists.newArrayList(getGlobalConfiguration().getXcodebuildPath());\n            commandLine.add(\"-list\");\n            // xcodebuild -list -workspace $workspace\n            listener.getLogger().println(Messages.XCodeBuilder_DebugInfoAvailableSchemes());\n            if (!StringUtils.isEmpty(xcodeWorkspaceFile)) {\n                commandLine.add(\"-workspace\");\n                commandLine.add(xcodeWorkspaceFile + \".xcworkspace\");\n            } else if (!StringUtils.isEmpty(xcodeProjectFile)) {\n                commandLine.add(\"-project\");\n                commandLine.add(xcodeProjectFile);\n            }\n\n            ByteArrayOutputStream baos = new ByteArrayOutputStream();\n            returnCode = launcher.launch().envs(envs).cmds(commandLine).stdout(baos).pwd(projectRoot).start().joinWithTimeout(10, TimeUnit.SECONDS, listener);\n            String xcodeBuildListOutput = baos.toString(\"UTF-8\");\n            listener.getLogger().println(xcodeBuildListOutput);\n            boolean timedOut = returnCode == SIGTERM;\n            if (returnCode > 0 && !timedOut) return false;\n\n            xcodebuildListParser = new XcodeBuildListParser(xcodeBuildListOutput);\n        }\n\n        XcodeBuildHelpParser xcodebuildHelpParser;\n        {\n            List<String> commandLine = Lists.newArrayList(getGlobalConfiguration().getXcodebuildPath());\n            commandLine.add(\"-help\");\n            // xcodebuild -help\n            listener.getLogger().println(Messages.XCodeBuilder_DebugInfoAvailableParameters());\n\n            ByteArrayOutputStream baos = new ByteArrayOutputStream();\n            returnCode = launcher.launch().envs(envs).cmds(commandLine).stdout(baos).pwd(projectRoot).start().joinWithTimeout(10, TimeUnit.SECONDS, listener);\n            String xcodeBuildHelpOutput = baos.toString(\"UTF-8\");\n            boolean timedOut = returnCode == SIGTERM;\n            if (returnCode > 0 && !timedOut) return false;\n\n            xcodebuildHelpParser = new XcodeBuildHelpParser(xcodeBuildHelpOutput);\n        }\n\tboolean haveAllowProvisioningUpdates = false;\n\tList<String> availableParameters = xcodebuildHelpParser.getParameters();\n\tif (availableParameters.isEmpty()) {\n\t    listener.getLogger().println(Messages.XCodeBuilder_NoAvailableParameters());\n\t    haveAllowProvisioningUpdates = false;\n\t}\n\telse {\n\t    listener.getLogger().println(StringUtils.join(availableParameters, \"\\n\"));\n\t    if(availableParameters.contains(\"-allowProvisioningUpdates\")){\n\t\thaveAllowProvisioningUpdates = true;\n\t    }\n\t}\n\tlistener.getLogger().println(Messages.XCodeBuilder_DebugInfoLineDelimiter());\n\n        String buildDirValue = null;\n        FilePath buildDirectory;\n        if (!StringUtils.isEmpty(buildDir)) {\n            try {\n                buildDirValue = TokenMacro.expandAll(build, projectRoot, listener, buildDir).trim();\n            } catch (MacroEvaluationException e) {\n                listener.error(Messages.XCodeBuilder_buildDirMacroError(e.getMessage()));\n                return false;\n            }\n        }\n\n        if (buildDirValue != null) {\n            // If there is a BUILD_DIR, that overrides any use of SYMROOT. Does not require the build platform and the configuration.\n            buildDirectory = new FilePath(projectRoot.getChannel(), buildDirValue);\n        } else if (symRootValue != null) {\n            // If there is a SYMROOT specified, compute the build directory from that.\n            buildDirectory = new FilePath(projectRoot.getChannel(), symRootValue).child(configuration + \"-\" + buildPlatform);\n        } else {\n            // Assume its a build for the handset, not the simulator.\n            buildDirectory = projectRoot.child(\"build\").child(configuration + \"-\" + buildPlatform);\n        }\n\tlistener.getLogger().println(Messages.XCodeBuilder_BuildDirectory(buildDirectory.absolutize()));\n\n        // XCode Version\n        returnCode = launcher.launch().envs(envs).cmds(getGlobalConfiguration().getXcodebuildPath(), \"-version\").stdout(listener).pwd(projectRoot).join();\n        if (returnCode > 0) {\n            listener.fatalError(Messages.XCodeBuilder_xcodeVersionNotFound());\n            return false; // We fail the build if XCode isn't deployed\n        }\n\n        // Clean build directories\n        if ( BooleanUtils.isNotFalse(cleanBeforeBuild) ) {\n            listener.getLogger().println(Messages.XCodeBuilder_cleaningBuildDir(buildDirectory.absolutize().getRemote()));\n            buildDirectory.deleteRecursive();\n        }\n\n        // remove test-reports and *.ipa\n        if ( BooleanUtils.isTrue(cleanTestReports) ) {\n            listener.getLogger().println(Messages.XCodeBuilder_cleaningTestReportsDir(projectRoot.child(\"test-reports\").absolutize().getRemote()));\n            projectRoot.child(\"test-reports\").deleteRecursive();\n\t}\n\n        if ( BooleanUtils.isNotFalse(cleanResultBundlePath) && StringUtils.isNotEmpty(resultBundlePath) ) {\n            listener.getLogger().println(Messages.XCodeBuilder_CleaningResultBundlePath(projectRoot.child(resultBundlePath).absolutize().getRemote()));\n            projectRoot.child(resultBundlePath).deleteRecursive();\n        }\n\n        if ( BooleanUtils.isTrue(unlockKeychain) ) {\n            // Let's unlock the keychain\n            String keychainPath;\n            String keychainPwd;\n\n            // for backward compatibility\n            if (StringUtils.isNotEmpty(keychainName)) {\n                listener.getLogger().println(Messages.XCodeBuilder_UseDeprecatedKeychainInfo());\n                Keychain keychain = getKeychain(keychainName);\n                if (keychain == null) {\n                    listener.fatalError(Messages.XCodeBuilder_keychainNotConfigured());\n                    return false;\n                }\n                keychainPath = envs.expand(keychain.getKeychainPath());\n                keychainPwd = envs.expand(Secret.toString(keychain.getKeychainPassword()));\n            }\n            else if (StringUtils.isNotEmpty(keychainId)) {\n                KeychainPasswordAndPath keychain = getKeychainPasswordAndPath(build.getParent(), keychainId);\n                if (keychain == null) {\n                    listener.fatalError(Messages.XCodeBuilder_keychainNotConfigured());\n                    return false;\n                }\n                keychainPath = envs.expand(keychain.getKeychainPath());\n                keychainPwd = envs.expand(keychain.getPassword().getPlainText());\n            }\n            else {\n                keychainPath = this.keychainPath;\n                keychainPwd = Secret.toString(this.keychainPwd);\n            }\n\n            launcher.launch().envs(envs).cmds(\"/usr/bin/security\", \"list-keychains\", \"-s\", keychainPath).stdout(listener).pwd(projectRoot).join();\n            launcher.launch().envs(envs).cmds(\"/usr/bin/security\", \"default-keychain\", \"-d\", \"user\", \"-s\", keychainPath).stdout(listener).pwd(projectRoot).join();\n            if (StringUtils.isEmpty(keychainPwd))\n                returnCode = launcher.launch().envs(envs).cmds(\"/usr/bin/security\", \"unlock-keychain\", keychainPath).stdout(listener).pwd(projectRoot).join();\n            else\n                returnCode = launcher.launch().envs(envs).cmds(\"/usr/bin/security\", \"unlock-keychain\", \"-p\", keychainPwd, keychainPath).masks(false, false, false, true, false).stdout(listener).pwd(projectRoot).join();\n\n            if (returnCode > 0) {\n                listener.fatalError(Messages.XCodeBuilder_unlockKeychainFailed());\n                return false;\n            }\n\n            // Show the keychain info after unlocking, if not, OS X will prompt for the keychain password\n            launcher.launch().envs(envs).cmds(\"/usr/bin/security\", \"show-keychain-info\", keychainPath).stdout(listener).pwd(projectRoot).join();\n        }\n\n        // display useful setup information\n        listener.getLogger().println(Messages.XCodeBuilder_DebugInfoLineDelimiter());\n        listener.getLogger().println(Messages.XCodeBuilder_DebugInfoAvailableCertificates());\n        /*returnCode =*/ launcher.launch().envs(envs).cmds(\"/usr/bin/security\", \"find-identity\", \"-p\", \"codesigning\", \"-v\").stdout(listener).pwd(projectRoot).join();\n\n        // Build\n\tif ( BooleanUtils.isNotTrue(skipBuildStep) ) {\n\t    StringBuilder xcodeReport = new StringBuilder(Messages.XCodeBuilder_invokeXcodebuild());\n\t    JenkinsXCodeBuildOutputParser reportGenerator = new JenkinsXCodeBuildOutputParser(projectRoot, listener);\n\t    List<String> commandLine = Lists.newArrayList(getGlobalConfiguration().getXcodebuildPath());\n\n\t    // Workspace and target can not be specified at the same time.\n\t    // also specify workspace you must specify a scheme.\n\t    if ( !StringUtils.isEmpty(xcodeWorkspaceFile) ) {\n\t\tif ( StringUtils.isEmpty(xcodeSchema) ) {\n\t\t    listener.getLogger().println(Messages.XCodeBuilder_SpecifyWorkspaceAlsoSetScheme());\n\t\t    return false;\n\t\t}\n\t    }\n\n\t    // Prioritizing schema over target setting\n\t    if (!StringUtils.isEmpty(xcodeSchema)) {\n\t\tcommandLine.add(\"-scheme\");\n\t\tcommandLine.add(xcodeSchema);\n\t\txcodeReport.append(\", scheme: \").append(xcodeSchema);\n\t    } else if (StringUtils.isEmpty(target)) {\n\t\t// When target is empty always build all targets.\n\t\tcommandLine.add(\"-alltargets\");\n\t\txcodeReport.append(\"target: ALL\");\n\t    } else if( BooleanUtils.isTrue(interpretTargetAsRegEx) ) {\n\t\tif(xcodebuildListParser.getTargets().isEmpty()) {\n\t\t    listener.getLogger().println(Messages.XCodeBuilder_NoTargetsFoundInConfig());\n\t\t    return false;\n\t\t}\n\t\tCollection<String> matchedTargets = Collections2.filter(xcodebuildListParser.getTargets(),\n\t\t\t\t\t\t\t\t\tPredicates.containsPattern(target));\n\n\t\tif (matchedTargets.isEmpty()) {\n\t\t    listener.getLogger().println(Messages.XCodeBuilder_NoMatchingTargetsFound());\n\t\t    return false;\n\t\t}\n\n\t\tfor (String matchedTarget : matchedTargets) {\n\t\t    commandLine.add(\"-target\");\n\t\t    commandLine.add(matchedTarget);\n\t\t    xcodeReport.append(\"target: \").append(matchedTarget);\n\t\t}\n\t    } else {\n\t\tcommandLine.add(\"-target\");\n\t\tcommandLine.add(target);\n\t\txcodeReport.append(\"target: \").append(target);\n\t    }\n\n\t    if (!StringUtils.isEmpty(sdk)) {\n\t\tcommandLine.add(\"-sdk\");\n\t\tcommandLine.add(sdk);\n\t\txcodeReport.append(\", sdk: \").append(sdk);\n\t    } else {\n\t\txcodeReport.append(\", sdk: DEFAULT\");\n\t    }\n\n\t    // Prioritizing workspace over project setting\n\t    if (!StringUtils.isEmpty(xcodeWorkspaceFile)) {\n\t\tcommandLine.add(\"-workspace\");\n\t\tcommandLine.add(xcodeWorkspaceFile + \".xcworkspace\");\n\t\txcodeReport.append(\", workspace: \").append(xcodeWorkspaceFile);\n\t    } else if (!StringUtils.isEmpty(xcodeProjectFile)) {\n\t\tcommandLine.add(\"-project\");\n\t\tcommandLine.add(xcodeProjectFile);\n\t\txcodeReport.append(\", project: \").append(xcodeProjectFile);\n\t    } else {\n\t\txcodeReport.append(\", project: DEFAULT\");\n\t    }\n\n\t    if (!StringUtils.isEmpty(configuration)) {\n\t\tcommandLine.add(\"-configuration\");\n\t\tcommandLine.add(configuration);\n\t\txcodeReport.append(\", configuration: \").append(configuration);\n\t    }\n\n\t    if ( BooleanUtils.isNotFalse(cleanBeforeBuild) ) {\n\t\tcommandLine.add(\"clean\");\n\t\txcodeReport.append(\", clean: YES\");\n\t    } else {\n\t\txcodeReport.append(\", clean: NO\");\n\t    }\n\n\t    //Bug JENKINS-30362\n\t    //Generating an archive builds the project twice\n\t    //commandLine.add(\"build\");\n\t    FilePath archiveLocation = buildDirectory.absolutize().child(xcodeSchema + \".xcarchive\");\n\t    if ( BooleanUtils.isTrue(buildIpa) || BooleanUtils.isTrue(generateArchive) ) {\n\t\tcommandLine.add(\"archive\");\n\t\tcommandLine.add(\"-archivePath\");\n\t\tcommandLine.add(archiveLocation.getRemote());\n\t\txcodeReport.append(\", archive:YES\");\n\t    }else{\n\t\txcodeReport.append(\", archive:NO\");\n\t\tcommandLine.add(\"build\");\n\t    }\n\t    //END Bug JENKINS-30362\n\n\t    if ( BooleanUtils.isTrue(noConsoleLog) ) {\n\t\txcodeReport.append(\", consolelog:NO\");\n\t\treportGenerator.setConsoleLog(false);\n\t    }else{\n\t\txcodeReport.append(\", consolelog:YES\");\n\t    }\n\t    if(!StringUtils.isEmpty(logfileOutputDirectory)) {\n\t\txcodeReport.append(\", logfileOutputDirectory: \").append(logfileOutputDirectory);\n\t\treportGenerator.setLogfilePath(buildDirectory, logfileOutputDirectory);\n\t    }\n\t    if ( !StringUtils.isEmpty(resultBundlePath) || BooleanUtils.isTrue(ignoreTestResults) ) {\n\t\treportGenerator.setIgnoreTestResults(true);\n\t    }\n\t    if ( !StringUtils.isEmpty(resultBundlePath) ) {\n\t\tcommandLine.add(\"-resultBundlePath\");\n\t\tcommandLine.add(resultBundlePath);\n\t\txcodeReport.append(\", resultBundlePath: \").append(resultBundlePath);\n\t    }\n    \n\t    if (!StringUtils.isEmpty(symRootValue)) {\n\t\tcommandLine.add(\"SYMROOT=\" + symRootValue);\n\t\txcodeReport.append(\", symRoot: \").append(symRootValue);\n\t    } else {\n\t\txcodeReport.append(\", symRoot: DEFAULT\");\n\t    }\n\n\t    // BUILD_DIR\n\t    if (!StringUtils.isEmpty(buildDirValue)) {\n\t\tcommandLine.add(\"BUILD_DIR=\" + buildDirValue);\n\t\txcodeReport.append(\", buildDir: \").append(buildDirValue);\n\t    } else {\n\t\txcodeReport.append(\", buildDir: DEFAULT\");\n\t    }\n\n\t    // handle code signing identities\n\t    if (!StringUtils.isEmpty(developmentTeamID)) {\n\t\tcommandLine.add(\"DEVELOPMENT_TEAM=\" + developmentTeamID);\n\t\txcodeReport.append(\", developmentTeamID: \").append(developmentTeamID);\n\t    } else {\n\t\txcodeReport.append(\", developmentTeamID: AUTOMATIC\");\n\t    }\n\n\t    // Allow updating signing assets\n\t    if ( haveAllowProvisioningUpdates && ( archiveAutomaticSigning || signingMethod == null || signingMethod.equals(\"automatic\") ) ) {\n\t\tcommandLine.add(\"-allowProvisioningUpdates\");\n\t\txcodeReport.append(\", allowProvisioningUpdates: YES\");\n\t    }\n\n\t    // Additional (custom) xcodebuild arguments\n\t    if (!StringUtils.isEmpty(xcodebuildArguments)) {\n\t\tcommandLine.addAll(splitXcodeBuildArguments(xcodebuildArguments));\n\t    }\n\n\t    boolean manualSigning = (!archiveAutomaticSigning && signingMethod != null && (signingMethod.equals(\"manual\") || signingMethod.equals(\"readFromProject\")));\n\t    if ( manualSigning ) {\n\t\tif ( provisioningProfiles != null && provisioningProfiles.size() > 0 ) {\n\t\t    for ( ProvisioningProfile pp : provisioningProfiles ) {\n\t\t\tString provisioningProfileUUID = envs.expand(pp.getProvisioningProfileUUID());\n\t\t\tif ( !StringUtils.isEmpty(provisioningProfileUUID) &&\n\t\t\t    provisioningProfileUUID.endsWith(\".mobileprovision\") ) {\n\t\t\t    // If provisioningProfileUUID  is an .mobileprovision file,\n\t\t\t    //  obtain the profile UUID from .mobileprovision and use it.\n\t\t\t    String provisioningProfileName = provisioningProfileUUID;\n\t\t\t    try {\n\t\t\t\toutput.reset();\n\t\t\t\treturnCode = launcher.launch().envs(envs).cmds(\"/bin/sh\", \"-c\", \"/usr/libexec/PlistBuddy -c \\\"Print :UUID\\\" /dev/stdin <<< $(/usr/bin/security cms -D -i \\\"\" + projectRoot.absolutize().child(provisioningProfileUUID).getRemote() + \"\\\")\").stdout(output).stderr(System.err).pwd(projectRoot).join();\n\t\t\t\tif ( returnCode == 0 ) {\n\t\t\t\t    FilePath homePath = projectRoot.getHomeDirectory(projectRoot.getChannel());\n\t\t\t\t    FilePath provisioningProfilePath = projectRoot.child(provisioningProfileUUID);\n\t\t\t\t    provisioningProfileUUID = output.toString().trim();\n\t\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_ProfileUUIDReplaceWith(provisioningProfileUUID));\n\t\t\t\t    if ( BooleanUtils.isNotFalse(copyProvisioningProfile) ) {\n\t\t\t\t\t// When the provisioning profile is specified in \"Provisioning profile UUID\",\n\t\t\t\t\t// copy the specified file to \"/Users/${HOME}/Library/MobileDevice/Provisioning Profiles/\"\n\t\t\t\t\tFilePath profilesLibPath = homePath.child(\"Library/MobileDevice/Provisioning Profiles\");\n\t\t\t\t\tprofilesLibPath.mkdirs();\n\t\t\t\t\ttry {\n\t\t\t\t\t    provisioningProfilePath.copyTo(profilesLibPath.child(provisioningProfileUUID + \".mobileprovision\"));\n\t\t\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_CopiedProvisioningProfile(provisioningProfilePath.getRemote(), profilesLibPath.child(provisioningProfileUUID + \".mobileprovision\").getRemote()));\n\t\t\t\t\t}\n\t\t\t\t\tcatch ( Exception ex ) {\n\t\t\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_FailedToCopyMobileProvision(ex.toString()));\n\t\t\t\t\t    return false;\n\t\t\t\t\t}\n\t\t\t\t    }\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_CouldNotGetInfoFromMobileProvision(projectRoot.absolutize().child(provisioningProfileUUID).getRemote()));\n\t\t\t\t    return false;\n\t\t\t\t}\n\t\t\t    }\n\t\t\t    catch(Exception ex) {\n\t\t\t\tlistener.getLogger().println(Messages.XCodeBuilder_CFBundleIdFailedGetInMobileProvision(projectRoot.absolutize().child(provisioningProfileName).getRemote(), ex.toString()));\n\t\t\t\treturn false;\n\t\t\t    }\n\t\t\t}\n\t\t    }\n\t\t}\n\t    }\n\n\t    if ( BooleanUtils.isTrue(useLegacyBuildSystem) ) {\n\t\tcommandLine.add(\"-UseModernBuildSystem=NO\");\n\t\txcodeReport.append(\", useLegacyBuildSystem: YES\");\n\t    }\n\n\t    listener.getLogger().println(xcodeReport.toString());\n\t    returnCode = launcher.launch().envs(envs).cmds(commandLine).stdout(reportGenerator.getOutputStream()).pwd(projectRoot).join();\n            reportGenerator.closeLogfile();\n\t    if ( !StringUtils.isEmpty(resultBundlePath) ) {\n\t\tXcodeTestSummariesParser testSummariesParser = new XcodeTestSummariesParser(projectRoot);\n\t\tFilePath testSummariesPath = projectRoot.child(resultBundlePath + \"/TestSummaries.plist\");\n\t\tif ( testSummariesPath.exists() ) {\n\t\t    listener.getLogger().println(Messages.XCodeBuilder_ParseingTestSummariesPlist(testSummariesPath.absolutize().getRemote()));\n\t\t    testSummariesParser.parseTestSummariesPlist(testSummariesPath);\n\t\t}\n\t\telse {\n\t\t    listener.getLogger().println(Messages.XCodeBuilder_TestSummariesPlistNotExists(testSummariesPath.absolutize().getRemote()));\n\t\t}\n\t    }\n\t    if ( BooleanUtils.isNotTrue(allowFailingBuildResults) ) {\n\t\tif (reportGenerator.getExitCode() != 0) return false;\n\t\tif (returnCode > 0) return false;\n\t    }\n\t}\n\n        // Package IPA\n        if ( BooleanUtils.isTrue(buildIpa) ) {\n\n            if (!buildDirectory.exists() || !buildDirectory.isDirectory()) {\n                listener.fatalError(Messages.XCodeBuilder_NotExistingBuildDirectory(buildDirectory.absolutize().getRemote()));\n                return false;\n            }\n\n\t    // Incase Pipeline build.\n\t    // Pipeline Editor's error checking is poor and has not checked anything.\n            if ( !ArrayUtils.contains(VALID_IPA_EXPORT_METHODS, ipaExportMethod) ) {\n                String validMethodsMsg = StringUtils.join(VALID_IPA_EXPORT_METHODS, \", \");\n                listener.fatalError(Messages.XCodeBuilder_IpaExportMethodMuestBeOneOfTheFollowing(validMethodsMsg));\n\t\treturn false;\n            }\n\n            // clean IPA\n            FilePath ipaOutputPath = null;\n            if (ipaOutputDirectory != null && ! StringUtils.isEmpty(ipaOutputDirectory)) {\n            \tipaOutputPath = buildDirectory.child(ipaOutputDirectory);\n\n            \t// Create if non-existent\n            \tif (! ipaOutputPath.exists()) {\n            \t\tipaOutputPath.mkdirs();\n            \t}\n            }\n\n            if (ipaOutputPath == null) {\n            \tipaOutputPath = buildDirectory;\n            }\n\n            listener.getLogger().println(Messages.XCodeBuilder_cleaningIPA());\n            for (FilePath path : ipaOutputPath.list(\"*.ipa\")) {\n                path.delete();\n            }\n            listener.getLogger().println(Messages.XCodeBuilder_cleaningDSYM());\n            for (FilePath path : ipaOutputPath.list(\"*-dSYM.zip\")) {\n                path.delete();\n            }\n            // packaging IPA\n            listener.getLogger().println(Messages.XCodeBuilder_packagingIPA());\n\n\t    // Writeing exportOptions.plist\n\t    boolean manualSigning = (!archiveAutomaticSigning && signingMethod != null && (signingMethod.equals(\"manual\") || signingMethod.equals(\"readFromProject\")));\n\t    NSDictionary exportOptionsPlist = new NSDictionary();\n\t    exportOptionsPlist.put(\"signingStyle\", manualSigning ? \"manual\" : \"automatic\");\n\t    exportOptionsPlist.put(\"method\", ipaExportMethod);\n\t    if ( !StringUtils.isEmpty(developmentTeamID) ) {\n\t\texportOptionsPlist.put(\"teamID\", developmentTeamID);\n\t    }\n\t    if ( manualSigning ) {\n\t\texportOptionsPlist.put(\"signingCertificate\", ipaExportMethod.equals(\"development\") ? DEV_SIGNING_CERTIFICATE_SELECTOR : DIST_SIGNING_CERTIFICATE_SELECTOR);\n\t\tif ( provisioningProfiles != null && provisioningProfiles.size() > 0 ) {\n\t\t    NSDictionary provisioningProfileDict = new NSDictionary();\n\t\t    for ( ProvisioningProfile pp : provisioningProfiles ) {\n\t\t\tString provisioningProfileAppId = envs.expand(pp.getProvisioningProfileAppId());\n\t\t\tif ( !StringUtils.isEmpty(provisioningProfileAppId) &&\n\t\t\t     provisioningProfileAppId.endsWith(\".plist\") ) {\n\t\t\t    // If provisioningProfileAppId is an Info.plist file,\n\t\t\t    //  obtain the Bundle ID from Info.plist and use it.\n\t\t\t    try {\n\t\t\t\toutput.reset();\n\t\t\t\treturnCode = launcher.launch().envs(envs).cmds(\"/usr/libexec/PlistBuddy\", \"-c\", \"Print :CFBundleIdentifier\", projectRoot.absolutize().child(provisioningProfileAppId).getRemote()).stdout(output).pwd(projectRoot).join();\n\t\t\t\tif (returnCode == 0) {\n\t\t\t\t    provisioningProfileAppId = output.toString().trim();\n\t\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_CFBundleIdReplaceWith(provisioningProfileAppId));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t    // When Info.plist generated by Xcodebuild is specified.\n\t\t\t\t    output.reset();\n\t\t\t\t    returnCode = launcher.launch().envs(envs).cmds(\"/usr/libexec/PlistBuddy\", \"-c\", \"Print :ApplicationProperties:CFBundleIdentifier\", projectRoot.absolutize().child(provisioningProfileAppId).getRemote()).stdout(output).pwd(projectRoot).join();\n\t\t\t\t    if (returnCode == 0) {\n\t\t\t\t\tprovisioningProfileAppId = output.toString().trim();\n\t\t\t\t\tlistener.getLogger().println(Messages.XCodeBuilder_CFBundleIdReplaceWith(provisioningProfileAppId));\n\t\t\t\t    }\n\t\t\t\t}\n\t\t\t    }\n\t\t\t    catch(Exception ex) {\n\t\t\t\tlistener.getLogger().println(Messages.XCodeBuilder_CFBundleIdFailedGetInInfoPlist(projectRoot.absolutize().child(provisioningProfileAppId).getRemote(), ex.toString()));\n\t\t\t    }\n\t\t\t}\n\t\t\tString provisioningProfileUUID = envs.expand(pp.getProvisioningProfileUUID());\n\t\t\tif ( !StringUtils.isEmpty(provisioningProfileUUID) &&\n\t\t\t    provisioningProfileUUID.endsWith(\".mobileprovision\") ) {\n\t\t\t    // If provisioningProfileUUID  is an .mobileprovision file,\n\t\t\t    //  obtain the profile UUID from .mobileprovision and use it.\n\t\t\t    String provisioningProfileName = provisioningProfileUUID;\n\t\t\t    try {\n\t\t\t\toutput.reset();\n\t\t\t\treturnCode = launcher.launch().envs(envs).cmds(\"/bin/sh\", \"-c\", \"/usr/libexec/PlistBuddy -c \\\"Print :UUID\\\" /dev/stdin <<< $(/usr/bin/security cms -D -i \\\"\" + projectRoot.absolutize().child(provisioningProfileUUID).getRemote() + \"\\\")\").stdout(output).stderr(System.err).pwd(projectRoot).join();\n\t\t\t\tif ( returnCode == 0 ) {\n\t\t\t\t    FilePath homePath = projectRoot.getHomeDirectory(projectRoot.getChannel());\n\t\t\t\t    FilePath provisioningProfilePath = projectRoot.child(provisioningProfileUUID);\n\t\t\t\t    provisioningProfileUUID = output.toString().trim();\n\t\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_ProfileUUIDReplaceWith(provisioningProfileUUID));\n\t\t\t\t    if ( BooleanUtils.isNotFalse(copyProvisioningProfile) && BooleanUtils.isTrue(skipBuildStep) ) {\n\t\t\t\t\t// When the provisioning profile is specified in \"Provisioning profile UUID\",\n\t\t\t\t\t// copy the specified file to \"/Users/${HOME}/Library/MobileDevice/Provisioning Profiles/\"\n\t\t\t\t\tFilePath profilesLibPath = homePath.child(\"Library/MobileDevice/Provisioning Profiles\");\n\t\t\t\t\tprofilesLibPath.mkdirs();\n\t\t\t\t\ttry {\n\t\t\t\t\t    provisioningProfilePath.copyTo(profilesLibPath.child(provisioningProfileUUID + \".mobileprovision\"));\n\t\t\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_CopiedProvisioningProfile(provisioningProfilePath.getRemote(), profilesLibPath.child(provisioningProfileUUID + \".mobileprovision\").getRemote()));\n\t\t\t\t\t}\n\t\t\t\t\tcatch ( Exception ex ) {\n\t\t\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_FailedToCopyMobileProvision(ex.toString()));\n\t\t\t\t\t    return false;\n\t\t\t\t\t}\n\t\t\t\t    }\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t    listener.getLogger().println(Messages.XCodeBuilder_CouldNotGetInfoFromMobileProvision(projectRoot.absolutize().child(provisioningProfileName).getRemote()));\n\t\t\t\t    return false;\n\t\t\t\t}\n\t\t\t    }\n\t\t\t    catch(Exception ex) {\n\t\t\t\tlistener.getLogger().println(Messages.XCodeBuilder_CFBundleIdFailedGetInMobileProvision(projectRoot.absolutize().child(provisioningProfileAppId).getRemote(), ex.toString()));\n\t\t\t\treturn false;\n\t\t\t    }\n\t\t\t}\n\t\t\tprovisioningProfileDict.put(provisioningProfileAppId, provisioningProfileUUID);\n\t\t    }\n\t\t    exportOptionsPlist.put(\"provisioningProfiles\", provisioningProfileDict);\n\t\t}\n\t    }\n\t    exportOptionsPlist.put(\"iCloudContainerEnvironment\", ipaExportMethod.equals(\"app-store\") ? PRODUCTION_ENV : DEVELOPMENT_ENV);\n\t    exportOptionsPlist.put(\"stripSwiftSymbols\", stripSwiftSymbols);\n\t    // Extra options\n\t    if ( ipaExportMethod.equals(\"app-store\") ) { \n\t\texportOptionsPlist.put(\"uploadBitcode\", uploadBitcode);\n\t\texportOptionsPlist.put(\"uploadSymbols\", uploadSymbols);\n\t    }\n\t    else {\n\t\tif ( !StringUtils.isEmpty(thinning) ) {\n\t\t    exportOptionsPlist.put(\"thinning\", thinning);\n\t\t}\n\t\texportOptionsPlist.put(\"compileBitcode\", compileBitcode);\n\t\tif ( BooleanUtils.isNotFalse(embedOnDemandResourcesAssetPacksInBundle) &&\n\t\t      !StringUtils.isEmpty(onDemandResourcesAssetPacksBaseURL) ) {\n\t\t    exportOptionsPlist.put(\"embedOnDemandResourcesAssetPacksInBundle\", false);\n\t\t    exportOptionsPlist.put(\"onDemandResourcesAssetPacksBaseURL\", onDemandResourcesAssetPacksBaseURL);\n\t\t}\n\t\tif ( !StringUtils.isEmpty(appURL) ) {\n\t\t    NSDictionary manifestPlistOprions = new NSDictionary();\n\t\t    manifestPlistOprions.put(\"appURL\", appURL);\n\t\t    if ( !StringUtils.isEmpty(displayImageURL) ) {\n\t\t\tmanifestPlistOprions.put(\"displayImageURL\", displayImageURL);\n\t\t    }\n\t\t    if ( !StringUtils.isEmpty(fullSizeImageURL) ) {\n\t\t\tmanifestPlistOprions.put(\"fullSizeImageURL\", fullSizeImageURL);\n\t\t    }\n\t\t    if ( !StringUtils.isEmpty(assetPackManifestURL) ) {\n\t\t\tmanifestPlistOprions.put(\"assetPackManifestURL\", assetPackManifestURL);\n\t\t    }\n\t\t    exportOptionsPlist.put(\"manifest\", manifestPlistOprions);\n\t\t}\n\t    }\n\t    ByteArrayOutputStream stream = new ByteArrayOutputStream();\n\t    PropertyListParser.saveAsXML(exportOptionsPlist, stream);\n\t    FilePath exportOptionsPlistLocation = ipaOutputPath.child(ipaExportMethod + ((developmentTeamID == null || StringUtils.isEmpty(developmentTeamID)) ? \"AUTOMATIC\" : developmentTeamID) + \"ExportOptions.plist\");\n\t    exportOptionsPlistLocation.write(stream.toString(), \"UTF-8\");\n\n            List<FilePath> archives = buildDirectory.list(new XCArchiveFileFilter());\n            // FilePath is based on File.listFiles() which can randomly fail | http://stackoverflow.com/questions/3228147/retrieving-the-underlying-error-when-file-listfiles-return-null\n            if ( archives == null || archives.size() < 1 ) {\n                listener.fatalError(Messages.XCodeBuilder_NoArchivesInBuildDirectory(buildDirectory.absolutize().getRemote()));\n                return false;\n            }\n\n            for (FilePath archive : archives) {\n                String version = \"\";\n                String shortVersion = \"\";\n\n                try {\n                    output.reset();\n                    returnCode = launcher.launch().envs(envs).cmds(\"/usr/libexec/PlistBuddy\", \"-c\", \"Print :ApplicationProperties:CFBundleVersion\", archive.absolutize().child(\"Info.plist\").getRemote()).stdout(output).pwd(projectRoot).join();\n                    if (returnCode == 0) {\n                        version = output.toString().trim();\n                    }\n\n                    output.reset();\n                    returnCode = launcher.launch().envs(envs).cmds(\"/usr/libexec/PlistBuddy\", \"-c\", \"Print :ApplicationProperties:CFBundleShortVersionString\", archive.absolutize().child(\"Info.plist\").getRemote()).stdout(output).pwd(projectRoot).join();\n                    if (returnCode == 0) {\n                        shortVersion = output.toString().trim();\n                    }\n                }\n                catch(Exception ex) {\n                    listener.getLogger().println(Messages.XCodeBuilder_FailedToGetVersionFromInfoPlist(ex.toString()));\n                    return false;\n                }\n\n               \tif (StringUtils.isEmpty(version) && StringUtils.isEmpty(shortVersion)) {\n               \t\tlistener.getLogger().println(Messages.XCodeBuilder_MarketingAndTechnicalVersionNotFound());\n               \t\treturn false;\n               \t}\n\n                String lastModified = new SimpleDateFormat(\"yyyy.MM.dd\").format(new Date(archive.lastModified()));\n\n                String baseName = archive.getBaseName().replaceAll(\" \", \"_\") + (shortVersion.isEmpty() ? \"\" : \"-\" + shortVersion) + (version.isEmpty() ? \"\" : \"-\" + version);\n                // If custom .ipa name pattern has been provided, use it and expand version and build date variables\n                if (! StringUtils.isEmpty(ipaName)) {\n                \tEnvVars customVars = new EnvVars(\n                \t\t\"BASE_NAME\", archive.getBaseName().replaceAll(\" \", \"_\"),\n                \t\t\"VERSION\", version,\n                \t\t\"SHORT_VERSION\", shortVersion,\n                \t\t\"BUILD_DATE\", lastModified\n                \t);\n                    baseName = customVars.expand(ipaName);\n                }\n\n                String ipaFileName = baseName + \".ipa\";\n                FilePath ipaLocation = ipaOutputPath.child(ipaFileName);\n\n                FilePath payload = ipaOutputPath.child(\"Payload\");\n                payload.deleteRecursive();\n                payload.mkdirs();\n\n                listener.getLogger().println(Messages.XCodeBuilder_PackagingArchiveToIpa(archive.getBaseName(), ipaLocation.absolutize().getRemote()));\n                if (buildPlatform.contains(\"simulator\")) {\n                    listener.getLogger().println(Messages.XCodeBuilder_warningPackagingIPAForSimulatorSDK(sdk));\n                }\n\n\n                List<String> packageCommandLine = new ArrayList<>();\n                packageCommandLine.add(getGlobalConfiguration().getXcodebuildPath());\n                packageCommandLine.addAll(Lists.newArrayList(\"-exportArchive\", \"-archivePath\", archive.absolutize().getRemote(), \"-exportPath\", ipaOutputPath.absolutize().getRemote(), \"-exportOptionsPlist\", exportOptionsPlistLocation.absolutize().getRemote()));\n                if (archiveAutomaticSigning || signingMethod == null || (!signingMethod.equals(\"manual\") && !signingMethod.equals(\"readFromProject\"))) {\n\t\t    if (haveAllowProvisioningUpdates)\n                \tpackageCommandLine.add(\"-allowProvisioningUpdates\");\n                }\n                returnCode = launcher.launch().envs(envs).stdout(listener).pwd(projectRoot).cmds(packageCommandLine).join();\n                if (returnCode > 0) {\n                    listener.getLogger().println(Messages.XCodeBuilder_FailedToBuildIpa(ipaLocation.absolutize().getRemote()));\n                    return false;\n                }\n                //rename exported ipa\n                FilePath exportedIpa = ipaOutputPath.child(archive.getBaseName() + \".ipa\");\n                if (exportedIpa.exists()) {\n                    exportedIpa.renameTo(ipaLocation);\n                }\n\n                // also zip up the symbols, if present\n                listener.getLogger().println(Messages.XCodeBuilder_ArchivingDSYM());\n                List<FilePath> dSYMs = archive.absolutize().child(\"dSYMs\").list(new DSymFileFilter());\n                if (dSYMs == null || dSYMs.isEmpty()) {\n                    listener.getLogger().println(Messages.XCodeBuilder_NoDSYMFileFound(archive.absolutize().child(\"dSYMs\")));\n                }\n\n\t\t// JENKINS-54414\n\t\t// May be, this is no longer necessary.\n\t\t//dSYMs.addAll(buildDirectory.absolutize().child(configuration + \"-\" + buildPlatform).list(new DSymFileFilter()));\n\t\tif (dSYMs == null || dSYMs.isEmpty()) {\n\t\t    listener.getLogger().println(Messages.XCodeBuilder_NoDSYMFileFound(archive.absolutize().child(\"dSYMs\")));\n\t\t}\n\t\telse {\n                    for (FilePath dSYM : dSYMs) {\n                        returnCode = launcher.launch()\n                                .envs(envs)\n                                .stdout(listener)\n                                .pwd(buildDirectory)\n                                .cmds(\"ditto\",\n                                        \"-c\",\n                                        \"-k\",\n                                        \"--keepParent\",\n                                        \"-rsrc\",\n                                        dSYM.absolutize().getRemote(),\n                                        ipaOutputPath.child(baseName + \"-dSYM.zip\")\n                                                .absolutize()\n                                                .getRemote())\n                                .join();\n\n                        if (returnCode > 0) {\n                            listener.getLogger().println(Messages.XCodeBuilder_zipFailed(baseName));\n                            return false;\n                        }\n                    }\n                }\n                payload.deleteRecursive();\n            }\n        }\n\n        return true;\n    }\n\n    @Deprecated\n    public Keychain getKeychain(String keychainName) {\n        if(!StringUtils.isEmpty(keychainName)) {\n            for (Keychain keychain : getGlobalConfiguration().getKeychains()) {\n                if(keychain.getKeychainName().equals(keychainName))\n                    return keychain;\n            }\n        }\n        return null;\n    }\n\n    public KeychainPasswordAndPath getKeychainPasswordAndPath(Item context, String keychainId) {\n        if(!StringUtils.isEmpty(keychainId)) {\n            return (KeychainPasswordAndPath) CredentialsMatchers.firstOrNull(\n                    CredentialsProvider.lookupCredentials(KeychainPasswordAndPath.class, context,\n                            ACL.SYSTEM, Collections.EMPTY_LIST),\n                    CredentialsMatchers.withId(keychainId));\n        }\n        return null;\n    }\n\n    public Team getDevelopmentTeam() {\n        if(!StringUtils.isEmpty(developmentTeamName)) {\n            for (Team team : getGlobalConfiguration().getTeams()) {\n                if(team.getTeamName().equals(developmentTeamName))\n                    return team;\n            }\n        }\n\n        if(!StringUtils.isEmpty(developmentTeamID)) {\n            return new Team(\"\", developmentTeamID);\n        }\n\n        return null;\n    }\n\n    static List<String> splitXcodeBuildArguments(String xcodebuildArguments) {\n        if (xcodebuildArguments == null || xcodebuildArguments.length() == 0) {\n            return new ArrayList<>(0);\n        }\n\n        final QuotedStringTokenizer tok = new QuotedStringTokenizer(xcodebuildArguments);\n        final List<String> result = new ArrayList<>();\n        while(tok.hasMoreTokens())\n            result.add(tok.nextToken());\n\n        return result;\n    }\n\n    public GlobalConfigurationImpl getGlobalConfiguration() {\n    \treturn getDescriptor().getGlobalConfiguration();\n    }\n\n    @Override\n    public DescriptorImpl getDescriptor() {\n        return (DescriptorImpl) super.getDescriptor();\n    }\n\n    @Extension\n    @Symbol(\"xcodeBuild\")\n    public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {\n    \tGlobalConfigurationImpl globalConfiguration;\n\n        // backward compatibility\n        @Deprecated\n        private transient String xcodebuildPath;\n        private transient String agvtoolPath;\n        private transient String xcrunPath;\n        private transient CopyOnWriteList<Keychain> keychains;\n        private transient CopyOnWriteList<Team> teams;\n\n        public DescriptorImpl() {\n            load();\n        }\n\n        @SuppressFBWarnings(\"UWF_UNWRITTEN_FIELD\")\n        @Inject\n        void setGlobalConfiguration(GlobalConfigurationImpl c) {\n            this.globalConfiguration = c;\n            {// data migration from old format\n                boolean modified = false;\n                if (xcodebuildPath!=null) {\n                    c.setXcodebuildPath(xcodebuildPath);\n                    modified = true;\n                }\n                if (agvtoolPath!=null) {\n                    c.setAgvtoolPath(agvtoolPath);\n                    modified = true;\n                }\n                if (xcrunPath!=null) {\n                    c.setXcrunPath(xcrunPath);\n                    modified = true;\n                }\n                if (keychains!=null) {\n                    c.setKeychains(new ArrayList<>(keychains.getView()));\n                    modified = true;\n                }\n                if (teams!=null) {\n                    c.setTeams(new ArrayList<>(teams.getView()));\n                    modified = true;\n                }\n                if (modified) {\n                    c.save();\n                    save(); // delete the old values from the disk now that the new values are committed\n                }\n            }\n        }\n\n        @Override\n        public boolean isApplicable(Class<? extends AbstractProject> jobType) {\n            return true;\n        }\n\n\t@Override\n\tpublic String getDisplayName() {\n\t    return Messages.XCodeBuilder_xcode();\n\t}\n\n\tpublic GlobalConfigurationImpl getGlobalConfiguration() {\n\t    return globalConfiguration;\n\t}\n\n\tpublic String getUUID() {\n\t    return \"\" + UUID.randomUUID().getMostSignificantBits();\n\t}\n\n\tpublic FormValidation doCheckOnDemandResourcesAssetPacksBaseURL(@QueryParameter String value, @QueryParameter Boolean embedOnDemandResourcesAssetPacksInBundle) {\n\t    if ( StringUtils.isEmpty(value) && BooleanUtils.isFalse(embedOnDemandResourcesAssetPacksInBundle) ) {\n\t\treturn FormValidation.error(Messages.XCodeBuilder_NeedOnDemandResourcesURL());\n\t    }\n\t    return FormValidation.ok();\n\t}\n\n\tpublic FormValidation doCheckIpaExportMethod(@QueryParameter String value, @QueryParameter Boolean buildIpa) {\n\t    if ( BooleanUtils.isTrue(buildIpa) ) {\n\t\tif ( !ArrayUtils.contains(VALID_IPA_EXPORT_METHODS, value) ) {\n\t\t    String validMethodsMsg = StringUtils.join(VALID_IPA_EXPORT_METHODS, \", \");\n\t\t    return FormValidation.error(Messages.XCodeBuilder_IpaExportMethodMuestBeOneOfTheFollowing(validMethodsMsg));\n\t\t}\n\t    }\n\t    return FormValidation.ok();\n\t}\n\n\tpublic FormValidation doCheckXcodeWorkspaceFile(@QueryParameter String value, @QueryParameter String xcodeSchema, @QueryParameter String target) {\n\t    if ( !StringUtils.isEmpty(value) ) {\n\t\tif ( !StringUtils.isEmpty(target) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_WorkspaceAndTargetCantSpecifySameTime());\n\t\t}\n\t\tif ( StringUtils.isEmpty(xcodeSchema) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_SpecifyWorkspaceAlsoSetScheme());\n\t\t}\n\t    }\n\t    return FormValidation.ok();\n\t}\n\n\tpublic FormValidation doCheckXcodeSchema(@QueryParameter String value,  @QueryParameter Boolean generateArchive, @QueryParameter Boolean buildIpa, @QueryParameter String xcodeWorkspaceFile, @QueryParameter String target) {\n\t    if ( !StringUtils.isEmpty(value) ) {\n\t\tif ( !StringUtils.isEmpty(target) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_SchemeAndTargetCantSpecifySameTime());\n\t\t}\n\t    }\n\t    else {\n\t\tif ( !StringUtils.isEmpty(xcodeWorkspaceFile) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_SpecifyWorkspaceAlsoSetScheme());\n\t\t}\n\t\tif ( BooleanUtils.isTrue(generateArchive) || BooleanUtils.isTrue(buildIpa) ) {\n                    return FormValidation.error(Messages.XCodeBuilder_NeedSchema());\n                }\n\t    }\n\t    return FormValidation.ok();\n\t}\n\n\tpublic FormValidation doCheckTarget(@QueryParameter String value, @QueryParameter String xcodeWorkspaceFile, @QueryParameter String xcodeSchema) {\n\t    if ( !StringUtils.isEmpty(value) ) {\n\t\tif ( !StringUtils.isEmpty(xcodeWorkspaceFile) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_WorkspaceAndTargetCantSpecifySameTime());\n\t\t}\n\t\tif ( !StringUtils.isEmpty(xcodeSchema) ) {\n\t\t    return FormValidation.error(Messages.XCodeBuilder_SchemeAndTargetCantSpecifySameTime());\n\t\t}\n\t    }\n\t    return FormValidation.ok();\n\t}\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XcodeBuildHelpParser.java",
    "content": "package au.com.rayh;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.apache.commons.lang.StringUtils;\n\n/**\n * Created by Kazuhide Takahashi on 5/9/14.\n */\npublic class XcodeBuildHelpParser {\n\n    private List<String> parameters = new ArrayList<>();\n\n    public XcodeBuildHelpParser(String xcodebuildHelpOutput) {\n\n        if(xcodebuildHelpOutput == null) {\n            return;\n        }\n\n        String [] lines = xcodebuildHelpOutput.split(\"\\n\");\n        for(String line : lines) {\n            if (StringUtils.startsWith(line, \"    -\")) {\n\t\tString[] words = line.split(\" \", 6);\n\t\tif ( words.length == 6 ) {\n\t\t   parameters.add(words[4]);\n\t\t}\n            }\n        }\n    }\n\n    public List<String> getParameters() {\n        return this.parameters;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XcodeBuildListParser.java",
    "content": "package au.com.rayh;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.apache.commons.lang.StringUtils;\n\n\n/**\n * Created by ud10404 on 5/9/14.\n */\npublic class XcodeBuildListParser {\n\n    private List<String> targets = new ArrayList<>();\n    private List<String> configurations = new ArrayList<>();\n    private List<String> schemes = new ArrayList<>();\n\n    public XcodeBuildListParser(String xcodebuildListOutput) {\n\n        if(xcodebuildListOutput == null) {\n            return;\n        }\n\n        String [] lines = xcodebuildListOutput.split(\"\\n\");\n        List<String> curList = null;\n        for(String line : lines) {\n            line = line.trim();\n            if (StringUtils.isEmpty(line)) {\n                curList = null;\n            } else if(\"Targets:\".equals(line)) {\n                curList = targets;\n            } else if(\"Build Configurations:\".equals(line)) {\n                curList = configurations;\n            } else if(\"Schemes:\".equals(line)) {\n                curList = schemes;\n            } else if(curList != null) {\n                curList.add(line);\n            }\n        }\n    }\n\n    public List<String> getTargets() {\n        return this.targets;\n    }\n\n    public List<String> getConfigurations() {\n        return this.configurations;\n    }\n\n    public List<String> getSchemes() {\n        return this.schemes;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XcodeCredentialsHelper.java",
    "content": "package au.com.rayh;\n\nimport com.cloudbees.plugins.credentials.CredentialsMatchers;\nimport com.cloudbees.plugins.credentials.CredentialsProvider;\nimport com.cloudbees.plugins.credentials.common.StandardListBoxModel;\nimport hudson.model.ItemGroup;\nimport hudson.security.ACL;\nimport hudson.util.ListBoxModel;\nimport org.apache.commons.lang.StringUtils;\n\nimport edu.umd.cs.findbugs.annotations.CheckForNull;\nimport java.util.Collections;\n\n/**\n * @author <a href=\"mailto:kazuhide.t@linux-powered.com\">Kazuhide Takahashi</a>\n */\npublic class XcodeCredentialsHelper {\n\n    private XcodeCredentialsHelper() {}\n\n    @CheckForNull\n    public static KeychainPasswordAndPath getCredentials(String credentialsId, ItemGroup context) {\n        if (StringUtils.isBlank(credentialsId)) {\n            return null;\n        }\n        return (KeychainPasswordAndPath) CredentialsMatchers.firstOrNull(\n                CredentialsProvider.lookupCredentials(KeychainPasswordAndPath.class, context,\n                        ACL.SYSTEM, Collections.EMPTY_LIST),\n                CredentialsMatchers.withId(credentialsId));\n    }\n\n    public static ListBoxModel doFillCredentialsIdItems(ItemGroup context) {\n        return new StandardListBoxModel()\n                .withEmptySelection()\n                .withMatching(\n                        CredentialsMatchers.always(),\n                        CredentialsProvider.lookupCredentials(KeychainPasswordAndPath.class,\n                                context,\n                                ACL.SYSTEM,\n                                Collections.EMPTY_LIST));\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XcodeDeclarativeCredentialsHandler.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2018, CloudBees, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage au.com.rayh;\n\nimport com.cloudbees.plugins.credentials.common.StandardCredentials;\nimport hudson.Extension;\nimport org.jenkinsci.plugins.pipeline.modeldefinition.model.CredentialsBindingHandler;\n\nimport edu.umd.cs.findbugs.annotations.NonNull;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n@Extension\npublic class XcodeDeclarativeCredentialsHandler extends CredentialsBindingHandler<KeychainPasswordAndPath> {\n\n    @NonNull\n    @Override\n    public Class<? extends StandardCredentials> type() {\n        return KeychainPasswordAndPath.class;\n    }\n\n    @NonNull\n    @Override\n    public List<Map<String, Object>> getWithCredentialsParameters(String credentialsId) {\n        Map<String, Object> map = new HashMap<>();\n        map.put(\"$class\", KeychainPasswordAndPathBinding.class.getName());\n        map.put(\"password\", \"password\");\n        map.put(\"keychainPath\", \"keychainPath\");\n        map.put(\"isInSearchPath\", \"isInSearchPath\");\n        map.put(\"credentialsId\", credentialsId);\n        return Collections.singletonList(map);\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XcodeProject.java",
    "content": "package au.com.rayh;\n\n//import org.kohsuke.stapler.DataBoundConstructor;\nimport java.util.HashMap;\n\npublic class XcodeProject {\n \n    //public String uuid;\n    //public String name;\n    //public String file;\n    public HashMap<String, ProjectTarget> projectTarget;\n\n    XcodeProject() {\n\t//uuid = null;\n\t//name = null;\n\t//file = null;\n\tprojectTarget = new HashMap<String, ProjectTarget>();\n    }\n}\n\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XcodeProjectFileFilter.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage au.com.rayh;\n\nimport java.io.File;\nimport java.io.FileFilter;\nimport java.io.Serializable;\n\n/**\n * @author Kazuhide Takahashi\n */\npublic class XcodeProjectFileFilter implements FileFilter, Serializable {\n\n    public boolean accept(File pathname) {\n        return pathname.isDirectory() && pathname.getName().endsWith(\".xcodeproj\");\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XcodeProjectParser.java",
    "content": "package au.com.rayh;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.file.DirectoryStream;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\nimport java.nio.file.Path;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.HashMap;\nimport java.text.ParseException;\nimport java.io.ByteArrayInputStream;\nimport hudson.FilePath;\n\nimport javax.xml.parsers.DocumentBuilder;\nimport javax.xml.parsers.DocumentBuilderFactory;\n//import javax.xml.parsers.ParserException;\nimport javax.xml.parsers.ParserConfigurationException;\nimport java.lang.InterruptedException;\n\nimport org.w3c.dom.Document;\nimport org.w3c.dom.Element;\nimport org.w3c.dom.Node;\nimport org.w3c.dom.NodeList;\nimport org.xml.sax.SAXException;\n\nimport com.dd.plist.NSDictionary; \nimport com.dd.plist.NSArray;\nimport com.dd.plist.NSNumber;\nimport com.dd.plist.NSObject;\nimport com.dd.plist.NSString;\nimport com.dd.plist.PropertyListFormatException; \nimport com.dd.plist.PropertyListParser; \n\n/**\n * Analyze the Xcode project file and obtain the information necessary for building the application. (Only combinations of UUID and BundleID used for CodeSign now)\n * @author Kazuhide Takahashi\n */\npublic class XcodeProjectParser {\n\n    /**\n     * Retrieve all Xcode scheme file from project directory.\n     * @param projectLocation Xcode project file location (directory path)\n     * @return the list of schema files found in the project directory and the result (ProjectScheme) of analysis of the contents as a HashMap. If analysis fails, it is empty\n     */\n    public static HashMap<String, ProjectScheme> listXcodeSchemes(FilePath projectLocation) {\n\tString currentUser = System.getProperty(\"user.name\") ;\n\tHashMap<String, ProjectScheme> schemeList = new HashMap<String, ProjectScheme>();\n\tList<FilePath> schemeFilesDirList = new ArrayList<FilePath>();\n\ttry {\n\t    if ( projectLocation.child(\"xcuserdata/\" + currentUser + \".xcuserdatad/xcschemes\").exists() ) {\n\t\tschemeFilesDirList.add(projectLocation.child(\"xcuserdata/\" + currentUser + \".xcuserdatad/xcschemes\"));\n\t    }\n\t    if ( projectLocation.child(\"xcshareddata/xcschemes\").exists() ) {\n\t\tschemeFilesDirList.add(projectLocation.child(\"xcshareddata/xcschemes\"));\n\t    }\n\t}\n\tcatch ( IOException ex ) {\n\t    ex.printStackTrace();\n\t    schemeList = null;\n\t}\n\tcatch ( InterruptedException ex ) {\n\t    ex.printStackTrace();\n\t    schemeList = null;\n\t}\n\tfor ( FilePath schemeFilesDir : schemeFilesDirList ) {\n\t    try {\n\t\tList<FilePath> files = schemeFilesDir.list(new XcodeSchemeFileFilter());\n\t\tfor ( FilePath file : files ) {\n\t\t    ProjectScheme scheme = parseXcodeScheme(file);\n\t\t    String schemeName = file.getBaseName().replaceAll(\".xcscheme$\", \"\");\n\t\t    schemeList.put(schemeName, scheme);\n\t\t}\n\t    }\n\t    catch ( IOException ex ) {\n\t\tex.printStackTrace();\n\t\tschemeList = null;\n\t    }\n\t    catch ( InterruptedException ex ) {\n\t\tex.printStackTrace();\n\t\tschemeList = null;\n\t    }\n\t}\n\treturn schemeList;\n    }\n\n    /**\n     * @param schemeFile Xcode schieme file location\n     * @return analysis result of Xcode projectscheme file. If analysis fails, it is null\n     */\n    public static ProjectScheme parseXcodeScheme(FilePath schemeFile) {\n\tProjectScheme projectScheme = new ProjectScheme();\n\ttry {\n\t    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n\n\t    String FEATURE = null;\n\t    FEATURE = \"http://apache.org/xml/features/disallow-doctype-decl\";\n\t    factory.setFeature(FEATURE, true);\n\t    FEATURE = \"http://xml.org/sax/features/external-general-entities\";\n\t    factory.setFeature(FEATURE, false);\n\t    FEATURE = \"http://xml.org/sax/features/external-parameter-entities\";\n\t    factory.setFeature(FEATURE, false);\n\t    FEATURE = \"http://apache.org/xml/features/nonvalidating/load-external-dtd\";\n\t    factory.setFeature(FEATURE, false);\n\t    factory.setXIncludeAware(false);\n\t    factory.setExpandEntityReferences(false);\n\n\t    DocumentBuilder documentBuilder = factory.newDocumentBuilder();\n\t    Document document = documentBuilder.parse(schemeFile.read());\n\n\t    Element root = document.getDocumentElement();\n\t    if ( root.getNodeName().equals(\"Scheme\") ) {\n\t\tNodeList schemeNodes = root.getChildNodes();\n\t\tfor ( int i = 0; i < schemeNodes.getLength(); i++ ) {\n\t\t    Node node = schemeNodes.item(i);\n\t\t    if ( node.getNodeType() == Node.ELEMENT_NODE ) {\n\t\t\tElement element = (Element)node;\n\t\t\tif ( element.getNodeName().equals(\"BuildAction\") ) {\n\t\t\t    //projectScheme.parallelizeBuildables = element.getAttribute(\"parallelizeBuildables\");\n\t\t\t    //projectScheme.buildImplicitDependencies = element.getAttribute(\"buildImplicitDependencies\");\n\t\t\t    NodeList buildActionNodes = element.getChildNodes();\n\t\t\t    for ( int j = 0; j < buildActionNodes.getLength(); j++ ) {\n\t\t\t\tnode = buildActionNodes.item(j);\n\t\t\t\tif ( node.getNodeType() == Node.ELEMENT_NODE ) {\n\t\t\t\t    element = (Element)node;\n\t\t\t\t    if ( element.getNodeName().equals(\"BuildActionEntries\") ) {\n\t\t\t\t\tNodeList buildActionEntriesNodes = element.getChildNodes();\n\t\t\t\t\tfor ( int k = 0; k < buildActionEntriesNodes.getLength(); k++ ) {\n\t\t\t\t\t    node = buildActionEntriesNodes.item(k);\n\t\t\t\t\t    if ( node.getNodeType() == Node.ELEMENT_NODE ) {\n\t\t\t\t\t\telement = (Element)node;\n\t\t\t\t\t\tif ( element.getNodeName().equals(\"BuildActionEntry\") ) {\n\t\t\t\t\t\t    //projectScheme.buildForTesting = element.getAttribute(\"buildForTesting\");\n\t\t\t\t\t\t    //projectScheme.buildForRunning = element.getAttribute(\"buildForRunning\");\n\t\t\t\t\t\t    //projectScheme.buildForProfiling = element.getAttribute(\"buildForProfiling\");\n\t\t\t\t\t\t    //projectScheme.buildForArchiving = element.getAttribute(\"buildForArchiving\");\n\t\t\t\t\t\t    //projectScheme.buildForAnalyzing = element.getAttribute(\"buildForAnalyzing\");\n\t\t\t\t\t\t    NodeList buildActionEntryNodes = element.getChildNodes();\n\t\t\t\t\t\t    for ( int l = 0; l < buildActionEntryNodes.getLength(); l++ ) {\n\t\t\t\t\t\t\tnode = buildActionEntryNodes.item(l);\n\t\t\t\t\t\t\tif ( node.getNodeType() == Node.ELEMENT_NODE ) {\n\t\t\t\t\t\t\t    element = (Element)node;\n\t\t\t\t\t\t\t    if ( element.getNodeName().equals(\"BuildableReference\") ) {\n\t\t\t\t\t\t\t\t//projectScheme.buildableIdentifier = element.getAttribute(\"BuildableIdentifier\");\n\t\t\t\t\t\t\t\t//projectScheme.blueprintIdentifier = element.getAttribute(\"BlueprintIdentifier\");\n\t\t\t\t\t\t\t\t//projectScheme.buildableName = element.getAttribute(\"BuildableName\");\n\t\t\t\t\t\t\t\tprojectScheme.blueprintName = element.getAttribute(\"BlueprintName\");\n\t\t\t\t\t\t\t\tprojectScheme.referencedContainer = element.getAttribute(\"ReferencedContainer\");\n\t\t\t\t\t\t\t    }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t    }\n\t\t\t\t\t\t}\n\t\t\t\t\t    }\n\t\t\t\t\t}\n\t\t\t\t    }\n\t\t\t\t}\n\t\t\t    }\n\t\t\t}\n\t\t    }\n\t\t}\n\t    }\n\t}\n\tcatch (SAXException ex) {\n\t    ex.printStackTrace();\n\t    projectScheme = null;\n\t}\n\tcatch (IOException ex) {\n\t    ex.printStackTrace();\n\t    projectScheme = null;\n\t}\n\tcatch (ParserConfigurationException ex) {\n\t    ex.printStackTrace();\n\t    projectScheme = null;\n\t}\n        catch ( InterruptedException ex ) {\n            ex.printStackTrace();\n            projectScheme = null;\n        }\n\treturn projectScheme;\n    }\n    \n    /**\n     * @param workspaceFileLocation Xcode workspace file location (directory)\n     * @return list of project files obtained as a result of analyzing workspaceFile. If analysis fails, it is empty\n     */\n    public static List<String> parseXcodeWorkspace(FilePath workspaceFileLocation) {\n\tList<String> projectList = new ArrayList<>();\n\ttry {\n\t    FilePath workspaceFilePath = workspaceFileLocation.child(\"contents.xcworkspacedata\");\n\t    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();\n\n\t    String FEATURE = null;\n\t    FEATURE = \"http://apache.org/xml/features/disallow-doctype-decl\";\n\t    factory.setFeature(FEATURE, true);\n\t    FEATURE = \"http://xml.org/sax/features/external-general-entities\";\n\t    factory.setFeature(FEATURE, false);\n\t    FEATURE = \"http://xml.org/sax/features/external-parameter-entities\";\n\t    factory.setFeature(FEATURE, false);\n\t    FEATURE = \"http://apache.org/xml/features/nonvalidating/load-external-dtd\";\n\t    factory.setFeature(FEATURE, false);\n\t    factory.setXIncludeAware(false);\n\t    factory.setExpandEntityReferences(false);\n\n\t    DocumentBuilder documentBuilder = factory.newDocumentBuilder();\n\t    Document document = documentBuilder.parse(workspaceFilePath.read());\n\n\t    Element root = document.getDocumentElement();\n\t    if ( root.getNodeName().equals(\"Workspace\") ) {\n\t\tNodeList rootChildren = root.getChildNodes();\n\n\t\tfor ( int i = 0; i < rootChildren.getLength(); i++ ) {\n\t\t    Node node = rootChildren.item(i);\n\t\t    if ( node.getNodeType() == Node.ELEMENT_NODE ) {\n\t\t\tElement element = (Element)node;\n\t\t\tif ( element.getNodeName().equals(\"FileRef\") ) {\n\t\t\t    String projectLocation = element.getAttribute(\"location\");\n\t\t\t    if ( projectLocation.startsWith(\"group:\") ) {\n\t\t\t\tprojectLocation = projectLocation.replaceAll(\"^group:\", \"\");\n\t\t\t\tprojectList.add(projectLocation);\n\t\t\t    }\n\t\t\t}\n\t\t    }\n\t\t}\n\t    }\n\t}\n\tcatch (SAXException ex) {\n\t    ex.printStackTrace();\n\t    projectList = null;\n\t}\n\tcatch (IOException ex) {\n\t    ex.printStackTrace();\n\t    projectList = null;\n\t}\n\tcatch (ParserConfigurationException ex) {\n\t    ex.printStackTrace();\n\t    projectList = null;\n\t}\n        catch ( InterruptedException ex ) {\n            ex.printStackTrace();\n            projectList = null;\n        }\n\treturn projectList;\n    }\n\n    /**\n     * @param infoPlistFile Xcode Info.plist file location\n     * @return analysis result of Info.plist file. If analysis fails, it is null\n     */\n    public static InfoPlist parseInfoPlist(FilePath infoPlistFile) {\n\tInfoPlist infoPlist = null;\n\ttry {\n\t    NSDictionary rootDict = (NSDictionary)PropertyListParser.parse(infoPlistFile.read());\n\t    String cfBundleIdentifier = rootDict.objectForKey(\"CFBundleIdentifier\").toString();\n\t    String cfBundleVersion = rootDict.objectForKey(\"CFBundleVersion\").toString();\n\t    String cfBundleShortVersionString = rootDict.objectForKey(\"CFBundleShortVersionString\").toString();\n\t    infoPlist = new InfoPlist(infoPlistFile, cfBundleIdentifier, cfBundleVersion, cfBundleShortVersionString);\n\t}\n\tcatch ( Exception ex ) {\n\t    ex.printStackTrace();\n\t}\n\treturn infoPlist;\n    }\n\n    /**\n     * @param projectLocation Xcode project file location (directory)\n     * @return analysis result of Xcode project file. If analysis fails, it is null\n     */\n    public static XcodeProject parseXcodeProject(FilePath projectLocation) {\n\tXcodeProject project = new XcodeProject();\n\tFilePath xcodeProjectFile = projectLocation.child(\"project.pbxproj\");\n\ttry {\n\t    NSDictionary rootDict = (NSDictionary)PropertyListParser.parse(xcodeProjectFile.read());\n\t    String rootObjectsUUID = rootDict.objectForKey(\"rootObject\").toString();\n\t    NSDictionary objectsDict = ((NSDictionary)rootDict.objectForKey(\"objects\"));\n\t    NSDictionary pbxProjectSectionDict = ((NSDictionary)objectsDict.objectForKey(rootObjectsUUID));\n\t    NSObject[] projectTargetUUIDs = ((NSArray)pbxProjectSectionDict.objectForKey(\"targets\")).getArray();\n\t    // In case Project has buildConfigurationList.\n\t    // Parse each targets.\n\t    for ( NSObject projectTargetUUID:projectTargetUUIDs ) {\n\t\tProjectTarget target = new ProjectTarget();\n\t\tNSDictionary projectTargetDict = ((NSDictionary)objectsDict.objectForKey(projectTargetUUID.toString()));\n\t\ttarget.uuid = projectTargetUUID.toString();\n\t\tString targetName = projectTargetDict.objectForKey(\"name\").toString();\n\t\t// Target has buildConfigurationList.\n\t\tString buildConfigurationListUUID = projectTargetDict.objectForKey(\"buildConfigurationList\").toString();\n\t\ttarget.productType = projectTargetDict.objectForKey(\"productType\").toString();\n\t\tif ( target.productType.equals(\"com.apple.product-type.application\") ||\n\t\t     target.productType.equals(\"com.apple.product-type.bundle.unit-test\") ||\n\t\t     target.productType.equals(\"com.apple.product-type.bundle.ui-testing\") ||\n\t\t     target.productType.equals(\"com.apple.product-type.watchkit-extension\") ||\n\t\t     target.productType.equals(\"com.apple.product-type.application.watchapp\") ||\n\t\t     target.productType.equals(\"com.apple.product-type.watchkit2-extension\") ||\n\t\t     target.productType.equals(\"com.apple.product-type.application.watchapp2\") ) {\n\t\t    NSDictionary attributesDict = ((NSDictionary)pbxProjectSectionDict.objectForKey(\"attributes\"));\n\t\t    NSDictionary targetAttributesDict = ((NSDictionary)attributesDict.objectForKey(\"TargetAttributes\"));\n\t\t    NSDictionary attributeDict = ((NSDictionary)targetAttributesDict.objectForKey(target.uuid));\n\t\t    if ( attributeDict.objectForKey(\"ProvisioningStyle\") != null ) {\n\t\t\ttarget.provisioningStyle = attributeDict.objectForKey(\"ProvisioningStyle\").toString();\n\t\t    }\n\t\t    else {\n\t\t\t// Default code signing style is \"Automatic\"\n\t\t\ttarget.provisioningStyle = \"Automatic\";\n\t\t    }\n                    if ( attributeDict.objectForKey(\"TestTargetID\") != null ) {\n                        target.testTargetID = attributeDict.objectForKey(\"TestTargetID\").toString();\n                    }\n\t\t    NSDictionary buildConfigurationList = ((NSDictionary)objectsDict.objectForKey(buildConfigurationListUUID));\n\t\t    if ( buildConfigurationList != null ) {\n\t\t\tif ( buildConfigurationList.objectForKey(\"defaultConfigurationName\") != null ) {\n\t\t\t    target.defaultConfigurationName = buildConfigurationList.objectForKey(\"defaultConfigurationName\").toString();\n\t\t\t}\n\t\t\tNSObject[] buildConfigurationUUIDs = ((NSArray)buildConfigurationList.objectForKey(\"buildConfigurations\")).getArray();\n\t\t\t// Parse each build configurations.\n\t\t\tfor ( NSObject buildConfigurationUUID : buildConfigurationUUIDs ) {\n\t\t\t    BuildConfiguration buildConfiguration = new BuildConfiguration(objectsDict, buildConfigurationUUID.toString(), target.provisioningStyle.equals(\"Automatic\"));\n\t\t\t    target.buildConfiguration.put(buildConfiguration.name, buildConfiguration);\n\t\t\t}\n\t\t    }\n\t\t    project.projectTarget.put(targetName, target);\n\t\t}\n\t\telse if ( target.productType.equals(\"com.apple.product-type.framework\" ) ) {\n\t\t}\n\t    }\n\t}\n\tcatch ( IOException ex ) {\n\t    ex.printStackTrace();\n\t    project = null;\n\t}\n        catch ( PropertyListFormatException ex ) {\n            ex.printStackTrace();\n            project = null;\n        }\n        catch ( ParseException ex ) {\n            ex.printStackTrace();\n            project = null;\n        }\n        catch ( ParserConfigurationException ex ) {\n            ex.printStackTrace();\n            project = null;\n        }\n        catch ( SAXException ex ) {\n            ex.printStackTrace();\n            project = null;\n        }\n\tcatch ( InterruptedException ex ) {\n\t    ex.printStackTrace();\n\t    project = null;\n\t}\n\treturn project;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XcodeSchemeFileFilter.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage au.com.rayh;\n\nimport java.io.File;\nimport java.io.FileFilter;\nimport java.io.Serializable;\n\n/**\n * @author Kazuhide Takahashi\n */\npublic class XcodeSchemeFileFilter implements FileFilter, Serializable {\n\n    public boolean accept(File pathname) {\n        return pathname.isFile() && pathname.getName().endsWith(\".xcscheme\");\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/XcodeTestSummariesParser.java",
    "content": "package au.com.rayh;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.net.InetAddress;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.text.ParseException;\nimport hudson.FilePath;\n\nimport com.dd.plist.NSDictionary; \nimport com.dd.plist.NSArray;\nimport com.dd.plist.NSNumber;\nimport com.dd.plist.NSObject;\nimport com.dd.plist.PropertyListParser;\n\nimport javax.xml.bind.JAXBContext;\nimport javax.xml.bind.JAXBException;\nimport javax.xml.bind.Marshaller;\n\nimport au.com.rayh.report.TestCase;\nimport au.com.rayh.report.TestError;\nimport au.com.rayh.report.TestFailure;\nimport au.com.rayh.report.TestSuite;\n\n/**\n * Summary of test results output by xcodebuild Analyze \"TestSummaries.plist\" to generate a JUnit compatible XML file.\n * @author Kazuhide Takahashi\n */\npublic class XcodeTestSummariesParser {\n    private FilePath testReportsDir;\n    //private static Pattern ASSERTION_FAILURE = Pattern.compile(\"(Assertion Failure: .*?)\\\\{\\\\(\\\\n(.*?)\\\\n\\\\)\\\\}\", Pattern.DOTALL);\n    private static Pattern FAILED_MESSAGE = Pattern.compile(\"(failed: .*?)\\\\n\\\\((.*?)\\\\n\\\\)\", Pattern.DOTALL);\n\n    public XcodeTestSummariesParser(FilePath workspace) throws IOException, InterruptedException {\n\tsuper();\n\ttestReportsDir = workspace.child(\"test-reports\");\n\ttestReportsDir.mkdirs();\n    }\n\n    private void writeTestReport(TestSuite currentTestSuite) throws IOException, InterruptedException,\n            JAXBException {\n        try (OutputStream testReportOutputStream = outputForSuite(currentTestSuite)) {\n            JAXBContext jaxbContext;\n            Thread t = Thread.currentThread();\n            ClassLoader orig = t.getContextClassLoader();\n            t.setContextClassLoader(XcodeTestSummariesParser.class.getClassLoader());\n            try {\n                jaxbContext = JAXBContext.newInstance(TestSuite.class);\n            } finally {\n                t.setContextClassLoader(orig);\n            }\n            Marshaller marshaller = jaxbContext.createMarshaller();\n            marshaller.marshal(currentTestSuite, testReportOutputStream);\n        }\n    }\n\n    protected OutputStream outputForSuite(TestSuite currentTestSuite) throws IOException, InterruptedException {\n\treturn testReportsDir.child(\"TEST-\" + currentTestSuite.getName() + \".xml\").write();\n    }\n\n    private static void addFailureSummaries(NSObject[] failureSummaries, TestCase currentTestCase) {\n\tfor ( NSObject object:failureSummaries ) {\n\t    NSDictionary failureSummarie = (NSDictionary)object;\n\t    boolean performanceFailure = ((NSNumber)failureSummarie.objectForKey(\"PerformanceFailure\")).boolValue();\n\t    if ( !performanceFailure ) {\n\t\tTestFailure failure;\n\t\tString message = failureSummarie.objectForKey(\"Message\").toString();\n\t\tMatcher m = FAILED_MESSAGE.matcher(message);\n\t\tif ( m.matches() ) {\n\t\t    String errorMessage = m.group(1);\n\t\t    String stackTrace = m.group(2);\n\t\t    failure = new TestFailure(errorMessage, stackTrace);\n\t\t}\n\t\telse {\n\t\t    String fileName = failureSummarie.objectForKey(\"FileName\").toString();\n\t\t    String lineNumber = failureSummarie.objectForKey(\"LineNumber\").toString();\n\t\t    failure = new TestFailure(message + \"\\n at File: \" + fileName + \"\\n Line number: \" + lineNumber, \"No stacktrace here.\");\n\t\t}\n\t\tcurrentTestCase.getFailures().add(failure);\n\t    }\n\t}\n    }\n\n    /*\n    private static void addActivitySummaries(NSObject[] activitySummaries, TestCase currentTestCase) {\n        for ( NSObject object:activitySummaries ) {\n\t    NSDictionary summarie = (NSDictionary)object;\n\t    NSObject value = summarie.objectForKey(\"Title\");\n            if ( value != null ) {\n\t\tString title = value.toString();\n\t\tMatcher m = ASSERTION_FAILURE.matcher(title);\n\t\tif ( m.matches() ) {\n\t\t    String errorLocation = m.group(1);\n\t\t    String errorMessage = m.group(2);\n\t\t    TestFailure failure = new TestFailure(errorMessage, errorLocation);\n\t\t    currentTestCase.getFailures().add(failure);\n\t\t}\n            }\n        }\n    }\n    */\n\n    /**\n     * @param tests An array of NSDictionaries containing the results of subtests.\n     * @param parentTestSuite An instance of the parent test result including this subtests.\n     */\n    public void parseSubTests(NSObject[] tests, TestSuite parentTestSuite) throws ParseException, IOException, InterruptedException, JAXBException {\n\tfor ( NSObject object:tests ) {\n            NSDictionary test = (NSDictionary)object;\n\t    Float duration = ((NSNumber)test.objectForKey(\"Duration\")).floatValue();\n\t    String testName = test.objectForKey(\"TestName\").toString();\n\t    String testIdentifier = test.objectForKey(\"TestIdentifier\").toString();\n\t    String testObjectClass = test.objectForKey(\"TestObjectClass\").toString();\n\t    NSObject value = test.objectForKey(\"Subtests\");\n            if ( value == null ) {\n\t\tTestCase currentTestCase = new TestCase(parentTestSuite.getName(), testName);\n\t\tString testStatus = test.objectForKey(\"TestStatus\").toString();\n\t\tif ( testStatus.equals(\"Failure\") ) {\n\t\t    value = test.objectForKey(\"FailureSummaries\");\n\t\t    if ( value != null ) {\n\t\t\tNSObject[] failureSummaries = ((NSArray)value).getArray();\n\t\t\taddFailureSummaries(failureSummaries, currentTestCase);\n\t\t    }\n\t\t    /*\n\t\t    value = test.objectForKey(\"ActivitySummaries\");\n\t\t    if ( value != null ) {\n\t\t\tNSObject[] activitySummaries = ((NSArray)value).getArray();\n\t\t\taddActivitySummaries(activitySummaries, currentTestCase);\n\t\t    }\n\t\t    */\n\t\t    currentTestCase.setTime(duration);\n\t\t    parentTestSuite.getTestCases().add(currentTestCase);\n\t\t    parentTestSuite.addFailure();\n\t\t}\n\t\telse if ( testStatus.equals(\"Success\") ) {\n\t\t    currentTestCase.setTime(duration);\n\t\t    parentTestSuite.getTestCases().add(currentTestCase);\n\t\t    parentTestSuite.addTest();\n\t\t}\n\t\twriteTestReport(parentTestSuite);\n\t    }\n\t    else {\n\t\tTestSuite currentTestSuite = new TestSuite(InetAddress.getLocalHost().getHostName(), testName, null);\n\t\tcurrentTestSuite.setDuration(duration);\n\t\tNSObject[] subTests = ((NSArray)value).getArray();\n\t\tparseSubTests(subTests, currentTestSuite);\n            }\n\t}\n    }\n\n    /**\n     * @param testSummariesPlistFile The location of the TestSummaries.plist file output from Xcode.\n     */\n    public void parseTestSummariesPlist(FilePath testSummariesPlistFile) {\n\ttry {\n\t    NSDictionary rootDict = (NSDictionary)PropertyListParser.parse(testSummariesPlistFile.read());\n\t    NSObject[] testableSummaries = ((NSArray)rootDict.objectForKey(\"TestableSummaries\")).getArray();\n\t    for ( NSObject object:testableSummaries ) {\n\t\tNSDictionary testSummarie = (NSDictionary)object;\n\t\tString diagnosticsDirectory = testSummarie.objectForKey(\"DiagnosticsDirectory\").toString();\n\t\tString testName = testSummarie.objectForKey(\"TestName\").toString();\n\t\tString projectPath = testSummarie.objectForKey(\"ProjectPath\").toString();\n\t\tString targetName = testSummarie.objectForKey(\"TargetName\").toString();\n\t\tTestSuite currentTestSuite = new TestSuite(InetAddress.getLocalHost().getHostName(), testName, null);\n\t\tNSObject[] tests = ((NSArray)testSummarie.objectForKey(\"Tests\")).getArray();\n\t\tif ( tests != null ) {\n\t\t    parseSubTests(tests, currentTestSuite);\n\t\t}\n\t    }\n\t}\n\tcatch ( Exception ex ) {\n\t    ex.printStackTrace();\n\t}\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/report/TestCase.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage au.com.rayh.report;\n\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.xml.bind.annotation.XmlAccessType;\nimport javax.xml.bind.annotation.XmlAccessorType;\nimport javax.xml.bind.annotation.XmlAttribute;\nimport javax.xml.bind.annotation.XmlElement;\nimport javax.xml.bind.annotation.XmlType;\n\n@XmlType(name=\"testcase\")\n@XmlAccessorType(XmlAccessType.NONE)\npublic class TestCase {\n    @XmlAttribute\n    String classname;\n    \n    @XmlAttribute\n    String name;\n    \n    @XmlAttribute\n    float time;\n    \n    @XmlElement(name=\"failure\")\n    List<TestFailure> failures = new ArrayList<>();\n    \n    @XmlElement(name=\"error\")\n    List<TestError> errors = new ArrayList<>();\n\n    public TestCase() {\n    }\n\n    @SuppressFBWarnings(\"URF_UNREAD_FIELD\")\n    public TestCase(String classname, String name) {\n        this.classname = classname;\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setTime(float time) {\n        this.time = time;\n    }\n\n    public float getTime() {\n        return time;\n    }\n\n    public List<TestFailure> getFailures() {\n        return failures;\n    }\n    \n    public List<TestError> getErrors() {\n        return errors;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/report/TestError.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2014 David Baker\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage au.com.rayh.report;\n\nimport javax.xml.bind.annotation.XmlAccessType;\nimport javax.xml.bind.annotation.XmlAccessorType;\nimport javax.xml.bind.annotation.XmlAttribute;\nimport javax.xml.bind.annotation.XmlType;\n\n@XmlType(name=\"error\")\n@XmlAccessorType(XmlAccessType.NONE)\npublic class TestError {\n    @XmlAttribute\n    String message;\n    \n    @XmlAttribute\n    String type;\n\n    public TestError() {\n    }\n\n    public TestError(String message, String type) {\n        this.message = message;\n        this.type = type;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public String getType() {\n        return type;\n    }\n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/report/TestFailure.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage au.com.rayh.report;\n\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\n\nimport javax.xml.bind.annotation.XmlAccessType;\nimport javax.xml.bind.annotation.XmlAccessorType;\nimport javax.xml.bind.annotation.XmlAttribute;\nimport javax.xml.bind.annotation.XmlType;\nimport javax.xml.bind.annotation.XmlValue;\n\n@XmlType(name=\"failure\")\n@XmlAccessorType(XmlAccessType.NONE)\npublic class TestFailure {\n    @XmlAttribute\n    String message;\n    \n    @SuppressFBWarnings(\"URF_UNREAD_FIELD\")\n    @XmlAttribute\n    String type = \"Failure\";\n    \n    @XmlValue\n    String location;\n\n    public TestFailure() {\n    }\n\n    public TestFailure(String message, String location) {\n        this.message = message;\n        this.location = location;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public String getLocation() {\n        return location;\n    }\n    \n}\n"
  },
  {
    "path": "src/main/java/au/com/rayh/report/TestSuite.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage au.com.rayh.report;\n\nimport edu.umd.cs.findbugs.annotations.SuppressFBWarnings;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport javax.xml.bind.annotation.XmlAccessType;\nimport javax.xml.bind.annotation.XmlAccessorType;\nimport javax.xml.bind.annotation.XmlAttribute;\nimport javax.xml.bind.annotation.XmlElement;\nimport javax.xml.bind.annotation.XmlRootElement;\nimport javax.xml.bind.annotation.XmlTransient;\n\n@XmlRootElement(name=\"testsuite\")\n@XmlAccessorType(XmlAccessType.NONE)\npublic class TestSuite {\n    @XmlAttribute\n    int failures;\n    \n    @XmlAttribute\n    int errors;\n    \n    @XmlAttribute\n    String hostname;\n    \n    @XmlAttribute\n    String name;\n    \n    @XmlAttribute\n    int tests;\n    \n    @XmlAttribute\n    float time;\n    \n    @XmlAttribute(name=\"timestamp\")\n    Date endTime;\n    \n    @XmlElement(name=\"testcase\")\n    List<TestCase> testcases = new ArrayList<>();\n\n    @XmlTransient\n    Date startTime;\n\n    HashMap <String, TestCase> testCasesHash = new HashMap <String, TestCase>();\n\n    public TestSuite() {\n    }\n    \n    @SuppressFBWarnings({\"EI_EXPOSE_REP2\", \"URF_UNREAD_FIELD\"})\n    public TestSuite(String hostname, String name, Date startTime) {\n        this.hostname = hostname;\n        this.name = name;\n        this.startTime = startTime;\n    }\n\n    public void setDuration(Float duration) {\n        this.time = duration;\n    }\n\n    public HashMap<String, TestCase> getTestCasesHash() {\n\treturn testCasesHash;\n    }\n\n    public void setTestCasesHash(HashMap<String, TestCase> testCasesHash) {\n\tthis.testCasesHash = testCasesHash;\n    }\n\n    public int getFailures() {\n        return failures;\n    }\n    \n    public int getErrors() {\n        return errors;\n    }\n\n    public int getTests() {\n        return tests;\n    }\n\n    public void addFailure() {\n        failures+=1;\n    }\n    \n    public void addError() {\n        errors+=1;\n    }\n\n    public void addTest() {\n        tests+=1;\n    }\n    \n    public String getName() {\n        return name;\n    }\n\n    @SuppressFBWarnings(\"EI_EXPOSE_REP\")\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    @SuppressFBWarnings({\"EI_EXPOSE_REP2\", \"URF_UNREAD_FIELD\"})\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n        this.time = (endTime.getTime() - startTime.getTime())/1000f;\n    }\n\n    public List<TestCase> getTestCases() {\n        return testcases;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/hudson/plugins/xcode/XcodeInstallation.java",
    "content": "package hudson.plugins.xcode;\n\nimport hudson.EnvVars;\nimport hudson.Extension;\nimport hudson.init.Initializer;\nimport hudson.model.EnvironmentSpecific;\nimport hudson.model.Node;\nimport hudson.model.TaskListener;\nimport hudson.slaves.NodeSpecific;\nimport hudson.tools.ToolDescriptor;\nimport hudson.tools.ToolInstallation;\nimport hudson.tools.ToolProperty;\nimport hudson.util.FormValidation;\nimport jenkins.model.Jenkins;\nimport net.sf.json.JSONObject;\nimport org.jenkinsci.Symbol;\nimport org.kohsuke.stapler.DataBoundConstructor;\nimport org.kohsuke.stapler.QueryParameter;\nimport org.kohsuke.stapler.StaplerRequest;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.logging.Logger;\n\nimport static hudson.init.InitMilestone.EXTENSIONS_AUGMENTED;\nimport java.util.logging.Level;\n\n/**\n * Information about Xcode installation.\n *\n * @author Kazuhide Takahashi\n */\npublic class XcodeInstallation extends ToolInstallation implements NodeSpecific<XcodeInstallation>, EnvironmentSpecific<XcodeInstallation> {\n\n    /**\n     * Constructor for XcodeInstallation.\n     *\n     * @param name Tool name (for example, \"Xcode 9.3\")\n     * @param home Tool location (usually \"/Applications/Xcode.app/Contents/Developer\")\n     * @param properties {@link java.util.List} of properties for this tool\n     */\n    @DataBoundConstructor\n    public XcodeInstallation(String name, String home, List<? extends ToolProperty<?>> properties) {\n        super(name, home, properties);\n    }\n\n    public static XcodeInstallation[] allInstallations() {\n\tJenkins instance = Jenkins.getInstance();\n\tif ( instance != null ) {\n\t    DescriptorImpl descriptor = instance.getDescriptorByType(DescriptorImpl.class);\n\t    if ( descriptor != null ) {\n    \t\tXcodeInstallation[] installations = descriptor.getInstallations();\n    \t\tif ( installations != null ) {\n\t\t    return installations;\n\t\t}\n\t    }\n    \t}\n \treturn new XcodeInstallation[0];\n   }\n\n    /**\n     * getXcodebuild.\n     *\n     * @return {@link java.lang.String} that will be used to execute xcodebuild (e.g. \"/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild\")\n     */\n    public String getXcodebuild() {\n        return getHome() + \"/usr/bin/xcodebuild\";\n    }\n\n    private static XcodeInstallation[] getInstallations(DescriptorImpl descriptor) {\n        XcodeInstallation[] installations = null;\n        try {\n            installations = descriptor.getInstallations();\n        } catch (NullPointerException e) {\n            installations = new XcodeInstallation[0];\n        }\n        return installations;\n    }\n\n    public XcodeInstallation forNode(Node node, TaskListener log) throws IOException, InterruptedException {\n        return new XcodeInstallation(getName(), translateFor(node, log), Collections.<ToolProperty<?>>emptyList());\n    }\n\n    public XcodeInstallation forEnvironment(EnvVars environment) {\n        return new XcodeInstallation(getName(), environment.expand(getHome()), Collections.<ToolProperty<?>>emptyList());\n    }\n\n    @Override\n    public DescriptorImpl getDescriptor() {\n        Jenkins jenkinsInstance = Jenkins.getInstance();\n        if (jenkinsInstance == null) {\n            /* Throw AssertionError exception to match behavior of Jenkins.getDescriptorOrDie */\n            throw new AssertionError(\"No Jenkins instance\");\n        }\n        return (DescriptorImpl) jenkinsInstance.getDescriptorOrDie(getClass());\n    }\n\n    @Extension @Symbol(\"xcode\")\n    public static class DescriptorImpl extends ToolDescriptor<XcodeInstallation> {\n\n        public DescriptorImpl() {\n            load();\n        }\n\n        @Override\n        public String getDisplayName() {\n            return \"Xcode tools\";\n        }\n\n        @Override\n        public boolean configure(StaplerRequest req, JSONObject json) throws FormException {\n            setInstallations(req.bindJSONToList(clazz, json.get(\"tool\")).toArray(new XcodeInstallation[0]));\n            save();\n            return true;\n        }\n\n        public FormValidation doCheckHome(@QueryParameter File value) {\n            Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER);\n            String path = value.getPath() + \"/usr/bin/xcodebuild\";\n\n            return FormValidation.validateExecutable(path);\n        }\n\n        public XcodeInstallation getInstallation(String name) {\n            for(XcodeInstallation i : getInstallations()) {\n                if(i.getName().equals(name)) {\n                    return i;\n                }\n            }\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfile/config.groovy",
    "content": "package au.com.rayh.DeveloperProfile\n\nimport java.security.GeneralSecurityException\nimport java.security.cert.CertificateException\n\nf = namespace(lib.FormTagLib)\nst = namespace(\"jelly:stapler\")\n\ndef fileForm() {\n    f.entry(title:_(\"*.developerprofile  File\"), field:\"image\") {\n        raw(\"<input type=file name=image size=40 jsonAware=yes>\")\n    }\n    f.entry(title:_(\"Password\"), field:\"password\") {\n        f.password()\n    }\n}\n\ndef img = instance?.image\nif (img ==null) {\n    fileForm()\n} else {\n    f.entry(title:_(\"Contents\")) {// show the certificates in the profile\n        try {\n            def certs = instance.certificates\n            certs.each { c ->\n                boolean valid=true;\n                try {\n                    c.checkValidity();\n                } catch (CertificateException e) {\n                    valid = false;\n                }\n\n                div(class:valid?null:'error') {\n                    text(instance.getDisplayNameOf(c))\n                    if (!valid)\n                        text(\"expired\");\n                }\n            }\n            if (certs.isEmpty())\n                div(class:'error', \"There's no certificate in this profile\");\n        } catch (IOException e) {\n            div(class:'error', \"Not a developer profile or a wrong password: ${e.message}\")\n        } catch (GeneralSecurityException e) {\n            div(class:'error', \"Not a developer profile or a wrong password: ${e.message}\")\n        }\n    }\n    f.optionalBlock(title:_(\"Re-upload *.developerprofile File\"),inline:true) {\n        fileForm()\n    }\n}\n\nst.include(page: \"id-and-description\", class: descriptor.clazz)\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfile/config_ja.properties",
    "content": "*.developerprofile\\ \\ File=*.developerprofile \\u30d5\\u30a1\\u30a4\\u30eb\nPassword=\\u30d1\\u30b9\\u30ef\\u30fc\\u30c9\nContents=\\u5185\\u5bb9\nRe-upload\\ *.developerprofile\\ File=*.developerprofile \\u30d5\\u30a1\\u30a4\\u30eb\\u3092\\u518d\\u30a2\\u30c3\\u30d7\\u30ed\\u30fc\\u30c9\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfile/help-description.html",
    "content": "<div>\n    Any one-liner text to help you remember what this certificate is\n    among other certificates. Jenkins will use this text when it wants\n    you to select a certificate.\n</div>"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfile/help-description_ja.html",
    "content": "<div>\n    この証明書が何であるかを覚えておくための任意の一行のテキスト。\n    Jenkinsはこのテキストを使用して証明書を選択します。\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfile/help-password.html",
    "content": "<div>\n    The password you set when you exported your developer profile.\n</div>"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfile/help-password_ja.html",
    "content": "<div>\n    開発者プロファイルをエクスポートしたときに設定したパスワード。\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfile/help.html",
    "content": "<div>\n    Register your developer profile to Jenkins so that you can sign binaries built on Jenkins with your identities.\n    See <a href=\"https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html\">\n    this document</a> for how to export your developer profile from your XCode into a <tt>*.developerprofile</tt> file.\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfile/help_ja.html",
    "content": "<div>\n    開発者プロファイルをJenkinsに登録しておくと、Jenkinsでビルドされたバイナリに自分のIDで署名することができます。\n    詳しくは <a href=\"https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html\">\n    このドキュメント</a> を参照して、どのようにしてXcodeから開発者プロフィール <tt>*.developerprofile</tt> をエクスポートするかを調べます。\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfile/upload.groovy",
    "content": "package au.com.rayh.DeveloperProfile\n\n\"\"\"\n<form method=\"post\"\n      action=\"submit?id=${request.getParameter('id')}\"\n      enctype=\"multipart/form-data\">\n  Developer Profile: <input type=file name=profile size=40>\n  &nbsp;\n  <input type=submit value=upload>\n\"\"\""
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfileLoader/config.jelly",
    "content": "<?jelly escape-by-default='true'?>\n<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l=\"/lib/layout\" xmlns:t=\"/lib/hudson\" xmlns:f=\"/lib/form\" xmlns:html=\"jelly:html\">\n    <![CDATA[\n\t\t<script type=\"text/javascript\">\n\t\t<!--\n\t\t\tvar showOrHideAttributeInput = function(prefix, uuid) {\n\t\t\t\tvar defaultChosen = (document.getElementById(prefix + uuid).selectedIndex == 0);\n\n\t\t\t\tdocument.getElementById(\"\" + uuid).style.display = defaultChosen ? \"block\" : \"none\";\n\t\t\t};\n\t\t-->\n\t\t</script>\n\t]]>\n\n    <!-- General build settings -->\n\t<j:invokeStatic var=\"developerProfiles\" className=\"au.com.rayh.DeveloperProfile\" method=\"getAllProfiles\"/>\n\t<j:if test=\"${!empty(developerProfiles)}\">\n            <f:entry title=\"${%Developer Profile}\" description=\"${%Specify the developer profile to import into the keychain.}\" field=\"developerProfiles\"\n                help=\"/plugin/xcode-plugin/help/help-importDeveloperProfile.html\" >\n                <select class=\"setting-input\" name=\"developerProfileId\">\n                    <j:forEach var=\"profile\" items=\"${developerProfiles}\">\n                        <f:option selected=\"${profile.getId()==instance.developerProfileId}\" value=\"${profile.getId()}\">${profile.getDescription()}</f:option>\n                    </j:forEach>\n                </select>\n            </f:entry>\n        </j:if>\n\n        <f:entry>\n            <f:optionalBlock inline=\"true\" checked=\"${instance.importIntoExistingKeychain == true}\" field=\"importIntoExistingKeychain\" title=\"${%Import into existing Keychain}\" help=\"/plugin/xcode-plugin/help/help-importIntoExistingKeychain.html\">\n\t\t        <j:if test=\"${instance.keychainName!=null}\">\n                    <div class=\"alert alert-warning\">\n                        ${%The 'Configure System' keychain information is used but this is a deprecated method.}\n                        ${%From now on, please move keychain information to 'Credentials' instead of 'Configure System' and use it.}\n                    </div>\n                </j:if>\n                <j:set var=\"UUID\" value=\"${descriptor.UUID}\" />\n\t\t        <j:invokeStatic var=\"keychainPasswordAndPaths\" className=\"au.com.rayh.KeychainPasswordAndPathImpl\" method=\"getAllKeycainInfo\"/>\n                <f:entry title=\"${%Target keychain}\" description=\"${%The combination of path and password defined in 'Credentials' for unlocking the keychain that imports the developer profile.}\" field=\"targetKeychains\" help=\"/plugin/xcode-plugin/help/help-importKeychainId.html\">\n                    <select class=\"setting-input\" name=\"keychainId\" foo=\"${UID}\" id=\"global-keychain-select-${UUID}\" onchange=\"showOrHideAttributeInput('global-keychain-select-', '${UUID}')\">\n                        <f:option selected=\"${instance.keychainId==null}\" value=\"\">${%none} (${%specify one below})</f:option>\n\n                        <j:forEach var=\"keychain\" items=\"${keychainPasswordAndPaths}\">\n                            <j:if test=\"${keychain.getId()==instance.keychainId}\">\n                                <j:set var=\"displayCustomKeychainData\" value=\"none\" scope=\"parent\" />\n                            </j:if>\n                            <f:option selected=\"${keychain.getId()==instance.keychainId}\" value=\"${keychain.getId()}\">${keychain.getDescription()}</f:option>\n                        </j:forEach>\n                    </select>\n                </f:entry>\n\n                <f:nested>\n                    <j:if test=\"${displayCustomKeychainData==null}\">\n                        <j:set var=\"displayCustomKeychainData\" value=\"block\" />\n                    </j:if>\n\n                    <table id=\"${UUID}\" style=\"display: ${displayCustomKeychainData}\">\n                        <f:entry title=\"${%Keychain path}\" field=\"keychainPath\" description=\"${%Keychain path to import developer profile.}\">\n                            <f:textbox />\n                        </f:entry>\n\n                        <f:entry title=\"${%Keychain password}\" field=\"keychainPwd\" description=\"${%Password to unlock keychain importing developer profile.}\">\n                            <f:password />\n                        </f:entry>\n                    </table>\n                </f:nested>\n\n\t    </f:optionalBlock>\n\t</f:entry>\n\n</j:jelly>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/DeveloperProfileLoader/config_ja.properties",
    "content": "Developer\\ Profile=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\nImport\\ into\\ existing\\ Keychain=\\u65E2\\u5B58\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306B\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\nTarget\\ keychain=\\u5BFE\\u8C61\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\nnone\\ (specify\\ one\\ below)=\\u672A\\u9078\\u629E (\\u6B21\\u3067\\u6307\\u5B9A)\nKeychain\\ path=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nThe\\ path\\ of\\ the\\ keychain\\ to\\ use\\ to\\ sign\\ the\\ IPA.=.ipa\\u306B\\u30B3\\u30FC\\u30C9\\u7F72\\u540D\\u3092\\u884C\\u306A\\u3046\\u306E\\u306B\\u4F7F\\u7528\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nKeychain\\ password=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nThe\\ password\\ to\\ use\\ to\\ unlock\\ the\\ keychain.=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30ED\\u30C3\\u30AF\\u3092\\u89E3\\u9664\\u3059\\u308B\\u305F\\u3081\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nSpecify\\ the\\ developer\\ profile\\ to\\ import\\ into\\ the\\ keychain.=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306B\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u6307\\u5B9A\nnone=\\u672A\\u9078\\u629E\nspecify\\ one\\ below=\\u6B21\\u3067\\u6307\\u5B9A\nDeveloper\\ Profile\\ ID=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u306EID\nSpecify\\ the\\ ID\\ of\\ the\\ developer\\ profile\\ to\\ import\\ into\\ the\\ keychain.=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306B\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u306EID\\u3092\\u6307\\u5B9A\nThe\\ globally\\ configured\\ keychain\\ to\\ import\\ developer\\ profile.=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u305F\\u3081\\u306E\\u30B7\\u30B9\\u30C6\\u30E0\\u8A2D\\u5B9A\\u3067\\u8A2D\\u5B9A\\u3055\\u308C\\u305F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\nKeychain\\ path\\ to\\ import\\ developer\\ profile.=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u3092\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nPassword\\ to\\ unlock\\ keychain\\ importing\\ developer\\ profile.=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u3092\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\\u3059\\u308B\\u305F\\u3081\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nExport\\ keychain\\ info=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u60C5\\u5831\\u3092\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\nYes=\\u306F\\u3044\nSet\\ the\\ path\\ and\\ password\\ of\\ the\\ key\\ chain\\ that\\ imported\\ the\\ developer\\ profile\\ into\\ the\\ environment\\ variable.=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3057\\u305F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u3068\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u3092\\u74B0\\u5883\\u5909\\u6570\\u306B\\u8A2D\\u5B9A\\u3057\\u307E\\u3059\\u3002\nThe\\ 'Configure\\ System'\\ keychain\\ information\\ is\\ used\\ but\\ this\\ is\\ a\\ deprecated\\ method.=\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u60C5\\u5831\\u304C\\u4F7F\\u308F\\u308C\\u3066\\u3044\\u307E\\u3059\\u304C\\u3001\\u73FE\\u5728\\u306F\\u3053\\u308C\\u306F\\u975E\\u63A8\\u5968\\u306E\\u65B9\\u6CD5\\u3067\\u3059\\u3002\nFrom\\ now\\ on,\\ please\\ move\\ keychain\\ information\\ to\\ 'Credentials'\\ instead\\ of\\ 'Configure\\ System'\\ and\\ use\\ it.=\\u4ECA\\u5F8C\\u306F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u60C5\\u5831\\u306F\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u3067\\u306F\\u306A\\u304F\\u300C\\u8A8D\\u8A3C\\u60C5\\u5831\\u300D\\u306B\\u8A2D\\u5B9A\\u3057\\u3066\\u3001\\u305D\\u308C\\u3092\\u5229\\u7528\\u3059\\u308B\\u3088\\u3046\\u306B\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044\\u3002\nThe\\ combination\\ of\\ path\\ and\\ password\\ defined\\ in\\ 'Credentials'\\ for\\ unlocking\\ the\\ keychain\\ that\\ imports\\ the\\ developer\\ profile.=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\\u3059\\u308B\\u305F\\u3081\\u306E\\u300C\\u8A8D\\u8A3C\\u60C5\\u5831\\u300D\\u3067\\u5B9A\\u7FA9\\u3055\\u308C\\u305F\\u3001\\u30D1\\u30B9\\u3068\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u306E\\u7D44\\u307F\\u5408\\u308F\\u305B\\u3002\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/ExportIpa/config.jelly",
    "content": "<?jelly escape-by-default='true'?>\n<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l=\"/lib/layout\" xmlns:t=\"/lib/hudson\" xmlns:f=\"/lib/form\" xmlns:html=\"jelly:html\">\n    <![CDATA[\n\t\t<script type=\"text/javascript\">\n\t\t<!--\n\t\t\tvar showOrHideAttributeInput = function(prefix, uuid) {\n\t\t\t\tvar defaultChosen = (document.getElementById(prefix + uuid).selectedIndex == 0);\n\n\t\t\t\tdocument.getElementById(\"\" + uuid).style.display = defaultChosen ? \"block\" : \"none\";\n\t\t\t};\n\t\t-->\n\t\t</script>\n\t]]>\n\n    <!-- General export settings -->\n    <f:section title=\"${%General export settings}\">\n        <f:entry>\n            <j:set var=\"UUID\" value=\"${descriptor.UUID}\" />\n            <f:entry title=\"${%Development Team}\" description=\"${%Override the Development Team specified in the project.}\" field=\"globalDevelopmentTeam\"\n                help=\"/plugin/xcode-plugin/help/help-globalDevelopmentTeam.html\" >\n                <select class=\"setting-input\" name=\"developmentTeamName\" foo=\"${UID}\" id=\"global-team-select-${UUID}\" onchange=\"showOrHideAttributeInput('global-team-select-', '${UUID}')\">\n                    <f:option selected=\"${instance.developmentTeamName==null}\" value=\"\">${%none} (${%specify one below})</f:option>\n\n                    <j:forEach var=\"team\" items=\"${descriptor.globalConfiguration.teams}\">\n                        <j:if test=\"${team.teamName==instance.developmentTeamName}\">\n                            <j:set var=\"displayCustomTeamData\" value=\"none\" scope=\"parent\" />\n                        </j:if>\n\n                        <f:option selected=\"${team.teamName==instance.developmentTeamName}\">${team.teamName}</f:option>\n                    </j:forEach>\n                </select>\n            </f:entry>\n\n            <f:nested>\n                <j:if test=\"${displayCustomTeamData==null}\">\n                    <j:set var=\"displayCustomTeamData\" value=\"block\" />\n                </j:if>\n\n                <table id=\"${UUID}\" style=\"display: ${displayCustomTeamData}\">\n                    <f:entry title=\"${%Development Team ID}\" field=\"developmentTeamID\" description=\"${%The ID of the Apple development team to use to sign the IPA.}\"\n                    help=\"/plugin/xcode-plugin/help/help-developmentTeamID.html\" >\n                        <f:textbox />\n                    </f:entry>\n                </table>\n            </f:nested>\n        </f:entry>\n\n        <j:invokeStatic var=\"installations\" className=\"hudson.plugins.xcode.XcodeInstallation\" method=\"allInstallations\"/>\n        <j:if test=\"${!empty(installations)}\">\n            <f:entry title=\"${%Xcode Tools Version}\" field=\"xcodeToolsVersion\" description=\"${%Xcode Tools version.} (${%if you need to override System Default})\" help=\"/plugin/xcode-plugin/help/help-xcodeToolsVersion.html\" >\n                <select class=\"setting-input\" name=\"xcodeName\">\n                    <option value=\"\">${%System Default}</option>\n                    <j:forEach var=\"inst\" items=\"${installations}\">\n                        <f:option selected=\"${inst.name==instance.xcodeName}\" value=\"${inst.name}\">${inst.name}</f:option>\n                    </j:forEach>\n                </select>\n            </f:entry>\n        </j:if>\n\n        <f:entry title=\"${%Archive directory}\" field=\"archiveDir\" description=\"${%Specify the location of the path to read the Archive for exporting the IPA file.}\">\n            <f:textbox />\n        </f:entry>\n\n        <f:entry>\n            <f:entry title=\"${%Export method}\" field=\"ipaExportMethod\"\n                description=\"${%The export method of the .app to generate the .ipa file. Should be one in 'development', 'ad-hoc', 'enterprise' or 'app-store'.}\" help=\"/plugin/xcode-plugin/help/help-ipaExportMethod.html\">\n                <f:textbox default=\"ad-hoc\" />\n            </f:entry>\n\n            <f:entry title=\"${%.ipa filename pattern}\" field=\"ipaName\"\n                description=\"${%A pattern for the ipa file name. You may use} $${VERSION} ${%and} $${BUILD_DATE} (yyyy.MM.dd) ${%in this string}\" help=\"/plugin/xcode-plugin/help/help-ipaName.html\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Output directory}\" field=\"ipaOutputDirectory\" description=\"${%The output directory for the .ipa file, relative to the build directory.}\" help=\"/plugin/xcode-plugin/help/help-ipaOutputDirectory.html\">\n                <f:textbox />\n            </f:entry>\n\n            <f:advanced title=\"${%Settings}\">\n                <f:entry title=\"${%Upload Bitcode?}\" field=\"uploadBitcode\"\n                    description=\"${%If checked, include Bitcode when exporting applications to IPA.}\" help=\"/plugin/xcode-plugin/help/help-uploadBitcode.html\">\n                    <f:checkbox title=\"${%Yes}\" field=\"uploadBitcode\" checked=\"${instance.uploadBitcode}\" default=\"true\" />\n                </f:entry>\n\n                <f:entry title=\"${%Upload Symbols?}\" field=\"uploadSymbols\"\n                    description=\"${%If checked, include symbols when exporting applications to IPA.}\" help=\"/plugin/xcode-plugin/help/help-uploadSymbols.html\">\n                    <f:checkbox title=\"${%Yes}\" field=\"uploadSymbols\" checked=\"${instance.uploadSymbols}\" default=\"true\" />\n                </f:entry>\n\n                <f:entry title=\"${%Compile Bitcode?}\" field=\"compileBitcode\"\n                    description=\"${%If checked, recompile from Bitcode when exporting the application to IPA.}\" help=\"/plugin/xcode-plugin/help/help-compileBitcode.html\">\n                    <f:checkbox title=\"${%Yes}\" field=\"compileBitcode\" checked=\"${instance.compileBitcode}\" default=\"true\" />\n                </f:entry>\n\n                <f:entry title=\"${%Thinning}\" field=\"thinning\"\n                    description=\"${%When doing Thinning, specify the target device for thinning.}\" help=\"/plugin/xcode-plugin/help/help-thinning.html\">\n                    <f:textbox />\n                </f:entry>\n\n                <f:entry title=\"${%Pack on demand resources?}\" field=\"packResourcesAsset\"\n                    description=\"${%If checked, include on demand resource assets to the bundle.}\" help=\"/plugin/xcode-plugin/help/help-embedOnDemandResources.html\">\n                    <f:checkbox title=\"${%Yes}\" field=\"packResourcesAsset\" checked=\"${instance.packResourcesAsset}\" default=\"true\" />\n                </f:entry>\n\n                <f:entry title=\"${%On demand resources asset URL}\" field=\"resourcesAssetURL\"\n                    description=\"${%Set the base URL for downloading resource assets when the resource asset is not included in the bundle in the application using the on demand resource.}\" help=\"/plugin/xcode-plugin/help/help-onDemandResourcesURL.html\">\n                    <f:textbox />\n                </f:entry>\n\n                <f:entry title=\"${%Application URL}\" field=\"appURL\"\n                    description=\"${%The base URL to use to create a Manifest Plist. If omitted no Manifest Plist will be generated}\" help=\"/plugin/xcode-plugin/help/help-manifestPlistURL.html\">\n                    <f:textbox />\n                </f:entry>\n\n                <f:entry title=\"${%Display image URL}\" field=\"displayImageURL\"\n                    description=\"${%Specify the URL of the 57 pixel size png image to be displayed in the IPA installation.}\" help=\"/plugin/xcode-plugin/help/help-displayImageURL.html\">\n                    <f:textbox />\n                </f:entry>\n\n                <f:entry title=\"${%Full size image URL}\" field=\"fullSizeImageURL\"\n                    description=\"${%Specify the URL of the 512 pixel size png image to be displayed in the IPA installation.}\" help=\"/plugin/xcode-plugin/help/help-fullSizeImageURL.html\">\n                    <f:textbox />\n                </f:entry>\n\n                <f:entry title=\"${%Asset pack URL}\" field=\"assetPackManifestURL\"\n                    description=\"${%Specify the base URL of the downloading asset pack.}\" help=\"/plugin/xcode-plugin/help/help-assetPackManifestURL.html\">\n                    <f:textbox />\n                </f:entry>\n\n                <f:entry title=\"${%Strip Swift Symbols?}\" field=\"stripSwiftSymbols\"\n                    description=\"${%If checked, symbols be stripped from Swift libraries when exporting the application to IPA.}\" help=\"/plugin/xcode-plugin/help/help-stripSwiftSymbols.html\">\n                    <f:checkbox title=\"${%Yes}\" field=\"stripSwiftSymbols\" checked=\"${instance.stripSwiftSymbols}\" default=\"true\" />\n                </f:entry>\n\t    </f:advanced>\n\n        </f:entry>\n    </f:section>\n\n    <!-- Code signing section -->\n    <f:section title=\"${%Code signing &amp; OS X keychain options}\">\n        <f:advanced title=\"${%Code signing settings}\">\n            <f:entry field=\"export\">\n                <f:radioBlock inline=\"true\" checked=\"${instance.signingMethod==null||instance.signingMethod.equals('automatic')}\" name=\"ExportIpa.signingMethod\" title=\"${%Automatic Signing}\" value=\"automatic\" help=\"/plugin/xcode-plugin/help/help-automaticSigning.html\">\n                    <f:entry>\n                    </f:entry>\n                </f:radioBlock>\n                <f:radioBlock inline=\"true\" checked=\"${instance.signingMethod.equals('readFromProject')}\" name=\"ExportIpa.signingMethod\" title=\"${%Read from Xcode Project}\" value=\"readFromProject\" help=\"/plugin/xcode-plugin/help/help-readFromProject.html\">\n                    <f:entry>\n                    </f:entry>\n                </f:radioBlock>\n                <f:radioBlock inline=\"true\" checked=\"${instance.signingMethod.equals('manual')}\" name=\"ExportIpa.signingMethod\" title=\"${%Manual signing}\" value=\"manual\" help=\"/plugin/xcode-plugin/help/help-manualSigning.html\">\n                    <f:entry title=\"${%Provisioning Profiles}\" description=\"${%Set a combination of 'Bundle ID' and 'UUID or Specifire' of 'provisioning profiles' used when exporting .ipa files.}\" help=\"/plugin/xcode-plugin/help/help-appIDandProvisionUUID.html\" >\n                        <f:repeatable var=\"provisioningProfile\" field=\"provisioningProfiles\" items=\"${instance.provisioningProfiles}\" minimum=\"1\">\n                            <table width=\"100%\">\n                                <f:entry title=\"${%Bundle ID}\"\n                                    description=\"${%The bundle identifier} (App ID) ${%for this provisioning profile}\"\n                                    field=\"provisioningProfileAppId\"\n                                    help=\"/plugin/xcode-plugin/help/help-bundleID.html\" >\n                                    <f:textbox name=\"provisioningProfile.provisioningProfileAppId\" value=\"${provisioningProfile.provisioningProfileAppId}\" />\n                                </f:entry>\n                                <f:entry title=\"${%Provisioning profile UUID}\"\n                                    description=\"${%The UUID or Specifire of the provisioning profile associated to this bundle identifier.}\"\n                                    field=\"provisioningProfileUUID\"\n                                    help=\"/plugin/xcode-plugin/help/help-provisioningUUID.html\" >\n                                    <f:textbox name=\"provisioningProfile.provisioningProfileUUID\" value=\"${provisioningProfile.provisioningProfileUUID}\" />\n                                </f:entry>\n                                <f:entry title=\"\">\n                                    <div align=\"right\">\n                                        <f:repeatableDeleteButton />\n                                    </div>\n                                </f:entry>\n                            </table>\n                        </f:repeatable>\n                    </f:entry>\n\t\t    <f:entry title=\"${%Copy provisioning profile}\"\n                        description=\"${%When the provisioning profile is specified in 'Provisioning profile UUID', copy the specified file to a predetermined place.}\"\n                        field=\"copyProvisioningProfile\"\n                        help=\"/plugin/xcode-plugin/help/help-copyProvisioningProfile.html\" >\n                        <f:checkbox title=\"${%Yes}\" field=\"copyProvisioningProfile\" checked=\"${instance.copyProvisioningProfile}\" default=\"true\" />\n                    </f:entry>\n                </f:radioBlock>\n            </f:entry>\n\n            <f:entry>\n                <f:optionalBlock inline=\"true\" checked=\"${instance.unlockKeychain == true}\" field=\"unlockKeychain\" title=\"${%Unlock Keychain?}\" help=\"/plugin/xcode-plugin/help/help-unlockKeychain.html\">\n\t\t    <j:set var=\"UUID\" value=\"${descriptor.UUID}\" />\n                    <f:entry title=\"${%Keychain}\" description=\"${%The globally configured keychain to unlock for this build.}\" field=\"globalKeychainName\" help=\"/plugin/xcode-plugin/help/help-globalKeychainName.html\">\n                        <select class=\"setting-input\" name=\"keychainName\" foo=\"${UID}\" id=\"global-keychain-select-${UUID}\" onchange=\"showOrHideAttributeInput('global-keychain-select-', '${UUID}')\">\n                            <f:option selected=\"${instance.keychainName==null}\" value=\"\">${%none} (${%specify one below})</f:option>\n\n                            <j:forEach var=\"keychain\" items=\"${descriptor.globalConfiguration.keychains}\">\n                                <j:if test=\"${keychain.keychainName==instance.keychainName}\">\n                                    <j:set var=\"displayCustomKeychainData\" value=\"none\" scope=\"parent\" />\n                                </j:if>\n\n                                <f:option selected=\"${keychain.keychainName==instance.keychainName}\">${keychain.keychainName}</f:option>\n                            </j:forEach>\n                        </select>\n                    </f:entry>\n\n                    <f:nested>\n                        <j:if test=\"${displayCustomKeychainData==null}\">\n                            <j:set var=\"displayCustomKeychainData\" value=\"block\" />\n                        </j:if>\n\n                        <table id=\"${UUID}\" style=\"display: ${displayCustomKeychainData}\">\n                            <f:entry title=\"${%Keychain path}\" field=\"keychainPath\" description=\"${%The path of the keychain to use to sign the IPA.}\">\n                                <f:textbox />\n                            </f:entry>\n\n                            <f:entry title=\"${%Keychain password}\" field=\"keychainPwd\" description=\"${%The password to use to unlock the keychain.}\">\n                                <f:password />\n                            </f:entry>\n                        </table>\n                    </f:nested>\n                </f:optionalBlock>\n            </f:entry>\n\n        </f:advanced>\n    </f:section>\n\n    <!-- Advanced project options -->\n    <f:section title=\"${%Advanced Xcode project options}\">\n        <f:advanced title=\"${%Advanced project settings}\">\n            <f:entry title=\"${%Xcode Schema File}\" field=\"xcodeSchema\" description=\"${%Needed if you want to compile for a specific schema instead of a target, or if you want to generate an archive or an IPA.}\" help=\"/plugin/xcode-plugin/help/help-xcodeSchema.html\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Xcode Workspace File}\" field=\"xcodeWorkspaceFile\" description=\"${%Only needed if you want to compile a workspace instead of a project.}\" help=\"/plugin/xcode-plugin/help/help-xcodeWorkspaceFile.html\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Xcode Project Directory}\" field=\"xcodeProjectPath\" description=\"${%Relative path within the workspace that contains the xcode project files.}\" help=\"/plugin/xcode-plugin/help/help-xcodeProjectPath.html\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Xcode Project File}\" field=\"xcodeProjectFile\" description=\"${%Only needed if there is more than one project file in the Xcode Project Directory}\" help=\"/plugin/xcode-plugin/help/help-xcodeProjectFile.html\">\n                <f:textbox />\n            </f:entry>\n\n        </f:advanced>\n\n    </f:section>\n\n</j:jelly>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/ExportIpa/config_ja.properties",
    "content": "Archive\\ directory=\\u30a2\\u30fc\\u30ab\\u30a4\\u30d6\\u306e\\u30c7\\u30a3\\u30ec\\u30af\\u30c8\\u30ea\nSpecify\\ the\\ location\\ of\\ the\\ path\\ to\\ read\\ the\\ Archive\\ for\\ exporting\\ the\\ IPA\\ file.=IPA\\u30d5\\u30a1\\u30a4\\u30eb\\u3092\\u30a8\\u30af\\u30b9\\u30dd\\u30fc\\u30c8\\u3059\\u308b\\u305f\\u3081\\u306eArchive\\u3092\\u8aad\\u307f\\u8fbc\\u3080\\u30d1\\u30b9\\u3092\\u6307\\u5b9a\\u3057\\u307e\\u3059\\u3002\nGeneral\\ export\\ settings=\\u4e00\\u822c\\u7684\\u306a\\u30a8\\u30af\\u30b9\\u30dd\\u30fc\\u30c8\\u8a2d\\u5b9a\nXcode\\ Tools\\ Version=Xcode tools\\u306e\\u30d0\\u30fc\\u30b8\\u30e7\\u30f3\nSystem\\ Default=\\u30b7\\u30b9\\u30c6\\u30e0\\u306e\\u8a2d\\u5b9a\nExport\\ method=\\u30a8\\u30af\\u30b9\\u30dd\\u30fc\\u30c8\\u306e\\u65b9\\u6cd5\nThe\\ export\\ method\\ of\\ the\\ .app\\ to\\ generate\\ the\\ .ipa\\ file.\\ Should\\ be\\ one\\ in\\ 'development',\\ 'ad-hoc',\\ 'enterprise'\\ or\\ 'app-store'.=.app\\u304b\\u3089.ipa\\u3092\\u751f\\u6210\\u3059\\u308b\\u969b\\u306e\\u30a8\\u30af\\u30b9\\u30dd\\u30fc\\u30c8\\u65b9\\u6cd5\\u3092'development'\\u3001'ad-hoc'\\u3001'enterprise'\\u3001'app-store'\\u306e\\u3044\\u305a\\u308c\\u304b\\u3067\\u6307\\u5b9a\\u3057\\u307e\\u3059\\u3002\n.ipa\\ filename\\ pattern=.ipa\\u30d5\\u30a1\\u30a4\\u30eb\\u540d\\u306e\\u30d1\\u30bf\\u30fc\\u30f3\nA\\ pattern\\ for\\ the\\ ipa\\ file\\ name.\\ You\\ may\\ use=.ipa\\u30d5\\u30a1\\u30a4\\u30eb\\u540d\\u306e\\u30d1\\u30bf\\u30fc\\u30f3\nand=\\u305d\\u3057\\u3066\nin\\ this\\ string=\\u304c\\u4f7f\\u3048\\u307e\\u3059\\u3002\nOutput\\ directory=\\u51fa\\u529b\\u30c7\\u30a3\\u30ec\\u30af\\u30c8\\u30ea\nThe\\ output\\ directory\\ for\\ the\\ .ipa\\ file,\\ relative\\ to\\ the\\ build\\ directory.=.ipa\\u30d5\\u30a1\\u30a4\\u30eb\\u306e\\u51fa\\u529b\\u30c7\\u30a3\\u30ec\\u30af\\u30c8\\u30ea\\u3092\\u30d3\\u30eb\\u30c9\\u4f5c\\u696d\\u7528\\u30c7\\u30a3\\u30ec\\u30af\\u30c8\\u30ea(build)\\u304b\\u3089\\u306e\\u76f8\\u5bfe\\u30d1\\u30b9\\u3067\\u6307\\u5b9a\\u3057\\u307e\\u3059\\u3002\nManifest\\ Plist\\ URL=Manifest Plist\\u306eURL\nThe\\ base\\ URL\\ to\\ use\\ to\\ create\\ a\\ Manifest\\ Plist.\\ If\\ omitted\\ no\\ Manifest\\ Plist\\ will\\ be\\ generated=Manifest Plist\\u306b\\u5229\\u7528\\u3059\\u308bURL\\u3092\\u6307\\u5b9a\\u3057\\u307e\\u3059\\u3002Manifest Plist\\u304c\\u4e0d\\u8981\\u306a\\u3089\\u8a2d\\u5b9a\\u3057\\u307e\\u305b\\u3093\\u3002\nCode\\ signing\\ &\\ OS\\ X\\ keychain\\ options=\\u30b3\\u30fc\\u30c9\\u7f72\\u540d\\u3068\\u30ad\\u30fc\\u30c1\\u30a7\\u30fc\\u30f3\\u306e\\u30aa\\u30d7\\u30b7\\u30e7\\u30f3\nCode\\ signing\\ settings=\\u30b3\\u30fc\\u30c9\\u7f72\\u540d\\u306e\\u8a2d\\u5b9a\nAutomatic\\ Signing=\\u81ea\\u52d5\\u7f72\\u540d\nRead\\ from\\ Xcode\\ Project=\\u30d7\\u30ed\\u30b8\\u30a7\\u30af\\u30c8\\u306b\\u5f93\\u3046\nManual\\ signing=\\u624b\\u52d5\\u3067\\u8a2d\\u5b9a\nDevelopment\\ Team=\\u958b\\u767a\\u8005\\u30c1\\u30fc\\u30e0\nOverride\\ the\\ Development\\ Team\\ specified\\ in\\ the\\ project.=\\u30d7\\u30ed\\u30b8\\u30a7\\u30af\\u30c8\\u3067\\u6307\\u5b9a\\u3055\\u308c\\u3066\\u3044\\u308b\\u958b\\u767a\\u8005\\u30c1\\u30fc\\u30e0\\u3092\\u7121\\u8996\\u3057\\u3066\\u4e0a\\u66f8\\u304d\\u3057\\u307e\\u3059\\u3002\nnone=\\u672a\\u9078\\u629e\nspecify\\ one\\ below=\\u6b21\\u3067\\u6307\\u5b9a\nDevelopment\\ Team\\ ID=\\u958b\\u767a\\u8005\\u30c1\\u30fc\\u30e0\nThe\\ ID\\ of\\ the\\ Apple\\ development\\ team\\ to\\ use\\ to\\ sign\\ the\\ IPA.=.ipa\\u306b\\u30b3\\u30fc\\u30c9\\u7f72\\u540d\\u3059\\u308b\\u306e\\u306b\\u4f7f\\u3046\\u958b\\u767a\\u8005\\u30c1\\u30fc\\u30e0ID\\u3067\\u3059\\u3002\nProvisioning\\ Profiles=\\u30d7\\u30ed\\u30d3\\u30b8\\u30e7\\u30cb\\u30f3\\u30b0\\u30d7\\u30ed\\u30d5\\u30a1\\u30a4\\u30eb\nSet\\ a\\ combination\\ of\\ 'Bundle\\ ID'\\ and\\ 'UUID\\ or\\ Specifire'\\ of\\ 'provisioning\\ profiles'\\ used\\ when\\ exporting\\ .ipa\\ files.=ipa\\u30d5\\u30a1\\u30a4\\u30eb\\u3092\\u30a8\\u30af\\u30b9\\u30dd\\u30fc\\u30c8\\u3059\\u308b\\u969b\\u306b\\u5229\\u7528\\u3059\\u308bBundle ID\\u3068\\u30d7\\u30ed\\u30d3\\u30b8\\u30e7\\u30cb\\u30f3\\u30b0\\u30d7\\u30ed\\u30d5\\u30a1\\u30a4\\u30ebUUID\\u307e\\u305f\\u306f\\u8b58\\u5225\\u5b50\\u306e\\u7d44\\u307f\\u5408\\u308f\\u305b\\u3092\\u8a2d\\u5b9a\\u3057\\u307e\\u3059\\u3002\nBundle\\ ID=\nThe\\ bundle\\ identifier=Bundle ID\nfor\\ this\\ provisioning\\ profile=\\u3053\\u306e\\u30d7\\u30ed\\u30d3\\u30b8\\u30e7\\u30cb\\u30f3\\u30b0\\u30d7\\u30ed\\u30d5\\u30a1\\u30a4\\u30eb\\u3068\\u7d44\\u307f\\u3068\\u306a\\u308b\\u30a2\\u30d7\\u30ea\\u3092\\u8b58\\u5225\\u3057\\u307e\\u3059\\u3002\nProvisioning\\ profile\\ UUID=\\u30d7\\u30ed\\u30d3\\u30b8\\u30e7\\u30cb\\u30f3\\u30b0\\u30d7\\u30ed\\u30d5\\u30a1\\u30a4\\u30eb\nThe\\ UUID\\ or\\ Specifire\\ of\\ the\\ provisioning\\ profile\\ associated\\ to\\ this\\ bundle\\ identifier.=Bundle ID\\u3068\\u7d44\\u307f\\u306b\\u306a\\u308b\\u30d7\\u30ed\\u30d3\\u30b8\\u30e7\\u30cb\\u30f3\\u30b0\\u30d7\\u30ed\\u30d5\\u30a1\\u30a4\\u30eb\\u306eUUID\\u307e\\u305f\\u306f\\u8b58\\u5225\\u5b50\\u3002\nUnlock\\ Keychain?=\\u30ad\\u30fc\\u30c1\\u30a7\\u30fc\\u30f3\\u3092\\u30a2\\u30f3\\u30ed\\u30c3\\u30af\nKeychain=\\u30ad\\u30fc\\u30c1\\u30a7\\u30fc\\u30f3\nThe\\ globally\\ configured\\ keychain\\ to\\ unlock\\ for\\ this\\ build.=\\u3053\\u306e\\u30d3\\u30eb\\u30c9\\u3067\\u4f7f\\u3046\\u305f\\u3081\\u306b\\u30ed\\u30c3\\u30af\\u3092\\u89e3\\u9664\\u3059\\u308b\\u30b0\\u30ed\\u30fc\\u30d0\\u30eb\\u8a2d\\u5b9a\\u3055\\u308c\\u305f\\u30ad\\u30fc\\u30c1\\u30a7\\u30fc\\u30f3\\u3002\nKeychain\\ path=\\u30ad\\u30fc\\u30c1\\u30a7\\u30fc\\u30f3\\u306e\\u30d1\\u30b9\nThe\\ path\\ of\\ the\\ keychain\\ to\\ use\\ to\\ sign\\ the\\ IPA.=.ipa\\u306b\\u30b3\\u30fc\\u30c9\\u7f72\\u540d\\u3092\\u884c\\u306a\\u3046\\u306e\\u306b\\u4f7f\\u7528\\u3059\\u308b\\u30ad\\u30fc\\u30c1\\u30a7\\u30fc\\u30f3\\u306e\\u30d1\\u30b9\\u3002\nKeychain\\ password=\\u30ad\\u30fc\\u30c1\\u30a7\\u30fc\\u30f3\\u306e\\u30d1\\u30b9\\u30ef\\u30fc\\u30c9\nThe\\ password\\ to\\ use\\ to\\ unlock\\ the\\ keychain.=\\u30ad\\u30fc\\u30c1\\u30a7\\u30fc\\u30f3\\u306e\\u30ed\\u30c3\\u30af\\u3092\\u89e3\\u9664\\u3059\\u308b\\u305f\\u3081\\u306e\\u30d1\\u30b9\\u30ef\\u30fc\\u30c9\\u3002\nAdvanced\\ Xcode\\ project\\ options=Xcode\\u306e\\u4e0a\\u7d1a\\u30aa\\u30d7\\u30b7\\u30e7\\u30f3\nAdvanced\\ project\\ settings=\\u4e0a\\u7d1a\\u30d7\\u30ed\\u30b8\\u30a7\\u30af\\u30c8\\u8a2d\\u5b9a\nXcode\\ Schema\\ File=Xcode Schema\\u30d5\\u30a1\\u30a4\\u30eb\nNeeded\\ if\\ you\\ want\\ to\\ compile\\ for\\ a\\ specific\\ schema\\ instead\\ of\\ a\\ target,\\ or\\ if\\ you\\ want\\ to\\ generate\\ an\\ archive\\ or\\ an\\ IPA.=\\u30bf\\u30fc\\u30b2\\u30c3\\u30c8\\u3067\\u306f\\u306a\\u304f\\u7279\\u5b9a\\u306e\\u30b9\\u30ad\\u30fc\\u30de\\u7528\\u306b\\u30b3\\u30f3\\u30d1\\u30a4\\u30eb\\u3059\\u308b\\u5834\\u5408\\u3001\\u307e\\u305f\\u306f\\u30a2\\u30fc\\u30ab\\u30a4\\u30d6\\u307e\\u305f\\u306f.ipa\\u3092\\u751f\\u6210\\u3059\\u308b\\u5834\\u5408\\u306b\\u5fc5\\u8981\\u3067\\u3059\\u3002\nXcode\\ Workspace\\ File=Xcode Workspace\\u30d5\\u30a1\\u30a4\\u30eb\nOnly\\ needed\\ if\\ you\\ want\\ to\\ compile\\ a\\ workspace\\ instead\\ of\\ a\\ project.=\\u30d7\\u30ed\\u30b8\\u30a7\\u30af\\u30c8\\u306e\\u4ee3\\u308f\\u308a\\u306b\\u30ef\\u30fc\\u30af\\u30b9\\u30da\\u30fc\\u30b9\\u3092\\u30b3\\u30f3\\u30d1\\u30a4\\u30eb\\u3059\\u308b\\u5834\\u5408\\u306b\\u306e\\u307f\\u5fc5\\u8981\\u3067\\u3059\\u3002\nXcode\\ Project\\ Directory=Xcode\\u30d7\\u30ed\\u30b8\\u30a7\\u30af\\u30c8\\u306e\\u30c7\\u30a3\\u30ec\\u30af\\u30c8\\u30ea\nRelative\\ path\\ within\\ the\\ workspace\\ that\\ contains\\ the\\ xcode\\ project\\ files.=xcode\\u30d7\\u30ed\\u30b8\\u30a7\\u30af\\u30c8\\u30d5\\u30a1\\u30a4\\u30eb\\u3092\\u542b\\u3080\\u30ef\\u30fc\\u30af\\u30b9\\u30da\\u30fc\\u30b9\\u5185\\u306e\\u76f8\\u5bfe\\u30d1\\u30b9\\u3002\nXcode\\ Project\\ File=Xcode Project\\u30d5\\u30a1\\u30a4\\u30eb\nOnly\\ needed\\ if\\ there\\ is\\ more\\ than\\ one\\ project\\ file\\ in\\ the\\ Xcode\\ Project\\ Directory=Xcode\\u30d7\\u30ed\\u30b8\\u30a7\\u30af\\u30c8\\u30c7\\u30a3\\u30ec\\u30af\\u30c8\\u30ea\\u306b\\u8907\\u6570\\u306e\\u30d7\\u30ed\\u30b8\\u30a7\\u30af\\u30c8\\u30d5\\u30a1\\u30a4\\u30eb\\u304c\\u3042\\u308b\\u5834\\u5408\\u306b\\u306e\\u307f\\u5fc5\\u8981\\u3067\\u3059\nXcode\\ Tools\\ version.=Xcode tools\\u306e\\u30d0\\u30fc\\u30b8\\u30e7\\u30f3\nif\\ you\\ need\\ to\\ override\\ System\\ Default=\\u30b7\\u30b9\\u30c6\\u30e0\\u306e\\u8a2d\\u5b9a\\u3092\\u5909\\u66f4\\u3057\\u305f\\u3044\\u5834\\u5408\nManual\\ signing?=\\u624b\\u52d5\\u3067\\u30b3\\u30fc\\u30c9\\u7f72\\u540d\\u3092\\u884c\\u306a\\u3046\nUpload\\ Bitcode?=Bitcode\\u3092\\u30a2\\u30c3\\u30d7\\u30ed\\u30fc\\u30c9\nIf\\ checked,\\ include\\ Bitcode\\ when\\ exporting\\ applications\\ to\\ IPA.=\\u30c1\\u30a7\\u30c3\\u30af\\u3055\\u308c\\u3066\\u3044\\u308b\\u306a\\u3089\\u3001\\u51fa\\u529b\\u3059\\u308bIPA\\u30d5\\u30a1\\u30a4\\u30eb\\u306bBotcode\\u3092\\u542b\\u3081\\u307e\\u3059\\u3002\nUpload\\ Symbols?=\\u30b7\\u30f3\\u30dc\\u30eb\\u3092\\u30a2\\u30c3\\u30d7\\u30ed\\u30fc\\u30c9\nIf\\ checked,\\ include\\ symbols\\ when\\ exporting\\ applications\\ to\\ IPA.=\\u30c1\\u30a7\\u30c3\\u30af\\u3055\\u308c\\u3066\\u3044\\u308b\\u306a\\u3089\\u3001\\u51fa\\u529b\\u3059\\u308bIPA\\u30d5\\u30a1\\u30a4\\u30eb\\u306b\\u30b7\\u30f3\\u30dc\\u30eb\\u3092\\u542b\\u3081\\u307e\\u3059\\u3002\nCompile\\ Bitcode?=Bitcode\\u3092\\u30b3\\u30f3\\u30d1\\u30a4\\u30eb\nIf\\ checked,\\ recompile\\ from\\ Bitcode\\ when\\ exporting\\ the\\ application\\ to\\ IPA.=\\u30c1\\u30a7\\u30c3\\u30af\\u3055\\u308c\\u3066\\u3044\\u308b\\u306a\\u3089\\u3001\\u30a2\\u30d7\\u30ea\\u30b1\\u30fc\\u30b7\\u30e7\\u30f3\\u3092IPA\\u306b\\u30a8\\u30af\\u30b9\\u30dd\\u30fc\\u30c8\\u3059\\u308b\\u969b\\u306bBitcode\\u304b\\u3089\\u518d\\u30b3\\u30f3\\u30d1\\u30a4\\u30eb\\u3057\\u307e\\u3059\\u3002\nThinning=\\u6700\\u9069\\u5316\nWhen\\ doing\\ Thinning,\\ specify\\ the\\ target\\ device\\ for\\ thinning.=\\u6700\\u9069\\u5316\\u3092\\u884c\\u306a\\u3044\\u305f\\u3044\\u5834\\u5408\\u306b\\u306f\\u3001\\u5bfe\\u8c61\\u3068\\u306a\\u308b\\u30c7\\u30d0\\u30a4\\u30b9\\u3092\\u6307\\u5b9a\\u3057\\u307e\\u3059\\u3002\nDisplay\\ image\\ URL=\\u8868\\u793a\\u3059\\u308b\\u30a4\\u30e1\\u30fc\\u30b8\\u306eURL\nSpecify\\ the\\ URL\\ of\\ the\\ 57\\ pixel\\ size\\ png\\ image\\ to\\ be\\ displayed\\ in\\ the\\ IPA\\ installation.=IPA\\u306e\\u30a4\\u30f3\\u30b9\\u30c8\\u30fc\\u30eb\\u3067\\u8868\\u793a\\u3059\\u308b57\\u30d4\\u30af\\u30bb\\u30eb\\u30b5\\u30a4\\u30ba\\u306epng\\u30a4\\u30e1\\u30fc\\u30b8\\u306eURL\\u3092\\u6307\\u5b9a\\u3057\\u307e\\u3059\\u3002\nFull\\ size\\ image\\ URL=\\u30d5\\u30eb\\u30b5\\u30a4\\u30ba\\u30a4\\u30e1\\u30fc\\u30b8\\u306eURL\nSpecify\\ the\\ URL\\ of\\ the\\ 512\\ pixel\\ size\\ png\\ image\\ to\\ be\\ displayed\\ in\\ the\\ IPA\\ installation.=IPA\\u306e\\u30a4\\u30f3\\u30b9\\u30c8\\u30fc\\u30eb\\u3067\\u8868\\u793a\\u3059\\u308b512\\u30d4\\u30af\\u30bb\\u30eb\\u30b5\\u30a4\\u30ba\\u306epng\\u30a4\\u30e1\\u30fc\\u30b8\\u306eURL\\u3092\\u6307\\u5b9a\\u3057\\u307e\\u3059\\u3002\nPack\\ on\\ demand\\ resources?=\\u30aa\\u30f3\\u30c7\\u30de\\u30f3\\u30c9\\u30ea\\u30bd\\u30fc\\u30b9\\u3092\\u542b\\u3081\\u308b\nIf\\ checked,\\ include\\ on\\ demand\\ resource\\ assets\\ to\\ the\\ bundle.=\\u30c1\\u30a7\\u30c3\\u30af\\u3055\\u308c\\u3066\\u3044\\u308b\\u306a\\u3089\\u3001\\u30aa\\u30f3\\u30c7\\u30de\\u30f3\\u30c9\\u30ea\\u30bd\\u30fc\\u30b9\\u30a2\\u30bb\\u30c3\\u30c8\\u3092\\u30d0\\u30f3\\u30c9\\u30eb\\u306b\\u542b\\u3081\\u307e\\u3059\\u3002\nOn\\ demand\\ resources\\ asset\\ URL=\\u30aa\\u30f3\\u30c7\\u30de\\u30f3\\u30c9\\u30ea\\u30bd\\u30fc\\u30b9\\u306eURL\nSet\\ the\\ base\\ URL\\ for\\ downloading\\ resource\\ assets\\ when\\ the\\ resource\\ asset\\ is\\ not\\ included\\ in\\ the\\ bundle\\ in\\ the\\ application\\ using\\ the\\ on\\ demand\\ resource.=\\u30aa\\u30f3\\u30c7\\u30de\\u30f3\\u30c9\\u30ea\\u30bd\\u30fc\\u30b9\\u3092\\u4f7f\\u7528\\u3057\\u3066\\u3044\\u3066\\u3001\\u30a2\\u30d7\\u30ea\\u30b1\\u30fc\\u30b7\\u30e7\\u30f3\\u5185\\u306e\\u30d0\\u30f3\\u30c9\\u30eb\\u306b\\u30ea\\u30bd\\u30fc\\u30b9\\u30a2\\u30bb\\u30c3\\u30c8\\u304c\\u542b\\u307e\\u308c\\u3066\\u3044\\u306a\\u3044\\u5834\\u5408\\u3001\\u30ea\\u30bd\\u30fc\\u30b9\\u30a2\\u30bb\\u30c3\\u30c8\\u3092\\u30c0\\u30a6\\u30f3\\u30ed\\u30fc\\u30c9\\u3059\\u308b\\u305f\\u3081\\u306e\\u30d9\\u30fc\\u30b9URL\\u3092\\u8a2d\\u5b9a\\u3057\\u307e\\u3059\\u3002\nApplication\\ URL=\\u30a2\\u30d7\\u30ea\\u30b1\\u30fc\\u30b7\\u30e7\\u30f3\\u306eURL\nAsset\\ pack\\ URL=\\u30a2\\u30bb\\u30c3\\u30c8\\u30d1\\u30c3\\u30af\\u306eURL\nSpecify\\ the\\ base\\ URL\\ of\\ the\\ downloading\\ asset\\ pack.=\\u30a2\\u30bb\\u30c3\\u30c8\\u30d1\\u30c3\\u30af\\u3092\\u30c0\\u30a6\\u30f3\\u30ed\\u30fc\\u30c9\\u3059\\u308b\\u305f\\u3081\\u306e\\u30d9\\u30fc\\u30b9URL\nSettings=\\u8a2d\\u5b9a\nYes=\\u306f\\u3044\nStrip\\ Swift\\ Symbols?=Swift\\u306e\\u30b7\\u30f3\\u30dc\\u30eb\\u3092\\u524a\\u9664\nIf\\ checked,\\ symbols\\ be\\ stripped\\ from\\ Swift\\ libraries\\ when\\ exporting\\ the\\ application\\ to\\ IPA.=\\u30c1\\u30a7\\u30c3\\u30af\\u3055\\u308c\\u3066\\u3044\\u308b\\u306a\\u3089\\u3001\\u30a2\\u30d7\\u30ea\\u30b1\\u30fc\\u30b7\\u30e7\\u30f3\\u3092IPA\\u306b\\u30a8\\u30af\\u30b9\\u30dd\\u30fc\\u30c8\\u3059\\u308b\\u969b\\u306bIPA\\u304b\\u3089Swift\\u306e\\u30b7\\u30f3\\u30dc\\u30eb\\u3092\\u524a\\u9664\\u3057\\u307e\\u3059\\u3002\nCopy\\ provisioning\\ profile=\\u30d7\\u30ed\\u30d3\\u30b8\\u30e7\\u30cb\\u30f3\\u30b0\\u30d7\\u30ed\\u30d5\\u30a1\\u30a4\\u30eb\\u3092\\u30b3\\u30d4\\u30fc\\u3059\\u308b\nWhen\\ the\\ provisioning\\ profile\\ is\\ specified\\ in\\ 'Provisioning\\ profile\\ UUID',\\ copy\\ the\\ specified\\ file\\ to\\ a\\ predetermined\\ place.=\\u30d7\\u30ed\\u30d3\\u30b8\\u30e7\\u30cb\\u30f3\\u30b0\\u30d7\\u30ed\\u30d5\\u30a1\\u30a4\\u30eb\\u304c\\u300c\\u30d7\\u30ed\\u30d3\\u30b8\\u30e7\\u30cb\\u30f3\\u30b0\\u30d7\\u30ed\\u30d5\\u30a1\\u30a4\\u30ebUUID\\u300d\\u306b\\u6307\\u5b9a\\u3055\\u308c\\u3066\\u3044\\u308b\\u5834\\u5408\\u3001\\u6307\\u5b9a\\u3055\\u308c\\u305f\\u30d5\\u30a1\\u30a4\\u30eb\\u304c\\u6240\\u5b9a\\u306e\\u5834\\u6240\\u306b\\u30b3\\u30d4\\u30fc\\u3055\\u308c\\u307e\\u3059\\u3002\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/ExportIpa/help-archiveDir.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>Specify the location of the path (usually BUILD_DIR specified by xcodebuild) to read the Archive for exporting the IPA file.\n        <br/>\n        Supports all macros and also environment and\n        <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">build variables</a> from\n        the <a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token Macro Plugin</a>.<br/>\n        For example you can use the value :<br/>\n    </p>\n    <pre>${WORKSPACE}/build</pre>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/ExportIpa/help-archiveDir_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>IPAファイルをエクスポートするためのArchiveを読み込むパス(通常はxcodebuildで指定したBUILD_DIR)の場所を指定します。\n        <br/>\n    <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">ビルド変数</a>に\n説明されている全ての環境変数と<a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token Macro Plugin</a>で説明されている全てのマクロ>を使うことができます。<br/>\n    例えば次のような値を使用できます:<br/>\n    </p>\n    <pre>${WORKSPACE}/build</pre>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/GlobalConfigurationImpl/config.jelly",
    "content": "<?jelly escape-by-default='true'?>\n<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l=\"/lib/layout\" xmlns:t=\"/lib/hudson\" xmlns:f=\"/lib/form\">\n  <f:section title=\"${%Xcode Builder}\">\n    <f:entry title=\"${%xcodebuild executable path}\" field=\"xcodebuildPath\">\n      <f:textbox default=\"/usr/bin/xcodebuild\"/>\n    </f:entry>\n    <f:entry title=\"${%agvtool executable path}\" field=\"agvtoolPath\">\n      <f:textbox default=\"/usr/bin/agvtool\"/>\n    </f:entry>\n    <f:entry title=\"${%xcrun executable path}\" field=\"xcrunPath\">\n      <f:textbox default=\"/usr/bin/xcrun\"/>\n    </f:entry>\n\n    <f:entry title=\"${%Apple Development Teams}\" description=\"${%Saved development team configurations}\">\n      <f:repeatable var=\"team\" items=\"${descriptor.teams}\">\n        <table width=\"100%\">\n          <f:entry title=\"${%Team Name}\"\n                   description=\"${%An assigned name for identifying this Apple development team within Jenkins.}\"\n                   field=\"teamName\">\n            <f:textbox name=\"team.teamName\" value=\"${team.teamName}\" />\n          </f:entry>\n          <f:entry title=\"${%Development Team ID}\"\n                   description=\"${%The ID of the Apple development team to use to sign the IPA.}\"\n                   field=\"teamID\">\n            <f:textbox name=\"team.teamID\" value=\"${team.teamID}\" />\n          </f:entry>\n          <f:entry title=\"\">\n            <div align=\"right\">\n              <f:repeatableDeleteButton />\n            </div>\n          </f:entry>\n        </table>\n      </f:repeatable>\n    </f:entry>\n\n    <f:entry title=\"${%Keychains}\" description=\"${%Saved keychain configurations}\">\n      <j:if test=\"${descriptor.keychains.size()>0}\">\n        <div class=\"alert alert-warning\">\n          ${%Although there is keychain information in 'Configure System', this is a deprecated method.}\n          ${%From now on, please move keychain information to 'Credentials' instead of 'Configure System' and use it.}\n        </div>\n      </j:if>\n      <f:repeatable var=\"keychain\" items=\"${descriptor.keychains}\">\n        <table width=\"100%\">\n          <f:entry title=\"${%Keychain Name}\"\n                   description=\"${%An assigned name for identifying this keychain within Jenkins.}\"\n                   field=\"keychainName\">\n            <f:textbox name=\"keychain.keychainName\" value=\"${keychain.keychainName}\" />\n          </f:entry>\n          <f:entry title=\"${%Keychain path}\"\n                   description=\"${%The path of the keychain to use to sign the IPA.}\"\n                   field=\"keychainPath\">\n            <f:textbox name=\"keychain.keychainPath\" value=\"${keychain.keychainPath}\"\n                       default=\"$${HOME}/Library/Keychains/login.keychain\"/>\n          </f:entry>\n          <f:entry title=\"${%Keychain password}\"\n                   description=\"${%The password to use to unlock the keychain.}\"\n                   field=\"keychainPwd\">\n          <f:password name=\"keychain.keychainPassword\" value=\"${keychain.keychainPassword}\" />\n          </f:entry>\n          <f:entry title=\"${%Add to keychain search path after build}\"\n                   description=\"${%The keychain will be added to the keychain search path. This means it shows up in Keychain Access.app}\"\n                   field=\"inSearchPath\">\n\t\t    <select name=\"keychain.inSearchPath\">\n\t\t    \t<f:option selected=\"${keychain.isInSearchPath()}\" value=\"true\">${%Yes}</f:option>\n\t\t    \t<f:option selected=\"${keychain.isInSearchPath() == false}\" value=\"false\">${%No}</f:option>\n\t\t    </select>\n<!--             <f:checkbox name=\"keychain.inSearchPath\" title=\"${%Yes}\" checked=\"${keychain.isInSearchPath()}\" default=\"false\" /> -->\n          </f:entry>\n          <f:entry title=\"\">\n            <div align=\"right\">\n              <f:repeatableDeleteButton />\n            </div>\n          </f:entry>\n        </table>\n      </f:repeatable>\n    </f:entry>\n   \n    <!-- Useless method that doesn't make sense.\n    <j:if test=\"${descriptor.keychains.size()>0}\">\n        <f:entry title=\"${%Default keychain}\"\n                 description=\"${%This will be the system default keychain}\"\n                 field=\"defaultKeychain\">\n            <f:textbox />\n        </f:entry>\n    </j:if>\n    -->\n\n  </f:section>\n</j:jelly>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/GlobalConfigurationImpl/config_ja.properties",
    "content": "Xcode\\ Builder=Xcode\\u30D3\\u30EB\\u30C9\nxcodebuild\\ executable\\ path=xcodebuild\\u5B9F\\u884C\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u30D1\\u30B9\nagvtool\\ executable\\ path=agvtool\\u5B9F\\u884C\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u30D1\\u30B9\nxcrun\\ executable\\ path=xcrun\\u5B9F\\u884C\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u30D1\\u30B9\nApple\\ Development\\ Teams=Apple\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0\nTeam\\ Name=\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0\\u540D\nDevelopment\\ Team\\ ID=\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0ID\nKeychains=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\nKeychain\\ Name=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u540D\nKeychain\\ path=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nKeychain\\ password=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nAdd\\ to\\ keychain\\ search\\ path\\ after\\ build=\\u30D3\\u30EB\\u30C9\\u5F8C\\u306B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30B5\\u30FC\\u30C1\\u30D1\\u30B9\\u306B\\u8FFD\\u52A0\nYes=\\u306F\\u3044\nNo=\\u3044\\u3044\\u3048\nDefault\\ keychain=\\u30C7\\u30D5\\u30A9\\u30EB\\u30C8\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\nSaved\\ development\\ team\\ configurations=\\u4FDD\\u5B58\\u3055\\u308C\\u305F\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0\\u306E\\u8A2D\\u5B9A\nAn\\ assigned\\ name\\ for\\ identifying\\ this\\ Apple\\ development\\ team\\ within\\ Jenkins.=Jenkins\\u3067\\u3053\\u306E\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0\\u3092\\u8B58\\u5225\\u3059\\u308B\\u305F\\u3081\\u306E\\u540D\\u524D\nThe\\ ID\\ of\\ the\\ Apple\\ development\\ team\\ to\\ use\\ to\\ sign\\ the\\ IPA.=.ipa\\u30D5\\u30A1\\u30A4\\u30EB\\u306B\\u7F72\\u540D\\u3092\\u3059\\u308B\\u305F\\u3081\\u306B\\u4F7F\\u3046Apple\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0\\u306EID\nSaved\\ keychain\\ configurations=\\u4FDD\\u5B58\\u3055\\u308C\\u305F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u8A2D\\u5B9A\nAn\\ assigned\\ name\\ for\\ identifying\\ this\\ keychain\\ within\\ Jenkins.=Jenkins\\u3067\\u3053\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u8B58\\u5225\\u3059\\u308B\\u305F\\u3081\\u306E\\u540D\\u524D\nThe\\ path\\ of\\ the\\ keychain\\ to\\ use\\ to\\ sign\\ the\\ IPA.=.ipa\\u30D5\\u30A1\\u30A4\\u30EB\\u306B\\u7F72\\u540D\\u3092\\u3059\\u308B\\u305F\\u3081\\u306B\\u4F7F\\u3046\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nThe\\ password\\ to\\ use\\ to\\ unlock\\ the\\ keychain.=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\\u3059\\u308B\\u305F\\u3081\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nThe\\ keychain\\ will\\ be\\ added\\ to\\ the\\ keychain\\ search\\ path.\\ This\\ means\\ it\\ shows\\ up\\ in\\ Keychain\\ Access.app=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u30B5\\u30FC\\u30C1\\u30D1\\u30B9\\u306B\\u8FFD\\u52A0\\u3055\\u308C\\u307E\\u3059\\u3002\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306F\\u300C\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u30A2\\u30AF\\u30BB\\u30B9\\u300D\\u30A2\\u30D7\\u30EA\\u306B\\u8868\\u793A\\u3055\\u308C\\u308B\\u3088\\u3046\\u306B\\u306A\\u308A\\u307E\\u3059\nThis\\ will\\ be\\ the\\ system\\ default\\ keychain=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306F\\u30C7\\u30D5\\u30A9\\u30EB\\u30C8\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306B\\u306A\\u308A\\u307E\\u3059\nAlthough\\ there\\ is\\ keychain\\ information\\ in\\ 'Configure\\ System',\\ this\\ is\\ a\\ deprecated\\ method.=\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u306B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u60C5\\u5831\\u304C\\u5B58\\u5728\\u3057\\u307E\\u3059\\u304C\\u3001\\u73FE\\u5728\\u306F\\u3053\\u308C\\u306F\\u975E\\u63A8\\u5968\\u306E\\u65B9\\u6CD5\\u3067\\u3059\\u3002\nFrom\\ now\\ on,\\ please\\ move\\ keychain\\ information\\ to\\ 'Credentials'\\ instead\\ of\\ 'Configure\\ System'\\ and\\ use\\ it.=\\u4ECA\\u5F8C\\u306F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u60C5\\u5831\\u306F\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u3067\\u306F\\u306A\\u304F\\u300C\\u8A8D\\u8A3C\\u60C5\\u5831\\u300D\\u306B\\u8A2D\\u5B9A\\u3057\\u3066\\u3001\\u305D\\u308C\\u3092\\u5229\\u7528\\u3059\\u308B\\u3088\\u3046\\u306B\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044\\u3002\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathBinding/config-variables.jelly",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\nThe MIT License\n\nCopyright 2013 jglick.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n-->\n<?jelly escape-by-default='true'?>\n<j:jelly xmlns:j=\"jelly:core\" xmlns:f=\"/lib/form\" xmlns:st=\"jelly:stapler\" xmlns:c=\"/lib/credentials\">\n    <f:entry title=\"${%Keychain Path Variable}\" field=\"keychainPathVariable\">\n        <f:textbox/>\n    </f:entry>\n    <f:entry title=\"${%Keychain Password Variable}\" field=\"passwordVariable\">\n        <f:textbox/>\n    </f:entry>\n    <f:entry title=\"${%In Search Path Variable}\" field=\"inSearchPathVariable\">\n        <f:textbox/>\n    </f:entry>\n</j:jelly>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathBinding/config-variables_ja.properties",
    "content": "Keychain\\ Path\\ Variable=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u3092\\u4FDD\\u5B58\\u3059\\u308B\\u5909\\u6570\nKeychain\\ Password\\ Variable=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u3092\\u4FDD\\u5B58\\u3059\\u308B\\u5909\\u6570\nIn\\ Search\\ Path\\ Variable=\\u30D3\\u30EB\\u30C9\\u5F8C\\u306B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30B5\\u30FC\\u30C1\\u30D1\\u30B9\\u306B\\u8FFD\\u52A0\\u3059\\u308B\\u304B\\u306E\\u72B6\\u614B\\u3092\\u4FDD\\u5B58\\u3059\\u308B\\u5909\\u6570\n# \\u4EE5\\u4E0B\\u306F\\u89AA(Credential Binding Plugin)\\u306Ejelly\\u304C\\u6301\\u3063\\u3066\\u3044\\u308B\\u306E\\u3067\\u305D\\u3061\\u3089\\u306E\\u4FEE\\u6B63\\u304C\\u5FC5\\u8981\nSpecific\\ credentials=\\u8A8D\\u8A3C\\u60C5\\u5831\\u3092\\u6307\\u5B9A\nParameter\\ expression=\\u30D1\\u30E9\\u30E1\\u30FC\\u30BF\\u3092\\u8A55\\u4FA1"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathBinding/help-inSearchPathVariable.html",
    "content": "<div>\n    Name of a variable that stores information on whether to set the keychain stored in the 'Credentials' to the search path.<br />\n    Because values are stored in the environment variable of the name specified here, you can use the information stored in the 'Credentials' by shell script etc.\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathBinding/help-inSearchPathVariable_ja.html",
    "content": "<div>\n    認証情報に保存されているキーチェーンをサーチパスに設定するかどうかの情報を格納する変数の名前。<br />\n    ここで指定された名前の環境変数に値が格納されるのでシェルスクリプトなどで認証情報に保存されている情報を利用することができます。\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathBinding/help-keychainPathVariable.html",
    "content": "<div>\n    Name of a variable that contains information about the keychain path stored in the 'Credentials'.<br />\n    Because values are stored in the environment variable of the name specified here, you can use the information stored in the 'Credentials' by shell script etc.\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathBinding/help-keychainPathVariable_ja.html",
    "content": "<div>\n    認証情報に保存されているキーチェーンのパス情報を格納する変数の名前。<br />\n    ここで指定された名前の環境変数に値が格納されるのでシェルスクリプトなどで認証情報に保存されている情報を利用することができます。\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathBinding/help-passwordVariable.html",
    "content": "<div>\n    Name of a variable that contains information about the keychain password stored in the 'Credentials'.<br />\n    Because values are stored in the environment variable of the name specified here, you can use the information stored in the 'Credentials' by shell script etc.\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathBinding/help-passwordVariable_ja.html",
    "content": "<div>\n    認証情報に保存されているキーチェーンのパスワード情報を格納する変数の名前\n。<br />\n    ここで指定された名前の環境変数に値が格納されるのでシェルスクリプトなどで認証情報に保存されている情報を利用することができます。\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/credentials.jelly",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?jelly escape-by-default='true'?>\n<!--\n ~ The MIT License\n ~\n ~ Copyright (c) 2011-2012, CloudBees, Inc., Stephen Connolly.\n ~\n ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n ~ of this software and associated documentation files (the \"Software\"), to deal\n ~ in the Software without restriction, including without limitation the rights\n ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n ~ copies of the Software, and to permit persons to whom the Software is\n ~ furnished to do so, subject to the following conditions:\n ~\n ~ The above copyright notice and this permission notice shall be included in\n ~ all copies or substantial portions of the Software.\n ~\n ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n ~ THE SOFTWARE.\n -->\n\n<j:jelly xmlns:j=\"jelly:core\" xmlns:f=\"/lib/form\" xmlns:st=\"jelly:stapler\">\n  <st:include page=\"id-and-description\" class=\"${descriptor.clazz}\"/>\n\n  <f:entry title=\"${%Keychain path}\"\n   description=\"${%The path of the keychain to use to sign the IPA.}\"\n   field=\"keychainPath\">\n    <f:textbox/>\n  </f:entry>\n\n  <f:entry title=\"${%Keychain password}\"\n    description=\"${%The password to use to unlock the keychain.}\"\n    field=\"password\">\n    <f:password/>\n  </f:entry>\n\n  <f:entry title=\"${%Add to keychain search path after build}\"\n    description=\"${%The keychain will be added to the keychain search path. This means it shows up in Keychain Access.app}\"\n    field=\"inSearchPath\">\n    <select name=\"inSearchPath\">\n      <f:option selected=\"${instance.isInSearchPath()}\" value=\"true\">${%Yes}</f:option>\n      <f:option selected=\"${instance.isInSearchPath() == false}\" value=\"false\">${%No}</f:option>\n    </select>\n  </f:entry>\n</j:jelly>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/credentials_ja.properties",
    "content": "Saved\\ keychain\\ configurations=\\u4FDD\\u5B58\\u3055\\u308C\\u305F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u8A2D\\u5B9A\nAn\\ assigned\\ name\\ for\\ identifying\\ this\\ keychain\\ within\\ Jenkins.=Jenkins\\u3067\\u3053\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u8B58\\u5225\\u3059\\u308B\\u305F\\u3081\\u306E\\u540D\\u524D\nThe\\ path\\ of\\ the\\ keychain\\ to\\ use\\ to\\ sign\\ the\\ IPA.=.ipa\\u30D5\\u30A1\\u30A4\\u30EB\\u306B\\u7F72\\u540D\\u3092\\u3059\\u308B\\u305F\\u3081\\u306B\\u4F7F\\u3046\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nThe\\ password\\ to\\ use\\ to\\ unlock\\ the\\ keychain.=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\\u3059\\u308B\\u305F\\u3081\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nThe\\ keychain\\ will\\ be\\ added\\ to\\ the\\ keychain\\ search\\ path.\\ This\\ means\\ it\\ shows\\ up\\ in\\ Keychain\\ Access.app=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u30B5\\u30FC\\u30C1\\u30D1\\u30B9\\u306B\\u8FFD\\u52A0\\u3055\\u308C\\u307E\\u3059\\u3002\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306F\\u300C\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u30A2\\u30AF\\u30BB\\u30B9\\u300D\\u30A2\\u30D7\\u30EA\\u306B\\u8868\\u793A\\u3055\\u308C\\u308B\\u3088\\u3046\\u306B\\u306A\\u308A\\u307E\\u3059\nThis\\ will\\ be\\ the\\ system\\ default\\ keychain=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306F\\u30C7\\u30D5\\u30A9\\u30EB\\u30C8\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306B\\u306A\\u308A\\u307E\\u3059\nKeychains=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\nKeychain\\ Name=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u540D\nKeychain\\ path=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nKeychain\\ password=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nAdd\\ to\\ keychain\\ search\\ path\\ after\\ build=\\u30D3\\u30EB\\u30C9\\u5F8C\\u306B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30B5\\u30FC\\u30C1\\u30D1\\u30B9\\u306B\\u8FFD\\u52A0\nYes=\\u306F\\u3044\nNo=\\u3044\\u3044\\u3048\nDefault\\ keychain=\\u30C7\\u30D5\\u30A9\\u30EB\\u30C8\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/help-description.html",
    "content": "<div>\n    Any one-liner text to help you remember what this certificate is\n    among other certificates. Jenkins will use this text when it wants\n    you to select a certificate.\n</div>"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/help-description_ja.html",
    "content": "<div>\n    この証明書が何であるかを覚えておくための任意の一行のテキスト。\n    Jenkinsはこのテキストを使用して証明書を選択します。\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/help-id.html",
    "content": "<div>\n    An internal unique ID by which these credentials are identified from jobs and other configuration.\n    Normally left blank, in which case an ID will be generated, which is fine for jobs created using visual forms.\n    Useful to specify explicitly when using credentials from scripted configuration.\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/help-id_ja.html",
    "content": "<div>\n    この資格情報をジョブやその他の設定で識別するための内部固有IDです。<br />\n    この項目を空白のままにした場合にはIDが自動生成されます。これはGUIインターフェイスを使用して作成されたジョブに適しています。<br />\n    スクリプトなどで認証情報を使用するときには明示的に判りやすい文字列を設定した方が使い易いでしょう。\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/help-keychainPath.html",
    "content": "<div>\n    The path of the keychain to use to retrieve certificates to sign the package (example : ${HOME}/Library/Keychains/login.keychain)\n</div>"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/help-keychainPath_ja.html",
    "content": "<div>\n    パッケージに署名するための証明書を取得するキーチェーンのパス。 (例: ${HOME}/Library/Keychains/login.keychain)\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/help-password.html",
    "content": "<div>\n    The password of the keychain to use to retrieve certificates to sign the package.\n</div>"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainPasswordAndPathImpl/help-password_ja.html",
    "content": "<div>\n    パッケージに署名するための証明書を取得するキーチェーンのパスワード。\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainUnlockStep/config.jelly",
    "content": "<?jelly escape-by-default='true'?>\n<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l=\"/lib/layout\" xmlns:t=\"/lib/hudson\" xmlns:f=\"/lib/form\" xmlns:html=\"jelly:html\">\n    <![CDATA[\n\t\t<script type=\"text/javascript\">\n\t\t<!--\n\t\t\tvar showOrHideAttributeInput = function(prefix, uuid) {\n\t\t\t\tvar defaultChosen = (document.getElementById(prefix + uuid).selectedIndex == 0);\n\n\t\t\t\tdocument.getElementById(\"\" + uuid).style.display = defaultChosen ? \"block\" : \"none\";\n\t\t\t};\n\t\t-->\n\t\t</script>\n\t]]>\n\n    <!-- General build settings -->\n    <f:entry>\n        <j:if test=\"${instance.keychainName!=null}\">\n            <div class=\"alert alert-warning\">\n                ${%The 'Configure System' keychain information is used but this is a deprecated method.}\n                ${%From now on, please move keychain information to 'Credentials' instead of 'Configure System' and use it.}\n            </div>\n        </j:if>\n\t\t<j:set var=\"UUID\" value=\"${descriptor.UUID}\" />\n        <f:entry title=\"${%Keychain}\" description=\"${%The combination of path and password defined in 'Credentials' for unlocking the keychain used in this build.}\" field=\"credentialKeychainId\" help=\"/plugin/xcode-plugin/help/help-credentialKeychainId.html\">\n            <j:invokeStatic var=\"keychainPasswordAndPaths\" className=\"au.com.rayh.KeychainPasswordAndPathImpl\" method=\"getAllKeycainInfo\"/>\n            <select class=\"setting-input\" name=\"keychainId\" foo=\"${UID}\" id=\"credential-keychain-select-${UUID}\" onchange=\"showOrHideAttributeInput('credential-keychain-select-', '${UUID}')\">\n                <f:option selected=\"${instance.keychainId==null}\" value=\"\">${%none} (${%specify one below})</f:option>\n                <j:forEach var=\"keychain\" items=\"${keychainPasswordAndPaths}\">\n                    <j:if test=\"${keychain.getId()==instance.keychainId}\">\n                        <j:set var=\"displayCustomKeychainData\" value=\"none\" scope=\"parent\" />\n                    </j:if>\n                    <f:option selected=\"${keychain.getId()==instance.keychainId}\" value=\"${keychain.getId()}\">${keychain.getDescription()}</f:option>\n                </j:forEach>\n            </select>\n        </f:entry>\n\n        <f:nested>\n            <j:if test=\"${displayCustomKeychainData==null}\">\n                <j:set var=\"displayCustomKeychainData\" value=\"block\" />\n            </j:if>\n\n            <table id=\"${UUID}\" style=\"display: ${displayCustomKeychainData}\">\n                <f:entry title=\"${%Keychain path}\" field=\"keychainPath\" description=\"${%The path of the keychain to use to sign the IPA.}\">\n                    <f:textbox />\n                </f:entry>\n\n                <f:entry title=\"${%Keychain password}\" field=\"keychainPwd\" description=\"${%The password to use to unlock the keychain.}\">\n                    <f:password />\n                </f:entry>\n            </table>\n        </f:nested>\n    </f:entry>\n\n</j:jelly>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/KeychainUnlockStep/config_ja.properties",
    "content": "Developer\\ Profile=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\nImport\\ into\\ existing\\ Keychain=\\u65E2\\u5B58\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306B\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\nTarget\\ keychain=\\u5BFE\\u8C61\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\nnone\\ (specify\\ one\\ below)=\\u672A\\u9078\\u629E (\\u6B21\\u3067\\u6307\\u5B9A)\nKeychain\\ path=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nThe\\ path\\ of\\ the\\ keychain\\ to\\ use\\ to\\ sign\\ the\\ IPA.=.ipa\\u306B\\u30B3\\u30FC\\u30C9\\u7F72\\u540D\\u3092\\u884C\\u306A\\u3046\\u306E\\u306B\\u4F7F\\u7528\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nKeychain\\ password=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nThe\\ password\\ to\\ use\\ to\\ unlock\\ the\\ keychain.=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30ED\\u30C3\\u30AF\\u3092\\u89E3\\u9664\\u3059\\u308B\\u305F\\u3081\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nSpecify\\ the\\ developer\\ profile\\ to\\ import\\ into\\ the\\ keychain.=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306B\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u6307\\u5B9A\nnone=\\u672A\\u9078\\u629E\nspecify\\ one\\ below=\\u6B21\\u3067\\u6307\\u5B9A\nDeveloper\\ Profile\\ ID=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u306EID\nSpecify\\ the\\ ID\\ of\\ the\\ developer\\ profile\\ to\\ import\\ into\\ the\\ keychain.=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306B\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u306EID\\u3092\\u6307\\u5B9A\nThe\\ globally\\ configured\\ keychain\\ to\\ import\\ developer\\ profile.=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u305F\\u3081\\u306E\\u30B7\\u30B9\\u30C6\\u30E0\\u8A2D\\u5B9A\\u3067\\u8A2D\\u5B9A\\u3055\\u308C\\u305F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\nKeychain\\ path\\ to\\ import\\ developer\\ profile.=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u3092\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nPassword\\ to\\ unlock\\ keychain\\ importing\\ developer\\ profile.=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u3092\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\\u3059\\u308B\\u305F\\u3081\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nExport\\ keychain\\ info=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u60C5\\u5831\\u3092\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\nYes=\\u306F\\u3044\nSet\\ the\\ path\\ and\\ password\\ of\\ the\\ key\\ chain\\ that\\ imported\\ the\\ developer\\ profile\\ into\\ the\\ environment\\ variable.=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\\u3057\\u305F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u3068\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u3092\\u74B0\\u5883\\u5909\\u6570\\u306B\\u8A2D\\u5B9A\\u3057\\u307E\\u3059\\u3002\nThe\\ 'Configure\\ System'\\ keychain\\ information\\ is\\ used\\ but\\ this\\ is\\ a\\ deprecated\\ method.=\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u60C5\\u5831\\u304C\\u4F7F\\u308F\\u308C\\u3066\\u3044\\u307E\\u3059\\u304C\\u3001\\u73FE\\u5728\\u306F\\u3053\\u308C\\u306F\\u975E\\u63A8\\u5968\\u306E\\u65B9\\u6CD5\\u3067\\u3059\\u3002\nFrom\\ now\\ on,\\ please\\ move\\ keychain\\ information\\ to\\ 'Credentials'\\ instead\\ of\\ 'Configure\\ System'\\ and\\ use\\ it.=\\u4ECA\\u5F8C\\u306F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u60C5\\u5831\\u306F\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u3067\\u306F\\u306A\\u304F\\u300C\\u8A8D\\u8A3C\\u60C5\\u5831\\u300D\\u306B\\u8A2D\\u5B9A\\u3057\\u3066\\u3001\\u305D\\u308C\\u3092\\u5229\\u7528\\u3059\\u308B\\u3088\\u3046\\u306B\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044\\u3002\nThe\\ combination\\ of\\ path\\ and\\ password\\ defined\\ in\\ 'Credentials'\\ for\\ unlocking\\ the\\ keychain\\ used\\ in\\ this\\ build.=\\u3053\\u306E\\u30D3\\u30EB\\u30C9\\u3067\\u4F7F\\u7528\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\\u3059\\u308B\\u305F\\u3081\\u306E\\u300C\\u8A8D\\u8A3C\\u60C5\\u5831\\u300D\\u3067\\u5B9A\\u7FA9\\u3055\\u308C\\u305F\\u3001\\u30D1\\u30B9\\u3068\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u306E\\u7D44\\u307F\\u5408\\u308F\\u305B\\u3002"
  },
  {
    "path": "src/main/resources/au/com/rayh/Messages.properties",
    "content": "#\n# The MIT License\n#\n# Copyright (c) 2011 Ray Yamamoto Hilton\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n#\nXCodeBuilder.xcodebuildNotFound=Cannot find xcodebuild with the configured path {0}.\nXCodeBuilder.avgtoolNotFound=Cannot find agvtool with the configured path {0}.\nXCodeBuilder.buildDirMacroError=Failure while expanding macros and variables for buildDir. Error: {0}\nXCodeBuilder.symRootMacroError=Failure while expanding macros and variables for symRoot. Error: {0}\nXCodeBuilder.keychainNotConfigured=No global keychain or local keychain path/password was configured.\nXCodeBuilder.teamNotConfigured=No global development team or local team ID was configured, back to default automatic signing\nXCodeBuilder.unlockKeychainFailed=Unable to unlock the keychain.\nXCodeBuilder.xcrunNotFound=Cannot find xcrun with the configured path {0}.\nXCodeBuilder.cleaningBuildDir=Cleaning build directory: {0}\nXCodeBuilder.cleaningIPA=Cleaning up previously generated .ipa files\nXCodeBuilder.cleaningDSYM=Cleaning up previously generated .dSYM.zip files\nXCodeBuilder.cleaningTestReportsDir=Cleaning up test-reports : {0}\nXCodeBuilder.fetchingCFBundleShortVersionString=Fetching marketing version number (CFBundleShortVersionString) from project.\nXCodeBuilder.fetchingCFBundleVersion=Fetching technical version number (CFBundleVersion) from project.\nXCodeBuilder.invokeXcodebuild=Going to invoke xcodebuild:\nXCodeBuilder.packagingIPA=Packaging IPA\nXCodeBuilder.warningPackagingIPAForSimulatorSDK=WARNING: you are about to package an IPA but have selected a simulator SDK ({0}). The packaging will most probably fail. Check your configuration.\nXCodeBuilder.workingDir=Working directory is {0}.\nXCodeBuilder.xcode=Xcode\nXCodeBuilder.xcodeVersionNotFound=Check your Xcode installation. Jenkins cannot retrieve its version.\nXCodeBuilder.CFBundleShortVersionStringNotFound=No marketing version (CFBundleShortVersionString) found.\nXCodeBuilder.CFBundleShortVersionStringFound=Found marketing version (CFBundleShortVersionString): {0}\nXCodeBuilder.CFBundleShortVersionStringMacroError=Failure while expanding macros and variables for CFBundleShortVersionString. Error: {0}\nXCodeBuilder.CFBundleShortVersionStringUpdate=Updating marketing version (CFBundleShortVersionString) to: {0}\nXCodeBuilder.CFBundleShortVersionStringUpdateError=Could not set CFBundleShortVersionString to: {0}\nXCodeBuilder.CFBundleShortVersionStringUsed=Marketing version (CFBundleShortVersionString) used by Jenkins to produce the IPA: {0}\nXCodeBuilder.CFBundleShortVersionStringValue=Marketing version (CFBundleShortVersionString) found in project configuration: {0}\nXCodeBuilder.CFBundleVersionFound=Found technical version (CFBundleVersion): {0}\nXCodeBuilder.CFBundleVersionMacroError=Failure while expanding macros and variables for CFBundleVersion. Error: {0}\nXCodeBuilder.CFBundleVersionNotFound=No technical version found (CFBundleVersion)\nXCodeBuilder.CFBundleVersionUpdate=Updating technical version (CFBundleVersion) to: {0}\nXCodeBuilder.CFBundleVersionUpdateError=Could not set the CFBundleVersion to: {0}\nXCodeBuilder.CFBundleVersionUsed=Technical version (CFBundleVersion) used by Jenkins to produce the IPA: {0}\nXCodeBuilder.CFBundleVersionValue=Technical version (CFBundleVersion) found in project configuration: {0}.\nXCodeBuilder.NotExistingBuildDirectory=Build directory does not exist at {0}. Potential configuration issue.\nXCodeBuilder.NoArchivesInBuildDirectory=No xcarchive found under Build directory {0}. This could be a configuration or transcient error.\nXCodeBuilder.DebugInfoLineDelimiter=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\nXCodeBuilder.DebugInfoAvailableCertificates=\\=\\= Certificates available for the Codesign\nXCodeBuilder.DebugInfoCanFindCertificates=\\=\\= Can we find the requested developer certificate ?\nXCodeBuilder.DebugInfoAvailableSDKs=\\=\\= Available SDKs\nXCodeBuilder.DebugInfoAvailableSchemes=\\=\\= Available schemes\nXCodeBuilder.DebugInfoAvailableParameters=\\=\\= Available parameters\nXCodeBuilder.NoAvailableParameters=There are no available parameters or failed to parse the output of 'xcodebuild -help'.\nXCodeBuilder.agvtoolPathNotSet=Please specify the path to the agvtool executable (usually /usr/bin/agvtool)\nXCodeBuilder.xcodebuildPathNotSet=Please specify the path to the xcodebuild executable (usually /usr/bin/xcodebuild)\nXCodeBuilder.xcrunPathNotSet=Please specify the path to the xcrun executable (usually /usr/bin/xcrun)\nXCodeBuilder.zipFailed=Failed to zip *.dSYM into {0}-dSYM.zip\nXCodeBuilder.CFBundleIdentifierChanged=Changing CFBundleIdentifier from {0} to {1}\nXCodeBuilder.CFBundleIdentifierInfoPlistNotFound=No info.plist found: {0}\nXCodeBuilder.NoTargetsFoundInConfig=Unable to find any targets.\nXCodeBuilder.NoMatchingTargetsFound=No Targets found matching regular expression.\nXCodeBuilder.XcodeToolsDir=Xcode Tools directory is {0}.\nXCodeBuilder.FailedToGetVersionFromInfoPlist=Failed to get version from Info.plist: {0}\nXCodeBuilder.MarketingAndTechnicalVersionNotFound=You have to provide a value for either the marketing or technical version. Found neither.\nXCodeBuilder.PackagingArchiveToIpa=Packaging {0}.xcarchive => {1}\nXCodeBuilder.FailedToBuildIpa=Failed to build {0}\nXCodeBuilder.ArchivingDSYM=Archiving dSYM\nXCodeBuilder.NoDSYMFileFound=No dSYM file found in {0} !\nXCodeBuilder.CreatingManifestPlist=Creating Manifest Plist => {0}\nXCodeBuilder.NoAppFoundInBuildDirectory=No .app or .appex found in build directory ({0})\nXCodeBuilder.NeedSchema=When outputting archive or IPA, you need to specify a scheme.\nXCodeBuilder.AbortXcodeBuildFailed=xcodebuild failed. Check the logs for details\nXCodeBuilder.NeedOnDemandResourcesURL=If you do not include on demand resource assets in the bundle, you need a specify URL to download the resource pack.\nXCodeBuilder.CFBundleIdFailedGetInInfoPlist=Failed to read Bundle ID from ({0}): {1}\nXCodeBuilder.CFBundleIdReplaceWith=Bundle ID is replaced with: {0}\nXCodeBuilder.CFBundleIdFailedGetInMobileProvision=Failed to read Provisioning UUID from ({0}): {1}\nXCodeBuilder.ProfileUUIDReplaceWith=Provisioning UUID is replaced with: {0}\nXCodeBuilder.IpaExportMethodMuestBeOneOfTheFollowing=If buildIpa is checked, ipaExportMethod must be one of the following: {0}\nXCodeBuilder.BuildDirectory=buildDirectory: {0}\nXCodeBuilder.ReadSigningInfoFromProject=Read signing information from Xcode Project.\nXCodeBuilder.CouldNotReadInfoFrom=Could not read information from {0}\nXCodeBuilder.ReadInfoFromScheme=Read information from scheme {0}\nXCodeBuilder.CouldNotGetInfoFromScheme=Could not get information from scheme {0}\nXCodeBuilder.ReadProjectInfoFrom=Read project information from {0}\nXCodeBuilder.ReadInfoFromWorkspace=Read information from workspace {0}\nXCodeBuilder.UsingXcodeFileInfo=Using Xcode project file information {0}\nXCodeBuilder.CouldNotReadProjectInfoFrom=Could not read project information from {0}\nXCodeBuilder.CouldNotGetBuildConfig=Could not get build configuration ({0}) from {1}\nXCodeBuilder.UseingReleaseConfigFor=Useing Release configuration for build.\nXCodeBuilder.FoundDevelopmentTeamID=Found developmentTeamID ({0}) from {1}\nXCodeBuilder.SpecifyWorkspaceAlsoSetScheme=If you specify workspace, scheme setting is also required.\nXCodeBuilder.WorkspaceAndTargetCantSpecifySameTime=Workspace and target can not be specified at the same time.\nXCodeBuilder.SchemeAndTargetCantSpecifySameTime=Scheme and target can not be specified at the same time.\nXCodeBuilder.FailedToCopyMobileProvision=Failed to copy the mobile provision to the predetermined location: {0}\nXCodeBuilder.CopiedProvisioningProfile=Copied provisioning profile {0} in to the predetermined location {1}\nXCodeBuilder.CouldNotGetInfoFromMobileProvision=Could not get information from the provisioning profile: {0}\nXCodeBuilder.MultipleProjectInWorkSpace=Since there are multiple projects in the workspace, you must be specify the location of the target project as 'Xcode Project File'.\nXCodeBuilder.ParseingTestSummariesPlist=Parseing Test Summaries at {0}.\nXCodeBuilder.TestSummariesPlistNotExists=Test Summaries does not exist at {0}.\nXCodeBuilder.CleaningResultBundlePath=Cleaning up ResultBundlePath : {0}\nXCodeBuilder.UseDeprecatedKeychainInfo=The '[WARNING!] : Configure System' keychain information is used but this is a deprecated method.\\nFrom now on, please set keychain information to 'Credencials' instead of 'Configure System' and use it.\n\n################################################################################\n#OSXKeychainBuildWrapper.restoreOSXKeychainsAfterBuildProcessAsDefinedInGlobalConfiguration=Restore OS X keychains after build process as defined in global configuration\n#OSXKeychainBuildWrapper.invalidDefaultKeychainName=Invalid default keychain name: {0}\nExportIpa.ExportIpa=Export IPA\nExportIpa.NeedToSpecifyArchiveLocation=To export an IPA file You need to specify the location where the archive was output in the Xcode Build step.\nDeveloperProfile.ImportDeveloperProfile=Import developer profile\nDeveloperProfile.NoDeveloperProfileConfigured=No Apple developer profile is configured\nDeveloperProfile.Installing=Installing {0}\nDeveloperProfileLoader.MustSpecifyKeychainPath=If you do not select the global configuration keychain, you must specify the keychain path.\nDeveloperProfileLoader.MustSpecifyKeychainPwd=If you do not select the global configuration keychain, you must specify the keychain password.\nDeveloperProfileLoader.MustSelectDeveloperProfile=Please select a registered developer profile under global configuration.\nDeveloperProfileLoader.KeychainPathOrPasswordIsBlank=macOS Keychain password or file path is empty\nDeveloperProfileLoader.NoKeychainInfoConfigured=No macOS Keychain info is configured\n\nKeychainPasswordAndPath.DisplayName=macOS Keychain password and path\n\nOSXKeychainUnclockStep.DisplayName=Unlock macOS X Keychain\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/Messages_ja.properties",
    "content": "#\n# The MIT License\n#\n# Copyright (c) 2011 Ray Yamamoto Hilton\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n#\nXCodeBuilder.xcodebuildNotFound=xcodebuild \\u304C\\u8A2D\\u5B9A\\u3055\\u308C\\u305F\\u30D1\\u30B9 {0} \\u306B\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.avgtoolNotFound=agvtool \\u304C\\u8A2D\\u5B9A\\u3055\\u308C\\u305F\\u30D1\\u30B9 {0} \\u306B\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.buildDirMacroError=buildDir \\u306E\\u30DE\\u30AF\\u30ED\\u3084\\u74B0\\u5883\\u5909\\u6570\\u306E\\u5C55\\u958B\\u3067\\u30A8\\u30E9\\u30FC\\u304C\\u767A\\u751F\\u3057\\u307E\\u3057\\u305F\\u3002 Error: {0}\nXCodeBuilder.symRootMacroError=symRoot \\u306E\\u30DE\\u30AF\\u30ED\\u3084\\u74B0\\u5883\\u5909\\u6570\\u306E\\u5C55\\u958B\\u3067\\u30A8\\u30E9\\u30FC\\u304C\\u767A\\u751F\\u3057\\u307E\\u3057\\u305F\\u3002 Error: {0}\nXCodeBuilder.keychainNotConfigured=\\u30B0\\u30ED\\u30FC\\u30D0\\u30EB\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3084\\u30ED\\u30FC\\u30AB\\u30EB\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u3084\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u304C\\u8A2D\\u5B9A\\u3055\\u308C\\u3066\\u3044\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.teamNotConfigured=\\u30B0\\u30ED\\u30FC\\u30D0\\u30EB\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0\\u3084\\u30ED\\u30FC\\u30AB\\u30EB\\u30C1\\u30FC\\u30E0ID\\u304C\\u8A2D\\u5B9A\\u3055\\u308C\\u3066\\u3044\\u306A\\u3044\\u306E\\u3067\\u30C7\\u30D5\\u30A9\\u30EB\\u30C8\\u306E\\u81EA\\u52D5\\u7F72\\u540D\\u3092\\u4F7F\\u7528\\u3057\\u307E\\u3059\\u3002\nXCodeBuilder.unlockKeychainFailed=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\\u3067\\u304D\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.xcrunNotFound=xcrun \\u304C\\u8A2D\\u5B9A\\u3055\\u308C\\u305F\\u30D1\\u30B9 {0} \\u306B\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.cleaningBuildDir=\\u30D3\\u30EB\\u30C9\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u3092\\u30AF\\u30EA\\u30FC\\u30F3\\u30CA\\u30C3\\u30D7\\u3057\\u307E\\u3059: {0}\nXCodeBuilder.cleaningIPA=\\u4EE5\\u524D\\u306B\\u751F\\u6210\\u3055\\u308C\\u305F .ipa \\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30AF\\u30EA\\u30FC\\u30F3\\u30CA\\u30C3\\u30D7\\u3057\\u307E\\u3059\nXCodeBuilder.cleaningDSYM=\\u4EE5\\u524D\\u306B\\u751F\\u6210\\u3055\\u308C\\u305F .dSYM.zip \\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30AF\\u30EA\\u30FC\\u30F3\\u30CA\\u30C3\\u30D7\\u3057\\u307E\\u3059\nXCodeBuilder.cleaningTestReportsDir=\\u30C6\\u30B9\\u30C8\\u30EC\\u30DD\\u30FC\\u30C8\\u3092\\u30AF\\u30EA\\u30FC\\u30F3\\u30CA\\u30C3\\u30D7\\u3057\\u307E\\u3059 : {0}\nXCodeBuilder.fetchingCFBundleShortVersionString=\\u30DE\\u30FC\\u30B1\\u30C6\\u30A3\\u30F3\\u30B0\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleShortVersionString) \\u3092\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u304B\\u3089\\u53D6\\u5F97\\u3057\\u307E\\u3059\\u3002\nXCodeBuilder.fetchingCFBundleVersion=\\u30C6\\u30AF\\u30CB\\u30AB\\u30EB\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleVersion) \\u3092\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u304B\\u3089\\u53D6\\u5F97\\u3057\\u307E\\u3059\\u3002\nXCodeBuilder.invokeXcodebuild=xcodebuild \\u3092\\u5B9F\\u884C\\u3057\\u307E\\u3059:\nXCodeBuilder.packagingIPA=IPA \\u306B\\u30D1\\u30C3\\u30B1\\u30FC\\u30B8\\u30F3\\u30B0\\u3057\\u307E\\u3059\nXCodeBuilder.warningPackagingIPAForSimulatorSDK=\\u8B66\\u544A: IPA \\u3078\\u306E\\u30D1\\u30C3\\u30B1\\u30FC\\u30B8\\u30F3\\u30B0\\u304C\\u9078\\u629E\\u3055\\u308C\\u307E\\u3057\\u305F\\u304C simulator SDK ({0}) \\u304C\\u9078\\u629E\\u3055\\u308C\\u3066\\u3044\\u308B\\u306E\\u3067\\u30D1\\u30C3\\u30B1\\u30FC\\u30B8\\u30F3\\u30B0\\u306B\\u5931\\u6557\\u3057\\u307E\\u3059\\u3002\\u8A2D\\u5B9A\\u306E\\u898B\\u76F4\\u3057\\u3092\\u884C\\u306A\\u3063\\u3066\\u304F\\u3060\\u3055\\u3044\\u3002\nXCodeBuilder.workingDir=\\u4F5C\\u696D\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u306F: {0}\nXCodeBuilder.xcode=Xcode\\u30D3\\u30EB\\u30C9\nXCodeBuilder.xcodeVersionNotFound=\\u30A4\\u30F3\\u30B9\\u30C8\\u30FC\\u30EB\\u3055\\u308C\\u3066\\u3044\\u308B Xcode \\u3092\\u78BA\\u8A8D\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044\\u3002Jenkins \\u306F Xcode \\u306E\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u3092\\u53D6\\u5F97\\u3067\\u304D\\u307E\\u305B\\u3093\\u3067\\u3057\\u305F\\u3002\nXCodeBuilder.CFBundleShortVersionStringNotFound=\\u30DE\\u30FC\\u30B1\\u30C6\\u30A3\\u30F3\\u30B0\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleShortVersionString) \\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3067\\u3057\\u305F\\u3002\nXCodeBuilder.CFBundleShortVersionStringFound=\\u30DE\\u30FC\\u30B1\\u30C6\\u30A3\\u30F3\\u30B0\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleShortVersionString) \\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u3057\\u305F: {0}\nXCodeBuilder.CFBundleShortVersionStringMacroError=CFBundleShortVersionString \\u306E\\u30DE\\u30AF\\u30ED\\u3084\\u74B0\\u5883\\u5909\\u6570\\u306E\\u5C55\\u958B\\u3067\\u30A8\\u30E9\\u30FC\\u304C\\u767A\\u751F\\u3057\\u307E\\u3057\\u305F\\u3002 Error: {0}\nXCodeBuilder.CFBundleShortVersionStringUpdate=\\u30DE\\u30FC\\u30B1\\u30C6\\u30A3\\u30F3\\u30B0\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleShortVersionString) \\u3092\\u8A2D\\u5B9A\\u3057\\u307E\\u3059: {0}\nXCodeBuilder.CFBundleShortVersionStringUpdateError=CFBundleShortVersionString \\u3092\\u8A2D\\u5B9A\\u3067\\u304D\\u307E\\u305B\\u3093: {0}\nXCodeBuilder.CFBundleShortVersionStringUsed=\\u30DE\\u30FC\\u30B1\\u30C6\\u30A3\\u30F3\\u30B0\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleShortVersionString) \\u306FJenkins\\u304CIPA\\u3092\\u30D1\\u30C3\\u30B1\\u30FC\\u30B8\\u3059\\u308B\\u306E\\u306B\\u4F7F\\u308F\\u308C\\u307E\\u3059: {0}\nXCodeBuilder.CFBundleShortVersionStringValue=\\u30DE\\u30FC\\u30B1\\u30C6\\u30A3\\u30F3\\u30B0\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleShortVersionString) \\u3067\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306B\\u8A2D\\u5B9A\\u898B\\u3064\\u304B\\u3063\\u305F\\u306E\\u306F: {0}\nXCodeBuilder.CFBundleVersionFound=\\u898B\\u3064\\u304B\\u3063\\u305F\\u30C6\\u30AF\\u30CB\\u30AB\\u30EB\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleVersion): {0}\nXCodeBuilder.CFBundleVersionMacroError=CFBundleVersion \\u306E\\u30DE\\u30AF\\u30ED\\u3084\\u74B0\\u5883\\u5909\\u6570\\u306E\\u5C55\\u958B\\u3067\\u30A8\\u30E9\\u30FC\\u304C\\u767A\\u751F\\u3057\\u307E\\u3057\\u305F\\u3002 Error: {0}\nXCodeBuilder.CFBundleVersionNotFound=\\u30C6\\u30AF\\u30CB\\u30AB\\u30EB\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleVersion) \\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3067\\u3057\\u305F\\u3002\nXCodeBuilder.CFBundleVersionUpdate=\\u30C6\\u30AF\\u30CB\\u30AB\\u30EB\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleVersion) \\u3092\\u8A2D\\u5B9A\\u3057\\u307E\\u3059: {0}\nXCodeBuilder.CFBundleVersionUpdateError=CFBundleVersion \\u3092\\u8A2D\\u5B9A\\u3067\\u304D\\u307E\\u305B\\u3093: {0}\nXCodeBuilder.CFBundleVersionUsed=\\u30C6\\u30AF\\u30CB\\u30AB\\u30EB\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleVersion) \\u306FJenkins\\u304CIPA\\u3092\\u30D1\\u30C3\\u30B1\\u30FC\\u30B8\\u3059\\u308B\\u306E\\u306B\\u4F7F\\u308F\\u308C\\u307E\\u3059: {0}\nXCodeBuilder.CFBundleVersionValue=\\u30C6\\u30AF\\u30CB\\u30AB\\u30EB\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u756A\\u53F7 (CFBundleVersion) \\u3067\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306E\\u8A2D\\u5B9A\\u306B\\u898B\\u3064\\u304B\\u3063\\u305F\\u306E\\u306F: {0}\nXCodeBuilder.NotExistingBuildDirectory=\\u30D3\\u30EB\\u30C9\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA {0} \\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3002\\u305F\\u3076\\u3093\\u9078\\u5B9A\\u306B\\u554F\\u984C\\u304C\\u3042\\u308A\\u307E\\u3059\\u3002\nXCodeBuilder.NoArchivesInBuildDirectory=xcarchive \\u304C\\u30D3\\u30EB\\u30C9\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA {0} \\u306B\\u5B58\\u5728\\u3057\\u307E\\u305B\\u3093\\u3002\\u8A2D\\u5B9A\\u306E\\u30A8\\u30E9\\u30FC\\u3082\\u3057\\u304F\\u306F\\u4E00\\u6642\\u7684\\u306A\\u554F\\u984C\\u304B\\u3082\\u3057\\u308C\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.DebugInfoLineDelimiter=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\\=\nXCodeBuilder.DebugInfoAvailableCertificates=\\=\\= \\u5229\\u7528\\u53EF\\u80FD\\u306A\\u30C7\\u30D9\\u30ED\\u30C3\\u30D1\\u30FC\\u8A3C\\u660E\\u66F8\nXCodeBuilder.DebugInfoCanFindCertificates=\\=\\= \\u5FC5\\u8981\\u3068\\u3059\\u308B\\u30C7\\u30D9\\u30ED\\u30C3\\u30D1\\u30FC\\u8A3C\\u660E\\u66F8\\u306F\\u898B\\u5F53\\u305F\\u308A\\u307E\\u3059\\u304B\\uFF1F\nXCodeBuilder.DebugInfoAvailableSDKs=\\=\\= \\u5229\\u7528\\u53EF\\u80FD\\u306ASDK\nXCodeBuilder.DebugInfoAvailableSchemes=\\=\\= \\u5229\\u7528\\u53EF\\u80FD\\u306A\\u30B9\\u30AD\\u30FC\\u30E0\nXCodeBuilder.DebugInfoAvailableParameters=\\=\\= \\u5229\\u7528\\u53EF\\u80FD\\u306A\\u30D1\\u30E9\\u30E1\\u30FC\\u30BF\nXCodeBuilder.agvtoolPathNotSet=agvtool \\u5B9F\\u884C\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u30D1\\u30B9\\u3092\\u6307\\u5B9A\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044 (\\u901A\\u5E38\\u306F /usr/bin/agvtool)\nXCodeBuilder.xcodebuildPathNotSet=xcodebuild \\u5B9F\\u884C\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u30D1\\u30B9\\u3092\\u6307\\u5B9A\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044 (\\u901A\\u5E38\\u306F /usr/bin/xcodebuild)\nXCodeBuilder.xcrunPathNotSet=xcrun \\u5B9F\\u884C\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u30D1\\u30B9\\u3092\\u6307\\u5B9A\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044 (\\u901A\\u5E38\\u306F /usr/bin/xcrun)\nXCodeBuilder.zipFailed=*.dSYM \\u3092 {0}-dSYM.zip \\u306Bzip\\u5727\\u7E2E\\u3067\\u304D\\u307E\\u305B\\u3093\nXCodeBuilder.CFBundleIdentifierChanged=CFBundleIdentifier \\u3092 {0} \\u304B\\u3089 {1} \\u306B\\u5909\\u66F4\nXCodeBuilder.CFBundleIdentifierInfoPlistNotFound=info.plist \\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093: {0}\nXCodeBuilder.NoTargetsFoundInConfig=\\u306A\\u306B\\u3082\\u30BF\\u30FC\\u30B2\\u30C3\\u30C8\\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.NoMatchingTargetsFound=\\u6B63\\u898F\\u8868\\u73FE\\u306B\\u5408\\u81F4\\u3059\\u308B\\u30BF\\u30FC\\u30B2\\u30C3\\u30C8\\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.XcodeToolsDir=Xcode Tools \\u306E\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u306F {0}.\nXCodeBuilder.FailedToGetVersionFromInfoPlist=\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u60C5\\u5831\\u3092Info.plist\\u304B\\u3089\\u53D6\\u5F97\\u3067\\u304D\\u307E\\u305B\\u3093: {0}\nXCodeBuilder.MarketingAndTechnicalVersionNotFound=\\u30DE\\u30FC\\u30B1\\u30C6\\u30A3\\u30F3\\u30B0\\u307E\\u305F\\u306F\\u30C6\\u30AF\\u30CB\\u30AB\\u30EB\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u306E\\u3044\\u305A\\u308C\\u304B\\u306E\\u5024\\u3092\\u4E0E\\u3048\\u308B\\u5FC5\\u8981\\u304C\\u3042\\u308A\\u307E\\u3059\\u304C\\u3069\\u3061\\u3089\\u3082\\u898B\\u3064\\u3051\\u3089\\u308C\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.PackagingArchiveToIpa={0}.xcarchive \\u304B\\u3089 {1} \\u3092\\u30D1\\u30C3\\u30B1\\u30FC\\u30B8\\u30F3\\u30B0\nXCodeBuilder.FailedToBuildIpa={0} \\u3092\\u4F5C\\u6210\\u3067\\u304D\\u307E\\u305B\\u3093\nXCodeBuilder.ArchivingDSYM=dSYM \\u3092\\u30A2\\u30FC\\u30AB\\u30A4\\u30D6\\u3057\\u307E\\u3059\nXCodeBuilder.NoDSYMFileFound={0} \\u306BdSYM\\u30D5\\u30A1\\u30A4\\u30EB\\u304C\\u3042\\u308A\\u307E\\u305B\\u3093\\uFF01\nXCodeBuilder.CreatingManifestPlist=Manifest Plist {0} \\u3092\\u4F5C\\u6210\\u3057\\u307E\\u3059\nXCodeBuilder.NoAppFoundInBuildDirectory=\\u30D3\\u30EB\\u30C9\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA ({0}) \\u306B .app \\u3082 .appex \\u3082\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\nXCodeBuilder.NeedSchema=\\u30A2\\u30FC\\u30AB\\u30A4\\u30D6\\u3084IPA\\u3092\\u51FA\\u529B\\u3059\\u308B\\u5834\\u5408\\u306B\\u306F\\u30B9\\u30AD\\u30FC\\u30E0\\u3092\\u6307\\u5B9A\\u3059\\u308B\\u5FC5\\u8981\\u304C\\u3042\\u308A\\u307E\\u3059\\u3002\nXCodeBuilder.AbortXcodeBuildFailed=Xcode\\u30D3\\u30EB\\u30C9\\u306B\\u5931\\u6557\\u3057\\u307E\\u3057\\u305F\\u3002\\u8A73\\u3057\\u304F\\u306F\\u30ED\\u30B0\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u78BA\\u8A8D\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044\\u3002\nXCodeBuilder.NeedOnDemandResourcesURL=\\u30AA\\u30F3\\u30C7\\u30DE\\u30F3\\u30C9\\u30EA\\u30BD\\u30FC\\u30B9\\u30A2\\u30BB\\u30C3\\u30C8\\u3092\\u30D0\\u30F3\\u30C9\\u30EB\\u306B\\u542B\\u3081\\u306A\\u3044\\u5834\\u5408\\u306F\\u3001\\u30EA\\u30BD\\u30FC\\u30B9\\u30D1\\u30C3\\u30AF\\u3092\\u30C0\\u30A6\\u30F3\\u30ED\\u30FC\\u30C9\\u3059\\u308B\\u305F\\u3081\\u306EURL\\u3092\\u6307\\u5B9A\\u3059\\u308B\\u5FC5\\u8981\\u304C\\u3042\\u308A\\u307E\\u3059\\u3002\nXCodeBuilder.CFBundleIdFailedGetInInfoPlist={0} \\u304B\\u3089\\u306EBundle ID\\u306E\\u8AAD\\u307F\\u8FBC\\u307F\\u306B\\u5931\\u6557\\u3057\\u307E\\u3057\\u305F: {1}\nXCodeBuilder.CFBundleIdReplaceWith=Bundle ID \\u306F\\u7F6E\\u304D\\u63DB\\u3048\\u3089\\u308C\\u307E\\u3059: {0}\nXCodeBuilder.CFBundleIdFailedGetInMobileProvision={0} \\u304B\\u3089\\u306E\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EBUUID\\u306E\\u8AAD\\u307F\\u8FBC\\u307F\\u306B\\u5931\\u6557\\u3057\\u307E\\u3057\\u305F: {1}\nXCodeBuilder.ProfileUUIDReplaceWith=\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EBUUID\\u306F\\u7F6E\\u304D\\u63DB\\u3048\\u3089\\u308C\\u307E\\u3059: {0}\nXCodeBuilder.IpaExportMethodMuestBeOneOfTheFollowing=BuildIPA\\u304C\\u30C1\\u30A7\\u30C3\\u30AF\\u3055\\u308C\\u3066\\u3044\\u308B\\u5834\\u5408\\u306FipaExportMethod\\u306F\\u6B21\\u306E\\u3044\\u305A\\u308C\\u304B\\u3067\\u306A\\u3051\\u308C\\u3070\\u306A\\u308A\\u307E\\u305B\\u3093: {0}\nXCodeBuilder.BuildDirectory=\\u30D3\\u30EB\\u30C9\\u3092\\u51FA\\u529B\\u3059\\u308B\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA: {0}\nXCodeBuilder.ReadSigningInfoFromProject=\\u30B3\\u30FC\\u30C9\\u7F72\\u540D\\u306E\\u305F\\u3081\\u306E\\u60C5\\u5831\\u3092Xcode\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u304B\\u3089\\u8AAD\\u307F\\u53D6\\u308A\\u307E\\u3059\\u3002\nXCodeBuilder.CouldNotReadInfoFrom={0} \\u304B\\u3089\\u60C5\\u5831\\u3092\\u8AAD\\u307F\\u53D6\\u308C\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.ReadInfoFromScheme=\\u30B9\\u30AD\\u30FC\\u30E0 {0} \\u304B\\u3089\\u60C5\\u5831\\u3092\\u8AAD\\u307F\\u8FBC\\u307F\\u307E\\u3059\\u3002\nXCodeBuilder.CouldNotGetInfoFromScheme=\\u30B9\\u30AD\\u30FC\\u30E0 {0} \\u304B\\u3089\\u60C5\\u5831\\u3092\\u8AAD\\u307F\\u8FBC\\u3081\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.ReadProjectInfoFrom=\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306E\\u60C5\\u5831\\u3092 {0} \\u304B\\u3089\\u8AAD\\u307F\\u8FBC\\u307F\\u307E\\u3059\\u3002\nXCodeBuilder.ReadInfoFromWorkspace=\\u30EF\\u30FC\\u30AF\\u30B9\\u30DA\\u30FC\\u30B9 {0} \\u304B\\u3089\\u60C5\\u5831\\u3092\\u8AAD\\u307F\\u8FBC\\u307F\\u307E\\u3059\\u3002\nXCodeBuilder.UsingXcodeFileInfo=Xcode\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u30D5\\u30A1\\u30A4\\u30EB {0} \\u306E\\u60C5\\u5831\\u3092\\u4F7F\\u7528\\u3057\\u307E\\u3059\\u3002\nXCodeBuilder.CouldNotReadProjectInfoFrom=\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306E\\u60C5\\u5831\\u3092 {0} \\u304B\\u3089\\u60C5\\u5831\\u3092\\u8AAD\\u307F\\u8FBC\\u3081\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.CouldNotGetBuildConfig=\\u30D3\\u30EB\\u30C9\\u8A2D\\u5B9A({0})\\u3092\\u53D6\\u5F97\\u3067\\u304D\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.UseingReleaseConfigFor=Release\\u8A2D\\u5B9A\\u3092\\u30D3\\u30EB\\u30C9\\u306B\\u4F7F\\u7528\\u3057\\u307E\\u3059\\u3002\nXCodeBuilder.FoundDevelopmentTeamID=developmentTeamID ({0}) \\u3092 {1} \\u3067\\u898B\\u3064\\u3051\\u307E\\u3057\\u305F\\u3002\nXCodeBuilder.SpecifyWorkspaceAlsoSetScheme=\\u30EF\\u30FC\\u30AF\\u30B9\\u30DA\\u30FC\\u30B9\\u3092\\u6307\\u5B9A\\u3059\\u308B\\u5834\\u5408\\u306F\\u30B9\\u30AD\\u30FC\\u30E0\\u8A2D\\u5B9A\\u3082\\u5FC5\\u8981\\u3067\\u3059\\u3002\nXCodeBuilder.WorkspaceAndTargetCantSpecifySameTime=\\u30EF\\u30FC\\u30AF\\u30B9\\u30DA\\u30FC\\u30B9\\u3068\\u30BF\\u30FC\\u30B2\\u30C3\\u30C8\\u3092\\u540C\\u6642\\u306B\\u6307\\u5B9A\\u3059\\u308B\\u3053\\u3068\\u306F\\u3067\\u304D\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.SchemeAndTargetCantSpecifySameTime=\\u30B9\\u30AD\\u30FC\\u30E0\\u3068\\u30BF\\u30FC\\u30B2\\u30C3\\u30C8\\u3092\\u540C\\u6642\\u306B\\u6307\\u5B9A\\u3059\\u308B\\u3053\\u3068\\u306F\\u3067\\u304D\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.FailedToCopyMobileProvision=\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u6240\\u5B9A\\u306E\\u5834\\u6240\\u306B\\u30B3\\u30D4\\u30FC\\u3067\\u304D\\u307E\\u305B\\u3093\\u3067\\u3057\\u305F: {0}\nXCodeBuilder.CopiedProvisioningProfile=\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB {0} \\u3092\\u6240\\u5B9A\\u306E\\u5834\\u6240 {1} \\u306B\\u30B3\\u30D4\\u30FC\\u3057\\u307E\\u3057\\u305F\\u3002\nXCodeBuilder.CouldNotGetInfoFromMobileProvision=\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u304B\\u3089\\u60C5\\u5831\\u3092\\u53D6\\u5F97\\u3059\\u308B\\u3053\\u3068\\u304C\\u3067\\u304D\\u307E\\u305B\\u3093\\u3067\\u3057\\u305F: {0}\nXCodeBuilder.MultipleProjectInWorkSpace=\\u30EF\\u30FC\\u30AF\\u30B9\\u30DA\\u30FC\\u30B9\\u306B\\u306F\\u8907\\u6570\\u306E\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u304C\\u5B58\\u5728\\u3059\\u308B\\u305F\\u3081\\u3001\\u30BF\\u30FC\\u30B2\\u30C3\\u30C8\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306E\\u5834\\u6240\\u3092\\u300CXcode Project\\u30D5\\u30A1\\u30A4\\u30EB\\u300D\\u3068\\u3057\\u3066\\u6307\\u5B9A\\u3059\\u308B\\u5FC5\\u8981\\u304C\\u3042\\u308A\\u307E\\u3059\\u3002\nXCodeBuilder.ParseingTestSummariesPlist=\\u30C6\\u30B9\\u30C8\\u7D50\\u679C\\u306E\\u6982\\u8981 {0} \\u306E\\u89E3\\u6790\\u3092\\u884C\\u3044\\u307E\\u3059\\u3002\nXCodeBuilder.TestSummariesPlistNotExists=\\u30C6\\u30B9\\u30C8\\u7D50\\u679C\\u306E\\u6982\\u8981 {0} \\u304C\\u898B\\u3064\\u304B\\u308A\\u307E\\u305B\\u3093\\u3002\nXCodeBuilder.CleaningResultBundlePath=ResultBundlePath\\u3092\\u30AF\\u30EA\\u30FC\\u30F3\\u30CA\\u30C3\\u30D7\\u3057\\u307E\\u3059: {0}\nXCodeBuilder.UseDeprecatedKeychainInfo=\\u3010\\u8B66\\u544A\\u3011: \\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u60C5\\u5831\\u304C\\u4F7F\\u308F\\u308C\\u3066\\u3044\\u307E\\u3059\\u304C\\u3001\\u73FE\\u5728\\u306F\\u3053\\u308C\\u306F\\u975E\\u63A8\\u5968\\u306E\\u65B9\\u6CD5\\u3067\\u3059\\u3002\\n\\u4ECA\\u5F8C\\u306F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u60C5\\u5831\\u306F\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u3067\\u306F\\u306A\\u304F\\u300C\\u8A8D\\u8A3C\\u60C5\\u5831\\u300D\\u306B\\u8A2D\\u5B9A\\u3057\\u3066\\u3001\\u305D\\u308C\\u3092\\u5229\\u7528\\u3059\\u308B\\u3088\\u3046\\u306B\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044\\u3002\n\n################################################################################\n#OSXKeychainBuildWrapper.restoreOSXKeychainsAfterBuildProcessAsDefinedInGlobalConfiguration=\\u30D3\\u30EB\\u30C9\\u30D7\\u30ED\\u30BB\\u30B9\\u306E\\u5F8C\\u306BOS X\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30B0\\u30ED\\u30FC\\u30D0\\u30EB\\u8A2D\\u5B9A\\u3067\\u5B9A\\u7FA9\\u3055\\u308C\\u305F\\u3082\\u306E\\u306B\\u5FA9\\u5143\\u3059\\u308B\n#OSXKeychainBuildWrapper.invalidDefaultKeychainName=\\u30C7\\u30D5\\u30A9\\u30EB\\u30C8\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u540D\\u524D\\u304C\\u9593\\u9055\\u3048\\u3066\\u3044\\u307E\\u3059: {0}\nExportIpa.ExportIpa=IPA\\u306E\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\nExportIpa.NeedToSpecifyArchiveLocation=IPA\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u306B\\u306FXcode Build\\u30B9\\u30C6\\u30C3\\u30D7\\u3067\\u30A2\\u30FC\\u30AB\\u30A4\\u30D6\\u3092\\u51FA\\u529B\\u3057\\u305F\\u5834\\u6240\\u3092\\u6307\\u5B9A\\u3059\\u308B\\u5FC5\\u8981\\u304C\\u3042\\u308A\\u307E\\u3059\\u3002\nDeveloperProfile.ImportDeveloperProfile=\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u30A4\\u30F3\\u30DD\\u30FC\\u30C8\nDeveloperProfile.NoDeveloperProfileConfigured=Apple\\u958B\\u767A\\u8005\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u304C\\u8A2D\\u5B9A\\u3055\\u308C\\u3066\\u3044\\u307E\\u305B\\u3093\nDeveloperProfile.Installing={0} \\u3092\\u30A4\\u30F3\\u30B9\\u30C8\\u30FC\\u30EB\\u3057\\u307E\\u3059\nDeveloperProfileLoader.MustSpecifyKeychainPath=\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u9078\\u629E\\u3057\\u306A\\u3044\\u306A\\u3089\\u3001\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u3092\\u6307\\u5B9A\\u3057\\u306A\\u3051\\u308C\\u3070\\u306A\\u308A\\u307E\\u305B\\u3093\\u3002\nDeveloperProfileLoader.MustSpecifyKeychainPwd=\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3>\\u3092\\u9078\\u629E\\u3057\\u306A\\u3044\\u306A\\u3089\\u3001\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u3092\\u6307\\u5B9A\\u3057\\u306A\\u3051\\u308C\\u3070\\u306A\\u308A\\u307E\\u305B\\u3093\\u3002\nDeveloperProfileLoader.MustSelectDeveloperProfile=\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u3067\\u767B\\u9332\\u6E08\\u307F\\u306E\\u30C7\\u30D9\\u30ED\\u30C3\\u30D1\\u30FC\\u30D7\\u30ED\\u30D5\\u30A3\\u30FC\\u30EB\\u3092\\u9078\\u629E\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044\\u3002\nDeveloperProfileLoader.KeychainPathOrPasswordIsBlank=macOS\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u304B\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u30D1\\u30B9\\u304C\\u7A7A\\u767D\\u3067\\u3059\nDeveloperProfileLoader.NoKeychainInfoConfigured=macOS\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u60C5\\u5831\\u304C\\u8A2D\\u5B9A\\u3055\\u308C\\u3066\\u3044\\u307E\\u305B\\u3093\n\nKeychainPasswordAndPath.DisplayName=macOS\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u3068\\u30D1\\u30B9\n\nOSXKeychainUnclockStep.DisplayName=macOS\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\\u3059\\u308B\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/config.jelly",
    "content": "<?jelly escape-by-default='true'?>\n<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l=\"/lib/layout\" xmlns:t=\"/lib/hudson\" xmlns:f=\"/lib/form\" xmlns:html=\"jelly:html\">\n    <![CDATA[\n\t\t<script type=\"text/javascript\">\n\t\t<!--\n\t\t\tvar showOrHideAttributeInput = function(prefix, uuid) {\n\t\t\t\tvar defaultChosen = (document.getElementById(prefix + uuid).selectedIndex == 0);\n\n\t\t\t\tdocument.getElementById(\"\" + uuid).style.display = defaultChosen ? \"block\" : \"none\";\n\t\t\t};\n\t\t-->\n\t\t</script>\n\t]]>\n\n    <!-- General build settings -->\n    <f:section title=\"${%General build settings}\">\n        <f:entry>\n            <j:set var=\"UUID\" value=\"${descriptor.UUID}\" />\n            <f:entry title=\"${%Development Team}\" description=\"${%Override the Development Team specified in the project.}\" field=\"globalDevelopmentTeam\"\n                help=\"/plugin/xcode-plugin/help/help-globalDevelopmentTeam.html\" >\n                <select class=\"setting-input\" name=\"developmentTeamName\" foo=\"${UID}\" id=\"global-team-select-${UUID}\" onchange=\"showOrHideAttributeInput('global-team-select-', '${UUID}')\">\n                    <f:option selected=\"${instance.developmentTeamName==null}\" value=\"\">${%none} (${%specify one below})</f:option>\n\n                    <j:forEach var=\"team\" items=\"${descriptor.globalConfiguration.teams}\">\n                        <j:if test=\"${team.teamName==instance.developmentTeamName}\">\n                            <j:set var=\"displayCustomTeamData\" value=\"none\" scope=\"parent\" />\n                        </j:if>\n\n                        <f:option selected=\"${team.teamName==instance.developmentTeamName}\">${team.teamName}</f:option>\n                    </j:forEach>\n                </select>\n            </f:entry>\n\n            <f:nested>\n                <j:if test=\"${displayCustomTeamData==null}\">\n                    <j:set var=\"displayCustomTeamData\" value=\"block\" />\n                </j:if>\n\n                <table id=\"${UUID}\" style=\"display: ${displayCustomTeamData}\">\n                    <f:entry title=\"${%Development Team ID}\" field=\"developmentTeamID\" description=\"${%The ID of the Apple development team to use to sign the IPA.}\"\n                        help=\"/plugin/xcode-plugin/help/help-developmentTeamID.html\" >\n                        <f:textbox />\n                    </f:entry>\n                </table>\n            </f:nested>\n        </f:entry>\n\n\t<j:invokeStatic var=\"installations\" className=\"hudson.plugins.xcode.XcodeInstallation\" method=\"allInstallations\"/>\n\t<j:if test=\"${!empty(installations)}\">\n\t    <f:entry title=\"${%Xcode Tools Version}\" field=\"xcodeToolsVersion\" description=\"${%Xcode Tools version.} (${%if you need to override System Default})\" help=\"/plugin/xcode-plugin/help/help-xcodeToolsVersion.html\">\n\t\t<select class=\"setting-input\" name=\"xcodeName\">\n\t\t    <option value=\"\">${%System Default}</option>\n\t\t    <j:forEach var=\"inst\" items=\"${installations}\">\n\t\t\t<f:option selected=\"${inst.name==instance.xcodeName}\" value=\"${inst.name}\">${inst.name}</f:option>\n\t\t    </j:forEach>\n\t\t</select>\n\t    </f:entry>\n\t</j:if>\n\n\t<f:entry title=\"${%Use Legacy Build System?}\" field=\"useLegacyBuildSystem\" description=\"${%Use the old 'Legacy Build System' instead of 'New Build System' of Xcode 9 and later.}\">\n\t    <f:checkbox title=\"${%Yes}\" />\n\t</f:entry>\n\n        <f:entry title=\"${%Target}\" field=\"target\" description=\"${%Leave empty for all targets}\">\n            <f:textbox />\n        </f:entry>\n\n        <f:entry title=\"\" field=\"interpretTargetAsRegEx\">\n            <f:checkbox title=\"${%Interpret As Regular Expression}\" />\n        </f:entry>\n\n        <f:advanced title=\"${%Settings}\">\n            <f:entry title=\"${%Clean before build?}\" field=\"cleanBeforeBuild\" description=\"${%This will delete the build directories before invoking the build.}\">\n                <f:checkbox title=\"${%Yes}\" />\n            </f:entry>\n\n            <f:entry title=\"${%Allow failing build results?}\" field=\"allowFailingBuildResults\"\n                description=\"${%Checking this option will prevent this build step from failing if xcodebuild exits with a non-zero return code.}\">\n                <f:checkbox title=\"${%Yes}\" />\n            </f:entry>\n\n            <f:entry title=\"${%No Console Log?}\" field=\"noConsoleLog\" description=\"${%Checking this option will not log xcode build output to console output.}\">\n\t\t            <f:checkbox title=\"${%Yes}\" />\n\t\t        </f:entry>\n\t\t        <f:entry title=\"${%Logfile Output directory}\" field=\"logfileOutputDirectory\"\n                description=\"${%Leave empty for Log to project-directory/logs. The output directory for the separate logfile, relative to the project-directory.}\">\n\t\t            <f:textbox />\n\t\t        </f:entry>\n\n            <f:entry title=\"${%ResultBundlePath}\" field=\"resultBundlePath\"\n                description=\"${%Leave empty, it will not output a test result and will not analyze the test results. relative to the project-directory.}\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Clean ResultBundlePath?}\" field=\"cleanResultBundlePath\" description=\"${%This will delete the ResultBundlePath before invoking the build.}\">\n                <f:checkbox title=\"${%Yes}\" />\n            </f:entry>\n\n            <f:entry title=\"${%Configuration}\" field=\"configuration\" description=\"${%This is the name of the configuration as defined in the Xcode project.}\">\n                <f:textbox default=\"Release\" />\n            </f:entry>\n\n            <f:entry title=\"${%Xcode Schema File}\" field=\"xcodeSchema\" description=\"${%Needed if you want to compile for a specific schema instead of a target, or if you want to generate an archive or an IPA.}\" help=\"/plugin/xcode-plugin/help/help-xcodeSchema.html\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Generate Archive?}\" field=\"generateArchive\"\n                description=\"${%Checking this option will generate an xcarchive of the specified scheme. A workspace and scheme are are also needed for archives}\">\n                <f:checkbox title=\"${%Yes}\" />\n            </f:entry>\n\n            <f:entry>\n                <f:optionalBlock inline=\"true\" checked=\"${instance.buildIpa == true}\" name=\"buildIpa\" title=\"${%Pack application, build and sign .ipa?}\"\n                    description=\"${%Checking this option will create a .ipa for each .app found in the build directory.}\">\n                    <f:entry title=\"${%Export method}\" field=\"ipaExportMethod\"\n                        description=\"${%The export method of the .app to generate the .ipa file. Should be one in 'development', 'ad-hoc', 'enterprise' or 'app-store'.}\">\n                        <f:textbox default=\"ad-hoc\" />\n                    </f:entry>\n\n                    <f:entry title=\"${%.ipa filename pattern}\" field=\"ipaName\"\n                        description=\"${%A pattern for the ipa file name. You may use} $${VERSION} ${%and} $${BUILD_DATE} (yyyy.MM.dd) ${%in this string}\" help=\"/plugin/xcode-plugin/help/help-ipaName.html\">\n                        <f:textbox />\n                    </f:entry>\n\n                    <f:entry title=\"${%Output directory}\" field=\"ipaOutputDirectory\" description=\"${%The output directory for the .ipa file, relative to the build directory.}\">\n                        <f:textbox />\n                    </f:entry>\n\n                    <f:entry title=\"${%Upload Bitcode?}\" field=\"uploadBitcode\"\n                        description=\"${%If checked, include Bitcode when exporting applications to IPA.}\" help=\"/plugin/xcode-plugin/help/help-uploadBitcode.html\">\n                        <f:checkbox title=\"${%Yes}\" name=\"uploadBitcode\" checked=\"${instance.uploadBitcode}\" default=\"true\" />\n                    </f:entry>\n\n                    <f:entry title=\"${%Upload Symbols?}\" field=\"uploadSymbols\"\n                        description=\"${%If checked, include symbols when exporting applications to IPA.}\" help=\"/plugin/xcode-plugin/help/help-uploadSymbols.html\">\n                        <f:checkbox title=\"${%Yes}\" name=\"uploadSymbols\" checked=\"${instance.uploadSymbols}\" default=\"true\" />\n                    </f:entry>\n\n                    <f:entry title=\"${%Compile Bitcode?}\" field=\"compileBitcode\"\n                        description=\"${%If checked, recompile from Bitcode when exporting the application to IPA.}\" help=\"/plugin/xcode-plugin/help/help-compileBitcode.html\">\n                        <f:checkbox title=\"${%Yes}\" name=\"compileBitcode\" checked=\"${instance.compileBitcode}\" default=\"true\" />\n                    </f:entry>\n\n                    <f:entry title=\"${%Thinning}\" field=\"thinning\"\n                        description=\"${%When doing Thinning, specify the target device for thinning.}\" help=\"/plugin/xcode-plugin/help/help-thinning.html\">\n                        <f:textbox />\n                    </f:entry>\n\n                    <f:entry title=\"${%Pack on demand resources?}\" field=\"embedOnDemandResourcesAssetPacksInBundle\" \n                        description=\"${%If checked, include on demand resource assets to the bundle.}\" help=\"/plugin/xcode-plugin/help/help-embedOnDemandResources.html\">\n                        <f:checkbox title=\"${%Yes}\" name=\"embedOnDemandResourcesAssetPacksInBundle\" checked=\"${instance.embedOnDemandResourcesAssetPacksInBundle}\" default=\"true\" />\n                    </f:entry>\n\n                    <f:entry title=\"${%On demand resources asset URL}\" field=\"onDemandResourcesAssetPacksBaseURL\"\n                        description=\"${%Set the base URL for downloading resource assets when the resource asset is not included in the bundle in the application using the on demand resource.}\" help=\"/plugin/xcode-plugin/help/help-onDemandResourcesURL.html\">\n                        <f:textbox />\n                    </f:entry>\n\n                    <f:entry title=\"${%Application URL}\" field=\"appURL\"\n                        description=\"${%The base URL to use to create a Manifest Plist. If omitted no Manifest Plist will be generated}\" help=\"/plugin/xcode-plugin/help/help-manifestPlistURL.html\">\n                        <f:textbox />\n                    </f:entry>\n\n                    <f:entry title=\"${%Display image URL}\" field=\"displayImageURL\"\n                        description=\"${%Specify the URL of the 57 pixel size png image to be displayed in the IPA installation.}\" help=\"/plugin/xcode-plugin/help/help-displayImageURL.html\">\n                        <f:textbox />\n                    </f:entry>\n\n                    <f:entry title=\"${%Full size image URL}\" field=\"fullSizeImageURL\"\n                        description=\"${%Specify the URL of the 512 pixel size png image to be displayed in the IPA installation.}\" help=\"/plugin/xcode-plugin/help/help-fullSizeImageURL.html\">\n                        <f:textbox />\n                    </f:entry>\n\n                    <f:entry title=\"${%Asset pack URL}\" field=\"assetPackManifestURL\"\n                        description=\"${%Specify the base URL of the downloading asset pack.}\" help=\"/plugin/xcode-plugin/help/help-assetPackManifestURL.html\">\n                        <f:textbox />\n                    </f:entry>\n\n                    <f:entry title=\"${%Strip Swift Symbols?}\" field=\"stripSwiftSymbols\"\n                        description=\"${%If checked, symbols be stripped from Swift libraries when exporting the application to IPA.}\" help=\"/plugin/xcode-plugin/help/help-stripSwiftSymbols.html\">\n                        <f:checkbox title=\"${%Yes}\" name=\"stripSwiftSymbols\" checked=\"${instance.stripSwiftSymbols}\" default=\"true\" />\n                    </f:entry>\n\n                </f:optionalBlock>\n            </f:entry>\n        </f:advanced>\n    </f:section>\n\n    <!-- Code signing section -->\n    <f:section title=\"${%Code signing &amp; OS X keychain options}\">\n        <f:advanced title=\"${%Code signing settings}\">\n            <f:entry>\n                <f:radioBlock inline=\"true\" checked=\"${instance.signingMethod.equals('automatic')}\" field=\"signingMethod\" name=\"signingMethod\" title=\"${%Automatic Signing}\" value=\"automatic\" help=\"/plugin/xcode-plugin/help/help-automaticSigning.html\">\n                    <f:entry>\n                    </f:entry>\n                </f:radioBlock>\n                <f:radioBlock inline=\"true\" checked=\"${instance.signingMethod.equals('readFromProject')}\" field=\"signingMethod\" name=\"signingMethod\" title=\"${%Read from Xcode Project}\" value=\"readFromProject\" help=\"/plugin/xcode-plugin/help/help-readFromProject.html\">\n                    <f:entry>\n                    </f:entry>\n                </f:radioBlock>\n                <f:radioBlock inline=\"true\" checked=\"${instance.signingMethod.equals('manual')}\" field=\"signingMethod\" name=\"signingMethod\" title=\"${%Manual signing}\" value=\"manual\" help=\"/plugin/xcode-plugin/help/help-manualSigning.html\">\n                    <f:entry title=\"${%Provisioning Profiles}\" description=\"${%Set a combination of 'Bundle ID' and 'UUID or Specifire' of 'provisioning profiles' used when exporting .ipa files.}\" help=\"/plugin/xcode-plugin/help/help-appIDandProvisionUUID.html\" >\n                        <f:repeatable var=\"provisioningProfile\" name=\"provisioningProfiles\" items=\"${instance.provisioningProfiles}\" minimum=\"1\">\n                            <table width=\"100%\">\n                                <f:entry title=\"${%Bundle ID}\"\n                                    description=\"${%The bundle identifier} (App ID) ${%for this provisioning profile}\"\n                                    field=\"provisioningProfileAppId\"\n                                    help=\"/plugin/xcode-plugin/help/help-bundleID.html\" >\n                                    <f:textbox name=\"provisioningProfile.provisioningProfileAppId\" value=\"${provisioningProfile.provisioningProfileAppId}\" />\n                                </f:entry>\n                                <f:entry title=\"${%Provisioning profile UUID}\"\n                                    description=\"${%The UUID or Specifire of the provisioning profile associated to this bundle identifier.}\"\n                                    field=\"provisioningProfileUUID\"\n                                    help=\"/plugin/xcode-plugin/help/help-provisioningUUID.html\" >\n                                    <f:textbox name=\"provisioningProfile.provisioningProfileUUID\" value=\"${provisioningProfile.provisioningProfileUUID}\" />\n                                </f:entry>\n                                <f:entry title=\"\">\n                                    <div align=\"right\">\n                                        <f:repeatableDeleteButton />\n                                    </div>\n                                </f:entry>\n                            </table>\n                        </f:repeatable>\n                    </f:entry>\n                    <f:entry title=\"${%Copy provisioning profile}\"\n                         description=\"${%When the provisioning profile is specified in 'Provisioning profile UUID', copy the specified file to a predetermined place.}\"\n                         field=\"copyProvisioningProfile\"\n                         help=\"/plugin/xcode-plugin/help/help-copyProvisioningProfile.html\" >\n                         <f:checkbox title=\"${%Yes}\" field=\"copyProvisioningProfile\" checked=\"${instance.copyProvisioningProfile}\" default=\"true\" />\n                    </f:entry>\n                </f:radioBlock>\n            </f:entry>\n\n            <f:entry>\n                <f:optionalBlock inline=\"true\" checked=\"${instance.changeBundleID == true}\" name=\"changeBundleID\" field=\"changeBundleID\" title=\"${%Change bundle ID?}\">\n                    <f:nested>\n                        <table id=\"${UUID}\">\n                            <f:entry title=\"${%New bundle ID}\" field=\"bundleID\">\n                                <f:textbox />\n                            </f:entry>\n                            <f:entry title=\"${%Info.plist path}\" field=\"bundleIDInfoPlistPath\" description=\"${%Path to Info.plist file to be modified with the new bundle ID}\">\n                                <f:textbox />\n                            </f:entry>\n                        </table>\n                    </f:nested>\n                </f:optionalBlock>\n            </f:entry>\n\n            <f:entry>\n                <f:optionalBlock inline=\"true\" checked=\"${instance.unlockKeychain == true}\" name=\"unlockKeychain\" title=\"${%Unlock Keychain?}\" field=\"unlockKeychain\" help=\"/plugin/xcode-plugin/help/help-unlockKeychain.html\">\n                    <j:if test=\"${instance.keychainName!=null}\">\n                        <div class=\"alert alert-warning\">\n                            ${%The 'Configure System' keychain information is used but this is a deprecated method.}\n                            ${%From now on, please move keychain information to 'Credentials' instead of 'Configure System' and use it.}\n                        </div>\n                    </j:if>\n\t\t            <j:set var=\"UUID\" value=\"${descriptor.UUID}\" />\n                    <f:entry title=\"${%Keychain}\" description=\"${%The combination of path and password defined in 'Credentials' for unlocking the keychain used in this build.}\" field=\"credentialKeychainId\" help=\"/plugin/xcode-plugin/help/help-credentialKeychainId.html\">\n                        <j:invokeStatic var=\"keychainPasswordAndPaths\" className=\"au.com.rayh.KeychainPasswordAndPathImpl\" method=\"getAllKeycainInfo\"/>\n                        <select class=\"setting-input\" name=\"keychainId\" foo=\"${UID}\" id=\"credential-keychain-select-${UUID}\" onchange=\"showOrHideAttributeInput('credential-keychain-select-', '${UUID}')\">\n                            <f:option selected=\"${instance.keychainId==null}\" value=\"\">${%none} (${%specify one below})</f:option>\n                                <j:forEach var=\"keychain\" items=\"${keychainPasswordAndPaths}\">\n                                    <j:if test=\"${keychain.getId()==instance.keychainId}\">\n                                        <j:set var=\"displayCustomKeychainData\" value=\"none\" scope=\"parent\" />\n                                    </j:if>\n                                <f:option selected=\"${keychain.getId()==instance.keychainId}\" value=\"${keychain.getId()}\">${keychain.getDescription()}</f:option>\n                            </j:forEach>\n                        </select>\n                    </f:entry>\n\n                    <f:nested>\n                        <j:if test=\"${displayCustomKeychainData==null}\">\n                            <j:set var=\"displayCustomKeychainData\" value=\"block\" />\n                        </j:if>\n\n                        <table id=\"${UUID}\" style=\"display: ${displayCustomKeychainData}\">\n                            <f:entry title=\"${%Keychain path}\" field=\"keychainPath\" description=\"${%The path of the keychain to use to sign the IPA.}\">\n                                <f:textbox />\n                            </f:entry>\n\n                            <f:entry title=\"${%Keychain password}\" field=\"keychainPwd\" description=\"${%The password to use to unlock the keychain.}\">\n                                <f:password />\n                            </f:entry>\n                        </table>\n                    </f:nested>\n                </f:optionalBlock>\n            </f:entry>\n\n        </f:advanced>\n    </f:section>\n\n    <!-- Advanced build options -->\n    <f:section title=\"${%Advanced Xcode build options}\">\n        <f:advanced title=\"${%Advanced build settings}\">\n            <f:entry title=\"${%Clean test reports?}\" field=\"cleanTestReports\">\n                <f:checkbox title=\"${%Yes}\" name=\"cleanTestReports\" checked=\"${instance.cleanTestReports}\" />\n            </f:entry>\n\n            <f:entry title=\"${%SDK}\" field=\"sdk\" description=\"${%Leave empty for default SDK}\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%SYMROOT}\" field=\"symRoot\" description=\"${%Leave empty for default SYMROOT}\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Custom xcodebuild arguments}\" field=\"xcodebuildArguments\" description=\"${%Additional xcodebuild arguments}\">\n                <f:textarea name=\"xcodebuildArguments\" value=\"${instance.xcodebuildArguments}\" default=\"\" />\n            </f:entry>\n\n            <f:entry title=\"${%Xcode Workspace File}\" field=\"xcodeWorkspaceFile\" description=\"${%Only needed if you want to compile a workspace instead of a project.}\" help=\"/plugin/xcode-plugin/help/help-xcodeWorkspaceFile.html\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Xcode Project Directory}\" field=\"xcodeProjectPath\" description=\"${%Relative path within the workspace that contains the xcode project files.}\" help=\"/plugin/xcode-plugin/help/help-xcodeProjectPath.html\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Xcode Project File}\" field=\"xcodeProjectFile\" description=\"${%Only needed if there is more than one project file in the Xcode Project Directory}\" help=\"/plugin/xcode-plugin/help/help-xcodeProjectFile.html\">\n                <f:textbox />\n            </f:entry>\n\n            <f:entry title=\"${%Build output directory}\" field=\"buildDir\" description=\"${%The value to use for the BUILD_DIR setting.}\">\n                <f:textbox />\n            </f:entry>\n\n        </f:advanced>\n\n    </f:section>\n\n    <f:section title=\"${%Versioning}\">\n        <f:entry>\n            <f:optionalBlock inline=\"true\" checked=\"${instance.provideApplicationVersion == true}\" name=\"provideApplicationVersion\"\n                title=\"${%Provide version number and run avgtool?}\"\n                description=\"${%Checking this option will run avgtool and update the CFBundleVersion and CFBundleVersionShortString.}\">\n                <f:entry title=\"${%Marketing version}\" field=\"cfBundleShortVersionStringValue\"\n                    description=\"${%The value to use for CFBundleShortVersionString. Leave blank to use project's marketing number.}\">\n                    <f:textbox />\n                </f:entry>\n\n                <f:entry title=\"${%Technical version}\" field=\"cfBundleVersionValue\"\n                    description=\"${%The value to use for CFBundleVersion. Leave blank to use project's technical number.}\">\n                    <f:textbox />\n                </f:entry>\n            </f:optionalBlock>\n        </f:entry>\n    </f:section>\n\n</j:jelly>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/config_ja.properties",
    "content": "General\\ build\\ settings=\\u4E00\\u822C\\u7684\\u306A\\u30D3\\u30EB\\u30C9\\u8A2D\\u5B9A\nXcode\\ Tools\\ Version=Xcode tools\\u306E\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\nDefault=\\u30C7\\u30D5\\u30A9\\u30EB\\u30C8\nTarget=\\u30BF\\u30FC\\u30B2\\u30C3\\u30C8\nInterpret\\ As\\ Regular\\ Expression=\\u6B63\\u898F\\u8868\\u73FE\\u3092\\u8A55\\u4FA1\nGenerate\\ Archive?=\\u30A2\\u30FC\\u30AB\\u30A4\\u30D6\\u3092\\u4F5C\\u6210\nNo\\ Console\\ Log?=\\u30B3\\u30F3\\u30BD\\u30FC\\u30EB\\u30ED\\u30B0\\u3092\\u51FA\\u529B\\u3057\\u306A\\u3044\nLogfile\\ Output\\ directory=\\u30ED\\u30B0\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u51FA\\u529B\\u5148\nConfiguration=\nDevelopment\\ Team=\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0\nDevelopment\\ Team\\ ID=\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0\\u306EID\nPack\\ application,\\ build\\ and\\ sign\\ .ipa?=\\u30A2\\u30D7\\u30EA\\u30B1\\u30FC\\u30B7\\u30E7\\u30F3\\u3092\\u7F72\\u540D\\u3001\\u30D1\\u30C3\\u30AF\\u3057\\u3066.ipa\\u3092\\u4F5C\\u6210\nExport\\ Settings=\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\\u306E\\u8A2D\\u5B9A\nExport\\ method=\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\\u306E\\u65B9\\u6CD5\n.ipa\\ filename\\ pattern=.ipa\\u30D5\\u30A1\\u30A4\\u30EB\\u540D\\u306E\\u30D1\\u30BF\\u30FC\\u30F3\nOutput\\ directory=\\u51FA\\u529B\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\nProvisioning\\ Profiles=\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\nBundle\\ ID=\nUUID\\ or\\ Specifire=UUID\\u307E\\u305F\\u306F\\u8B58\\u5225\\u5B50\nCode\\ signing\\ &\\ OS\\ X\\ keychain\\ options=\\u30B3\\u30FC\\u30C9\\u7F72\\u540D\\u3068\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30AA\\u30D7\\u30B7\\u30E7\\u30F3\nNew\\ bundle\\ ID=\\u65B0\\u3057\\u3044Bundle ID\nInfo.plist\\ path=Info.plist\\u306E\\u30D1\\u30B9\nUnlock\\ Keychain?=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\nKeychain=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\nKeychain\\ path=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\nKeychain\\ password=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\nAdvanced\\ Xcode\\ build\\ options=Xcode\\u306E\\u4E0A\\u7D1A\\u30AA\\u30D7\\u30B7\\u30E7\\u30F3\nClean\\ test\\ reports?=\\u30C6\\u30B9\\u30C8\\u7D50\\u679C\\u3092\\u30AF\\u30EA\\u30FC\\u30F3\nXcode\\ Schema\\ File=Xcode Schema\\u30D5\\u30A1\\u30A4\\u30EB\nSDK=\nSYMROOT=\nCustom\\ xcodebuild\\ arguments=xcodebuild\\u306E\\u8FFD\\u52A0\\u30D1\\u30E9\\u30E1\\u30FC\\u30BF\\u30FC\nXcode\\ Workspace\\ File=Xcode Workspace\\u30D5\\u30A1\\u30A4\\u30EB\nXcode\\ Project\\ Directory=Xcode\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306E\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\nXcode\\ Project\\ File=Xcode Project\\u30D5\\u30A1\\u30A4\\u30EB\nBuild\\ output\\ directory=\\u30D3\\u30EB\\u30C9\\u306E\\u51FA\\u529B\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\nVersioning=\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u64CD\\u4F5C\nProvide\\ version\\ number\\ and\\ run\\ avgtool?=avgtool\\u3092\\u4F7F\\u7528\\u3057\\u3066\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u3092\\u64CD\\u4F5C\nMarketing\\ version=\\u30DE\\u30FC\\u30B1\\u30C6\\u30A3\\u30F3\\u30B0\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\nTechnical\\ version=\\u30C6\\u30AF\\u30CB\\u30AB\\u30EB\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\nLeave\\ empty\\ for\\ all\\ targets=\\u4F55\\u3082\\u8A2D\\u5B9A\\u3057\\u306A\\u3044\\u3068\\u5168\\u3066\\u306E\\u30BF\\u30FC\\u30B2\\u30C3\\u30C8\nA\\ pattern\\ for\\ the\\ ipa\\ file\\ name.\\ You\\ may\\ use=.ipa\\u30D5\\u30A1\\u30A4\\u30EB\\u540D\\u306E\\u30D1\\u30BF\\u30FC\\u30F3\nand=\\u305D\\u3057\\u3066\nin\\ this\\ string=\\u304C\\u4F7F\\u3048\\u307E\\u3059\\u3002\nProvisioning\\ profile\\ UUID=\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u306EUUID\nSettings=\\u8A2D\\u5B9A\nClean\\ before\\ build?=\\u30D3\\u30EB\\u30C9\\u524D\\u306B\\u6D88\\u53BB\nThis\\ will\\ delete\\ the\\ build\\ directories\\ before\\ invoking\\ the\\ build.=\\u30D3\\u30EB\\u30C9\\u3092\\u5B9F\\u884C\\u3059\\u308B\\u524D\\u306B\\u30D3\\u30EB\\u30C9\\u4F5C\\u696D\\u7528\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u3092\\u6D88\\u53BB\\u3057\\u307E\\u3059\nYes=\\u306F\\u3044\nChecking\\ this\\ option\\ will\\ prevent\\ this\\ build\\ step\\ from\\ failing\\ if\\ xcodebuild\\ exits\\ with\\ a\\ non-zero\\ return\\ code.=\\u3053\\u306E\\u30AA\\u30D7\\u30B7\\u30E7\\u30F3\\u304C\\u30AA\\u30F3\\u306A\\u3089xcodebuild\\u306E\\u7D42\\u4E86\\u5024\\u304C0\\u4EE5\\u5916\\u3067\\u3082\\u51E6\\u7406\\u3092\\u7D9A\\u884C\\u3057\\u307E\\u3059\\u3002\nAllow\\ failing\\ build\\ results?=\\u51E6\\u7406\\u306B\\u5931\\u6557\\u3057\\u3066\\u3082\\u7D9A\\u884C\nChecking\\ this\\ option\\ will\\ generate\\ an\\ xcarchive\\ of\\ the\\ specified\\ scheme.\\ A\\ workspace\\ and\\ scheme\\ are\\ are\\ also\\ needed\\ for\\ archives=\\u3053\\u306E\\u30AA\\u30D7\\u30B7\\u30E7\\u30F3\\u304C\\u30AA\\u30F3\\u306A\\u3089\\u6307\\u5B9A\\u3055\\u308C\\u305F\\u30B9\\u30AD\\u30FC\\u30E0\\u306Excarchive\\u304C\\u751F\\u6210\\u3055\\u308C\\u307E\\u3059\\u3002 \\u30A2\\u30FC\\u30AB\\u30A4\\u30D6\\u306B\\u306Fworkspace\\u3068Schema\\u3082\\u5FC5\\u8981\\u3067\\u3059\\u3002\nChecking\\ this\\ option\\ will\\ not\\ log\\ xcode\\ build\\ output\\ to\\ console\\ output.=\\u3053\\u306E\\u30AA\\u30D7\\u30B7\\u30E7\\u30F3\\u304C\\u30AA\\u30F3\\u306A\\u3089xcodebuild\\u304B\\u3089\\u306E\\u30B3\\u30F3\\u30BD\\u30FC\\u30EB\\u51FA\\u529B\\u3092\\u30ED\\u30B0\\u306B\\u8A18\\u9332\\u3057\\u307E\\u305B\\u3093\\u3002\nLeave\\ empty\\ for\\ Log\\ to\\ project-directory/logs.\\ The\\ output\\ directory\\ for\\ the\\ separate\\ logfile,\\ relative\\ to\\ the\\ project-directory.=\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA/Logs\\u306B\\u30ED\\u30B0\\u3092\\u8A18\\u9332\\u3059\\u308B\\u5834\\u5408\\u306F\\u7A7A\\u306E\\u307E\\u307E\\u306B\\u3057\\u307E\\u3059\\u3002 \\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u3092\\u8D77\\u70B9\\u3068\\u3057\\u305F\\u5225\\u306E\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u306B\\u30ED\\u30B0\\u3092\\u51FA\\u529B\\u3057\\u305F\\u3044\\u5834\\u5408\\u306B\\u6307\\u5B9A\\u3057\\u307E\\u3059\\u3002\nThis\\ is\\ the\\ name\\ of\\ the\\ configuration\\ as\\ defined\\ in\\ the\\ Xcode\\ project.=Xcode\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u3067\\u5B9A\\u7FA9\\u3055\\u308C\\u3066\\u3044\\u308B\\u30B3\\u30F3\\u30D5\\u30A3\\u30B0\\u30EC\\u30FC\\u30B7\\u30E7\\u30F3\\u306E\\u540D\\u524D\\u3092\\u6307\\u5B9A\\u3057\\u307E\\u3059\\u3002\nManual\\ signing?=\\u624B\\u52D5\\u3067\\u30B3\\u30FC\\u30C9\\u7F72\\u540D\\u3092\\u884C\\u306A\\u3046\nOverride\\ the\\ Development\\ Team\\ specified\\ in\\ the\\ project.=\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u3067\\u6307\\u5B9A\\u3055\\u308C\\u3066\\u3044\\u308B\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0\\u3092\\u7121\\u8996\\u3057\\u3066\\u4E0A\\u66F8\\u304D\\u3057\\u307E\\u3059\\u3002\nnone=\\u672A\\u9078\\u629E\nspecify\\ one\\ below=\\u6B21\\u3067\\u6307\\u5B9A\nThe\\ ID\\ of\\ the\\ Apple\\ development\\ team\\ to\\ use\\ to\\ sign\\ the\\ IPA.=.ipa\\u306B\\u30B3\\u30FC\\u30C9\\u7F72\\u540D\\u3059\\u308B\\u306E\\u306B\\u4F7F\\u3046\\u958B\\u767A\\u8005\\u30C1\\u30FC\\u30E0ID\\u3067\\u3059\\u3002\nChecking\\ this\\ option\\ will\\ create\\ a\\ .ipa\\ for\\ each\\ .app\\ found\\ in\\ the\\ build\\ directory.=\\u3053\\u306E\\u30AA\\u30D7\\u30B7\\u30E7\\u30F3\\u304C\\u30AA\\u30F3\\u306A\\u3089\\u30D3\\u30EB\\u30C9\\u4F5C\\u696D\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u3067\\u307F\\u3064\\u304B\\u3063\\u305F\\u5168\\u3066\\u306E.app\\u3092.ipa\\u306B\\u3059\\u3057\\u307E\\u3059\\u3002\n.ipa\\ Export\\ Settings=.ipa\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\\u8A2D\\u5B9A\nThe\\ export\\ method\\ of\\ the\\ .app\\ to\\ generate\\ the\\ .ipa\\ file.\\ Should\\ be\\ one\\ in\\ 'development',\\ 'ad-hoc',\\ 'enterprise'\\ or\\ 'app-store'.=.app\\u304B\\u3089.ipa\\u3092\\u751F\\u6210\\u3059\\u308B\\u969B\\u306E\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\\u65B9\\u6CD5\\u3092'development'\\u3001'ad-hoc'\\u3001'enterprise'\\u3001'app-store'\\u306E\\u3044\\u305A\\u308C\\u304B\\u3067\\u6307\\u5B9A\\u3057\\u307E\\u3059\\u3002\nThe\\ output\\ directory\\ for\\ the\\ .ipa\\ file,\\ relative\\ to\\ the\\ build\\ directory.=.ipa\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u51FA\\u529B\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u3092\\u30D3\\u30EB\\u30C9\\u4F5C\\u696D\\u7528\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA(build)\\u304B\\u3089\\u306E\\u76F8\\u5BFE\\u30D1\\u30B9\\u3067\\u6307\\u5B9A\\u3057\\u307E\\u3059\\u3002\nManifest\\ Plist\\ URL=Manifest Plist\\u306EURL\nThe\\ base\\ URL\\ to\\ use\\ to\\ create\\ a\\ Manifest\\ Plist.\\ If\\ omitted\\ no\\ Manifest\\ Plist\\ will\\ be\\ generated=Manifest Plist\\u306B\\u5229\\u7528\\u3059\\u308BURL\\u3092\\u6307\\u5B9A\\u3057\\u307E\\u3059\\u3002Manifest Plist\\u304C\\u4E0D\\u8981\\u306A\\u3089\\u8A2D\\u5B9A\\u3057\\u307E\\u305B\\u3093\\u3002\nSet\\ a\\ combination\\ of\\ 'Bundle\\ ID'\\ and\\ 'UUID\\ or\\ Specifire'\\ of\\ 'provisioning\\ profiles'\\ used\\ when\\ exporting\\ .ipa\\ files.=.ipa\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u969B\\u306B\\u5229\\u7528\\u3059\\u308BBundle ID\\u3068\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EBUUID\\u307E\\u305F\\u306F\\u8B58\\u5225\\u5B50\\u306E\\u7D44\\u307F\\u5408\\u308F\\u305B\\u3092\\u8A2D\\u5B9A\\u3057\\u307E\\u3059\\u3002\nThe\\ bundle\\ identifier=Bundle ID\nfor\\ this\\ provisioning\\ profile=\\u3053\\u306E\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3068\\u7D44\\u307F\\u3068\\u306A\\u308B\\u30A2\\u30D7\\u30EA\\u3092\\u8B58\\u5225\\u3057\\u307E\\u3059\\u3002\nThe\\ UUID\\ or\\ Specifire\\ of\\ the\\ provisioning\\ profile\\ associated\\ to\\ this\\ bundle\\ identifier.=Bundle ID\\u3068\\u7D44\\u307F\\u306B\\u306A\\u308B\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u306EUUID\\u307E\\u305F\\u306F\\u8B58\\u5225\\u5B50\\u3002\nCode\\ signing\\ settings=\\u30B3\\u30FC\\u30C9\\u7F72\\u540D\\u306E\\u8A2D\\u5B9A\nChange\\ bundle\\ ID?=Bundle ID\\u306E\\u5909\\u66F4\nPath\\ to\\ Info.plist\\ file\\ to\\ be\\ modified\\ with\\ the\\ new\\ bundle\\ ID=Bundle ID\\u3092\\u5909\\u66F4\\u3057\\u305FInfo.plist\\u30D5\\u30A1\\u30A4\\u30EB\\u306E\\u51FA\\u529B\\u30D1\\u30B9\nThe\\ globally\\ configured\\ keychain\\ to\\ unlock\\ for\\ this\\ build.=\\u3053\\u306E\\u30D3\\u30EB\\u30C9\\u3067\\u4F7F\\u3046\\u305F\\u3081\\u306B\\u30ED\\u30C3\\u30AF\\u3092\\u89E3\\u9664\\u3059\\u308B\\u30B0\\u30ED\\u30FC\\u30D0\\u30EB\\u8A2D\\u5B9A\\u3055\\u308C\\u305F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3002\nThe\\ path\\ of\\ the\\ keychain\\ to\\ use\\ to\\ sign\\ the\\ IPA.=.ipa\\u306B\\u30B3\\u30FC\\u30C9\\u7F72\\u540D\\u3092\\u884C\\u306A\\u3046\\u306E\\u306B\\u4F7F\\u7528\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30D1\\u30B9\\u3002\nThe\\ password\\ to\\ use\\ to\\ unlock\\ the\\ keychain.=\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u30ED\\u30C3\\u30AF\\u3092\\u89E3\\u9664\\u3059\\u308B\\u305F\\u3081\\u306E\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u3002\nAdvanced\\ build\\ settings=\\u4E0A\\u7D1A\\u30D3\\u30EB\\u30C9\\u8A2D\\u5B9A\nNeeded\\ if\\ you\\ want\\ to\\ compile\\ for\\ a\\ specific\\ schema\\ instead\\ of\\ a\\ target,\\ or\\ if\\ you\\ want\\ to\\ generate\\ an\\ archive\\ or\\ an\\ IPA.=\\u30BF\\u30FC\\u30B2\\u30C3\\u30C8\\u3067\\u306F\\u306A\\u304F\\u7279\\u5B9A\\u306E\\u30B9\\u30AD\\u30FC\\u30DE\\u7528\\u306B\\u30B3\\u30F3\\u30D1\\u30A4\\u30EB\\u3059\\u308B\\u5834\\u5408\\u3001\\u307E\\u305F\\u306F\\u30A2\\u30FC\\u30AB\\u30A4\\u30D6\\u307E\\u305F\\u306F.ipa\\u3092\\u751F\\u6210\\u3059\\u308B\\u5834\\u5408\\u306B\\u5FC5\\u8981\\u3067\\u3059\\u3002\nLeave\\ empty\\ for\\ default\\ SDK=\\u30C7\\u30D5\\u30A9\\u30EB\\u30C8\\u306ESDK\\u3092\\u4F7F\\u3046\\u5834\\u5408\\u306B\\u306F\\u7A7A\\u767D\\u306E\\u307E\\u307E\\u306B\\u3057\\u307E\\u3059\\u3002\nLeave\\ empty\\ for\\ default\\ SYMROOT=\\u30C7\\u30D5\\u30A9\\u30EB\\u30C8\\u306ESYMROOT\\u3092\\u4F7F\\u3046\\u5834\\u5408\\u306B\\u306F\\u7A7A\\u767D\\u306E\\u307E\\u307E\\u306B\\u3057\\u307E\\u3059\\u3002\nAdditional\\ xcodebuild\\ arguments=xcodebuild\\u306B\\u8FFD\\u52A0\\u3059\\u308B\\u5F15\\u6570\nOnly\\ needed\\ if\\ you\\ want\\ to\\ compile\\ a\\ workspace\\ instead\\ of\\ a\\ project.=\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306E\\u4EE3\\u308F\\u308A\\u306B\\u30EF\\u30FC\\u30AF\\u30B9\\u30DA\\u30FC\\u30B9\\u3092\\u30B3\\u30F3\\u30D1\\u30A4\\u30EB\\u3059\\u308B\\u5834\\u5408\\u306B\\u306E\\u307F\\u5FC5\\u8981\\u3067\\u3059\\u3002\nRelative\\ path\\ within\\ the\\ workspace\\ that\\ contains\\ the\\ xcode\\ project\\ files.=xcode\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u542B\\u3080\\u30EF\\u30FC\\u30AF\\u30B9\\u30DA\\u30FC\\u30B9\\u5185\\u306E\\u76F8\\u5BFE\\u30D1\\u30B9\\u3002\nOnly\\ needed\\ if\\ there\\ is\\ more\\ than\\ one\\ project\\ file\\ in\\ the\\ Xcode\\ Project\\ Directory=Xcode\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u306B\\u8907\\u6570\\u306E\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u30D5\\u30A1\\u30A4\\u30EB\\u304C\\u3042\\u308B\\u5834\\u5408\\u306B\\u306E\\u307F\\u5FC5\\u8981\\u3067\\u3059\nThe\\ value\\ to\\ use\\ for\\ the\\ BUILD_DIR\\ setting.=BUILD_DIR\\u8A2D\\u5B9A\\u306B\\u4F7F\\u7528\\u3059\\u308B\\u5024\\u3002\nChecking\\ this\\ option\\ will\\ run\\ avgtool\\ and\\ update\\ the\\ CFBundleVersion\\ and\\ CFBundleVersionShortString.=\nThe\\ value\\ to\\ use\\ for\\ CFBundleShortVersionString.\\ Leave\\ blank\\ to\\ use\\ project's\\ marketing\\ number.=CFBundleShortVersionString\\u306B\\u4F7F\\u7528\\u3059\\u308B\\u5024\\u3002 \\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306E\\u30DE\\u30FC\\u30B1\\u30C6\\u30A3\\u30F3\\u30B0\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u3092\\u4F7F\\u7528\\u3059\\u308B\\u306B\\u306F\\u7A7A\\u767D\\u306E\\u307E\\u307E\\u306B\\u3057\\u307E\\u3059\\u3002\nThe\\ value\\ to\\ use\\ for\\ CFBundleVersion.\\ Leave\\ blank\\ to\\ use\\ project's\\ technical\\ number.=CFBundleVersion\\u306B\\u4F7F\\u7528\\u3059\\u308B\\u5024\\u3002 \\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306E\\u30C6\\u30AF\\u30CB\\u30AB\\u30EB\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\\u3092\\u4F7F\\u7528\\u3059\\u308B\\u5834\\u5408\\u306F\\u7A7A\\u767D\\u306E\\u307E\\u307E\\u306B\\u3057\\u307E\\u3059\\u3002\nSystem\\ Default=\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\nAutomatic\\ Signing=\\u81EA\\u52D5\\u7F72\\u540D\nRead\\ from\\ Xcode\\ Project=\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u306B\\u5F93\\u3046\nManual\\ signing=\\u624B\\u52D5\\u3067\\u8A2D\\u5B9A\nXcode\\ Tools\\ version.=Xcode tools\\u306E\\u30D0\\u30FC\\u30B8\\u30E7\\u30F3\nif\\ you\\ need\\ to\\ override\\ System\\ Default=\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u3092\\u5909\\u66F4\\u3057\\u305F\\u3044\\u5834\\u5408\nProvisioning\\ profiles=\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\nUpload\\ Bitcode?=Bitcode\\u3092\\u30A2\\u30C3\\u30D7\\u30ED\\u30FC\\u30C9\nIf\\ checked,\\ include\\ Bitcode\\ when\\ exporting\\ applications\\ to\\ IPA.=\\u30C1\\u30A7\\u30C3\\u30AF\\u3055\\u308C\\u3066\\u3044\\u308B\\u306A\\u3089\\u3001\\u51FA\\u529B\\u3059\\u308BIPA\\u30D5\\u30A1\\u30A4\\u30EB\\u306BBotcode\\u3092\\u542B\\u3081\\u307E\\u3059\\u3002\nUpload\\ Symbols?=\\u30B7\\u30F3\\u30DC\\u30EB\\u3092\\u30A2\\u30C3\\u30D7\\u30ED\\u30FC\\u30C9\nIf\\ checked,\\ include\\ symbols\\ when\\ exporting\\ applications\\ to\\ IPA.=\\u30C1\\u30A7\\u30C3\\u30AF\\u3055\\u308C\\u3066\\u3044\\u308B\\u306A\\u3089\\u3001\\u51FA\\u529B\\u3059\\u308BIPA\\u30D5\\u30A1\\u30A4\\u30EB\\u306B\\u30B7\\u30F3\\u30DC\\u30EB\\u3092\\u542B\\u3081\\u307E\\u3059\\u3002\nCompile\\ Bitcode?=Bitcode\\u3092\\u30B3\\u30F3\\u30D1\\u30A4\\u30EB\nIf\\ checked,\\ recompile\\ from\\ Bitcode\\ when\\ exporting\\ the\\ application\\ to\\ IPA.=\\u30C1\\u30A7\\u30C3\\u30AF\\u3055\\u308C\\u3066\\u3044\\u308B\\u306A\\u3089\\u3001\\u30A2\\u30D7\\u30EA\\u30B1\\u30FC\\u30B7\\u30E7\\u30F3\\u3092IPA\\u306B\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u969B\\u306BBitcode\\u304B\\u3089\\u518D\\u30B3\\u30F3\\u30D1\\u30A4\\u30EB\\u3057\\u307E\\u3059\\u3002\nThinning=\\u6700\\u9069\\u5316\nWhen\\ doing\\ Thinning,\\ specify\\ the\\ target\\ device\\ for\\ thinning.=\\u6700\\u9069\\u5316\\u3092\\u884C\\u306A\\u3044\\u305F\\u3044\\u5834\\u5408\\u306B\\u306F\\u3001\\u5BFE\\u8C61\\u3068\\u306A\\u308B\\u30C7\\u30D0\\u30A4\\u30B9\\u3092\\u6307\\u5B9A\\u3057\\u307E\\u3059\\u3002\nDisplay\\ image\\ URL=\\u8868\\u793A\\u3059\\u308B\\u30A4\\u30E1\\u30FC\\u30B8\\u306EURL\nSpecify\\ the\\ URL\\ of\\ the\\ 57\\ pixel\\ size\\ png\\ image\\ to\\ be\\ displayed\\ in\\ the\\ IPA\\ installation.=IPA\\u306E\\u30A4\\u30F3\\u30B9\\u30C8\\u30FC\\u30EB\\u3067\\u8868\\u793A\\u3059\\u308B57\\u30D4\\u30AF\\u30BB\\u30EB\\u30B5\\u30A4\\u30BA\\u306Epng\\u30A4\\u30E1\\u30FC\\u30B8\\u306EURL\\u3092\\u6307\\u5B9A\\u3057\\u307E\\u3059\\u3002\nFull\\ size\\ image\\ URL=\\u30D5\\u30EB\\u30B5\\u30A4\\u30BA\\u30A4\\u30E1\\u30FC\\u30B8\\u306EURL\nSpecify\\ the\\ URL\\ of\\ the\\ 512\\ pixel\\ size\\ png\\ image\\ to\\ be\\ displayed\\ in\\ the\\ IPA\\ installation.=IPA\\u306E\\u30A4\\u30F3\\u30B9\\u30C8\\u30FC\\u30EB\\u3067\\u8868\\u793A\\u3059\\u308B512\\u30D4\\u30AF\\u30BB\\u30EB\\u30B5\\u30A4\\u30BA\\u306Epng\\u30A4\\u30E1\\u30FC\\u30B8\\u306EURL\\u3092\\u6307\\u5B9A\\u3057\\u307E\\u3059\\u3002\nPack\\ on\\ demand\\ resources?=\\u30AA\\u30F3\\u30C7\\u30DE\\u30F3\\u30C9\\u30EA\\u30BD\\u30FC\\u30B9\\u3092\\u542B\\u3081\\u308B\nIf\\ checked,\\ include\\ on\\ demand\\ resource\\ assets\\ to\\ the\\ bundle.=\\u30C1\\u30A7\\u30C3\\u30AF\\u3055\\u308C\\u3066\\u3044\\u308B\\u306A\\u3089\\u3001\\u30AA\\u30F3\\u30C7\\u30DE\\u30F3\\u30C9\\u30EA\\u30BD\\u30FC\\u30B9\\u30A2\\u30BB\\u30C3\\u30C8\\u3092\\u30D0\\u30F3\\u30C9\\u30EB\\u306B\\u542B\\u3081\\u307E\\u3059\\u3002\nOn\\ demand\\ resources\\ asset\\ URL=\\u30AA\\u30F3\\u30C7\\u30DE\\u30F3\\u30C9\\u30EA\\u30BD\\u30FC\\u30B9\\u306EURL\nSet\\ the\\ base\\ URL\\ for\\ downloading\\ resource\\ assets\\ when\\ the\\ resource\\ asset\\ is\\ not\\ included\\ in\\ the\\ bundle\\ in\\ the\\ application\\ using\\ the\\ on\\ demand\\ resource.=\\u30AA\\u30F3\\u30C7\\u30DE\\u30F3\\u30C9\\u30EA\\u30BD\\u30FC\\u30B9\\u3092\\u4F7F\\u7528\\u3057\\u3066\\u3044\\u3066\\u3001\\u30A2\\u30D7\\u30EA\\u30B1\\u30FC\\u30B7\\u30E7\\u30F3\\u5185\\u306E\\u30D0\\u30F3\\u30C9\\u30EB\\u306B\\u30EA\\u30BD\\u30FC\\u30B9\\u30A2\\u30BB\\u30C3\\u30C8\\u304C\\u542B\\u307E\\u308C\\u3066\\u3044\\u306A\\u3044\\u5834\\u5408\\u3001\\u30EA\\u30BD\\u30FC\\u30B9\\u30A2\\u30BB\\u30C3\\u30C8\\u3092\\u30C0\\u30A6\\u30F3\\u30ED\\u30FC\\u30C9\\u3059\\u308B\\u305F\\u3081\\u306E\\u30D9\\u30FC\\u30B9URL\\u3092\\u8A2D\\u5B9A\\u3057\\u307E\\u3059\\u3002\nApplication\\ URL=\\u30A2\\u30D7\\u30EA\\u30B1\\u30FC\\u30B7\\u30E7\\u30F3\\u306EURL\nAsset\\ pack\\ URL=\\u30A2\\u30BB\\u30C3\\u30C8\\u30D1\\u30C3\\u30AF\\u306EURL\nSpecify\\ the\\ base\\ URL\\ of\\ the\\ downloading\\ asset\\ pack.=\\u30A2\\u30BB\\u30C3\\u30C8\\u30D1\\u30C3\\u30AF\\u3092\\u30C0\\u30A6\\u30F3\\u30ED\\u30FC\\u30C9\\u3059\\u308B\\u305F\\u3081\\u306E\\u30D9\\u30FC\\u30B9URL\nStrip\\ Swift\\ Symbols?=Swift\\u306E\\u30B7\\u30F3\\u30DC\\u30EB\\u3092\\u524A\\u9664\nIf\\ checked,\\ symbols\\ be\\ stripped\\ from\\ Swift\\ libraries\\ when\\ exporting\\ the\\ application\\ to\\ IPA.=\\u30C1\\u30A7\\u30C3\\u30AF\\u3055\\u308C\\u3066\\u3044\\u308B\\u306A\\u3089\\u3001\\u30A2\\u30D7\\u30EA\\u30B1\\u30FC\\u30B7\\u30E7\\u30F3\\u3092IPA\\u306B\\u30A8\\u30AF\\u30B9\\u30DD\\u30FC\\u30C8\\u3059\\u308B\\u969B\\u306BIPA\\u304B\\u3089Swift\\u306E\\u30B7\\u30F3\\u30DC\\u30EB\\u3092\\u524A\\u9664\\u3057\\u307E\\u3059\\u3002\nCopy\\ provisioning\\ profile=\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u3092\\u30B3\\u30D4\\u30FC\\u3059\\u308B\nWhen\\ the\\ provisioning\\ profile\\ is\\ specified\\ in\\ 'Provisioning\\ profile\\ UUID',\\ copy\\ the\\ specified\\ file\\ to\\ a\\ predetermined\\ place.=\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EB\\u304C\\u300C\\u30D7\\u30ED\\u30D3\\u30B8\\u30E7\\u30CB\\u30F3\\u30B0\\u30D7\\u30ED\\u30D5\\u30A1\\u30A4\\u30EBUUID\\u300D\\u306B\\u6307\\u5B9A\\u3055\\u308C\\u3066\\u3044\\u308B\\u5834\\u5408\\u3001\\u6307\\u5B9A\\u3055\\u308C\\u305F\\u30D5\\u30A1\\u30A4\\u30EB\\u304C\\u6240\\u5B9A\\u306E\\u5834\\u6240\\u306B\\u30B3\\u30D4\\u30FC\\u3055\\u308C\\u307E\\u3059\\u3002\nUse\\ Legacy\\ Build\\ System?=\\u65E7\\u6765\\u306E\\u30D3\\u30EB\\u30C9\\u30B7\\u30B9\\u30C6\\u30E0\\u3092\\u4F7F\\u7528\\u3059\\u308B\nUse\\ the\\ old\\ 'Legacy\\ Build\\ System'\\ instead\\ of\\ 'New\\ Build\\ System'\\ of\\ Xcode\\ 9\\ and\\ later.=Xcode 9\\u4EE5\\u964D\\u306E New Build System \\u306E\\u4EE3\\u308F\\u308A\\u306B\\u53E4\\u3044 Legacy Build System \\u3092\\u4F7F\\u7528\\u3057\\u307E\\u3059\\u3002\nLeave\\ empty,\\ it\\ will\\ not\\ output\\ a\\ test\\ result\\ and\\ will\\ not\\ analyze\\ the\\ test\\ results.\\ relative\\ to\\ the\\ project-directory.=\\u30C6\\u30B9\\u30C8\\u7D50\\u679C\\u306E\\u6982\\u8981\\u3092\\u51FA\\u529B\\u3057\\u306A\\u3044\\u5834\\u5408\\u306B\\u306F\\u7A7A\\u306E\\u307E\\u307E\\u306B\\u3057\\u307E\\u3059\\u3002\\u30D7\\u30ED\\u30B8\\u30A7\\u30AF\\u30C8\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u3092\\u8D77\\u70B9\\u3068\\u3057\\u305F\\u5225\\u306E\\u30C7\\u30A3\\u30EC\\u30AF\\u30C8\\u30EA\\u306B\\u30C6\\u30B9\\u30C8\\u7D50\\u679C\\u306E\\u6982\\u8981\\u3092\\u51FA\\u529B\\u3057\\u305F\\u3044\\u5834\\u5408\\u306B\\u6307\\u5B9A\\u3057\\u307E\\u3059\\u3002\nClean\\ ResultBundlePath?=ResultBundlePath\\u3092\\u6D88\\u53BB\nThis\\ will\\ delete\\ the\\ ResultBundlePath\\ before\\ invoking\\ the\\ build.=\\u30D3\\u30EB\\u30C9\\u3092\\u5B9F\\u884C\\u3059\\u308B\\u524D\\u306BResultBundlePath\\u3092\\u6D88\\u53BB\\u3057\\u307E\\u3059\nThe\\ 'Configure\\ System'\\ keychain\\ information\\ is\\ used\\ but\\ this\\ is\\ a\\ deprecated\\ method.=\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u306E\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u60C5\\u5831\\u304C\\u4F7F\\u308F\\u308C\\u3066\\u3044\\u307E\\u3059\\u304C\\u3001\\u73FE\\u5728\\u306F\\u3053\\u308C\\u306F\\u975E\\u63A8\\u5968\\u306E\\u65B9\\u6CD5\\u3067\\u3059\\u3002\nFrom\\ now\\ on,\\ please\\ move\\ keychain\\ information\\ to\\ 'Credentials'\\ instead\\ of\\ 'Configure\\ System'\\ and\\ use\\ it.=\\u4ECA\\u5F8C\\u306F\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u306E\\u60C5\\u5831\\u306F\\u300C\\u30B7\\u30B9\\u30C6\\u30E0\\u306E\\u8A2D\\u5B9A\\u300D\\u3067\\u306F\\u306A\\u304F\\u300C\\u8A8D\\u8A3C\\u60C5\\u5831\\u300D\\u306B\\u8A2D\\u5B9A\\u3057\\u3066\\u3001\\u305D\\u308C\\u3092\\u5229\\u7528\\u3059\\u308B\\u3088\\u3046\\u306B\\u3057\\u3066\\u304F\\u3060\\u3055\\u3044\\u3002\nThe\\ combination\\ of\\ path\\ and\\ password\\ defined\\ in\\ 'Credentials'\\ for\\ unlocking\\ the\\ keychain\\ used\\ in\\ this\\ build.=\\u3053\\u306E\\u30D3\\u30EB\\u30C9\\u3067\\u4F7F\\u7528\\u3059\\u308B\\u30AD\\u30FC\\u30C1\\u30A7\\u30FC\\u30F3\\u3092\\u30A2\\u30F3\\u30ED\\u30C3\\u30AF\\u3059\\u308B\\u305F\\u3081\\u306E\\u300C\\u8A8D\\u8A3C\\u60C5\\u5831\\u300D\\u3067\\u5B9A\\u7FA9\\u3055\\u308C\\u305F\\u3001\\u30D1\\u30B9\\u3068\\u30D1\\u30B9\\u30EF\\u30FC\\u30C9\\u306E\\u7D44\\u307F\\u5408\\u308F\\u305B\\u3002"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-allowFailingBuildResults.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2013 Tim Ekl\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    Checking this option will prevent a build step from failing if <tt>xcodebuild</tt> exits with a non-zero return code.<br/>\n    This can be useful for build steps that run unit tests and also have a post-build task to publish unit test results: the test step will not fail the entire build for a failing unit test, but will instead mark the build unstable in the \"publish test\" phase.<br/>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-allowFailingBuildResults_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2013 Tim Ekl\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    このオプションをチェックすると、<tt>xcodebuild</tt>がゼロ以外のリターンコードで終了するとビルドステップが失敗するのを防ぐことができます。<br/>\n    これはユニットテストを実行するビルドステップや、ユニットテスト結果を公開するビルド後のタスクを実行させるのに有用です。<br/>\n    テストステップでは失敗したユニットテストでビルド全体が失敗することはありませんが、代わりにテストを公開する段階で不安定となります。<br/>\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-buildDir.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>The value to use for the BUILD_DIR setting. You only need to supply this value if you want the product\n        of the Xcode build to be in a location other than the one specified in project settings and this job 'SYMROOT'\n        parameter.<br/>\n        Supports all macros and also environment and\n        <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">build variables</a> from\n        the <a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token Macro Plugin</a>.<br/>\n        For example you can use the value :<br/>\n    </p>\n    <pre>${WORKSPACE}/build</pre>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-buildDir_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>BUILD_DIRに使用する値を設定します。 Xcodeビルドの出力をプロジェクト設定で指定された場所や、このジョブの'SYMROOT'パラメータ以外の場所に変更する場合のみこの値を指定する必要があります。<br/>\n    <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">ビルド変数</a>に説明されている全ての環境変数と<a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token Macro Plugin</a>で説明されている全てのマクロを使うことができます。<br/>\n    例えば次のような値を使用できます:<br/>\n    </p>\n    <pre>${WORKSPACE}/build</pre>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-buildIpa.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    Checking this option will create a .ipa for each .app found in the build directory.<br/>\n    An .ipa is basically a zipped up .app.<br/>\n    This is quite handy for distributing ad-hoc builds to testers as they can just double-click the .ipa and it will import into iTunes.</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-buildIpa_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    このオプションを選択するとビルドディレクトリにある.appごとに.ipaが作成されます。<br/>\n    .ipaは基本的に圧縮された.appです。<br/>\n    これは.ipaをダブルクリックするだけでiTunesにインポートしたり、AdHocビルドをテスターに配布するのにとても便利です。</p>\n    Checking this option will create a .ipa for each .app found in the build directory.<br/>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-bundleID.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2014 Esteban Bouza Padin\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    The new bundle ID. Usually something like com.companyname.projectname.\n  </p>\n\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-bundleIDInfoPlistPath.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2014 Esteban Bouza Padin\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    The path to the info.plist file which contains the CFBundleIdentifier of your project.<br/>\n    Usually something like:\n  </p>\n  <ul>\n    <li>\n      ${WORKSPACE}/ProjectName/Project-Info.plist\n    </li>\n  </ul>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-bundleIDInfoPlistPath_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2014 Esteban Bouza Padin\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    プロジェクトのCFBundleIdentifierを含むinfo.plistファイルへのパス。<br/>\n    通常は次の様な形式です:\n  </p>\n  <ul>\n    <li>\n      ${WORKSPACE}/ProjectName/Project-Info.plist\n    </li>\n  </ul>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-bundleID_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2014 Esteban Bouza Padin\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    新しいバンドルID。 通常はcom.companyname.projectnameのような形式です。\n  </p>\n\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-cfBundleShortVersionStringValue.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    This will set the CFBundleShortVersionString to the specified string.<br/>\n      Supports all macros and also environment and <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">build variables</a> from the <a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token Macro Plugin</a>.<br/>\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-cfBundleShortVersionStringValue_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    CFBundleShortVersionStringを指定された文字列に設定します。<br/>\n      <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">ビルド変数</a>で説明されている全ての環境変数と<a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token Macro Plugin</a>で説明されている全てのマクロを使うことができます。<br/>\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-cfBundleVersionValue.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    This will set the CFBundleVersion to the specified string.<br/>\n    Supports all macros and also environment and <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">build variables</a> from the <a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token Macro Plugin</a>.<br/>\n    For example the value ${BUILD_NUMBER} will be replaced with the current build number.<br/>\n    We advice you to generate a unique value for each build if you want for example deploy it into a private store.<br/>\n    In that case, for example, you can use : ${JOB_NAME}-${BUILD_NUMBER}\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-cfBundleVersionValue_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    CFBundleVersionを指定された文字列に設定します。<br/>\n    <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">ビルド変数</a>で説明されている全ての環境変数と<a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token Macro Plugin</a>で説明されている全て>のマクロを使うことができます。<br/>\n    例えば ${BUILD_NUMBER} を指定すると、これは現在のビルド番号に置き換えられます。<br/>\n    例えばプライベートストアにアプリをデプロイする場合はなどには各ビルドで固有の値を生成する必要があるはずです。<br/>\n    このような場合には次の様にするとよいでしょう: ${JOB_NAME}-${BUILD_NUMBER}\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-changeBundleID.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2014 Esteban Bouza Padin\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    Checking this option will replace the bundle identifier. <br/>\n    You will need to specify which bundle ID (CFBundleIdentifier) to use and where is the Info.plist file located.<br>\n    This is handy for example when you want to use a different code signing identity in your development projects.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-changeBundleID_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2014 Esteban Bouza Padin\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    このオプションをチェックするとバンドルIDが置き換えられます。<br/>\n    バンドルID (CFBundleIdentifier) と使用するInfo.plist ファイルの場所を指定する必要があります。<br>\n    これは、例えば開発段階では通常と異なるコード署名を行なう必要がある様な場合に便利です。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-cleanBeforeBuild.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        This will delete the build directories before invoking the build. This will force the rebuilding of ALL\n        dependencies and can make large projects take a lot longer.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-cleanBeforeBuild_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        ビルドを呼び出す前にビルドディレクトリが削除されます。 これにより全ての関連するものの再構築が強制され、大きなプロジェクトではとても時間かかることとなります。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-cleanResultBundlePath.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        This will delete the ResultBundlePath before invoking the build.<br />\n        If the directory already exists in the location specified by ResultBundlePath, xcodebuild will be an error and should be checked.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-cleanResultBundlePath_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        ビルドを呼び出す前にResultBundlePathが削除されます。<br />\n        ResultBundlePathで指定された場所にすでにディレクトリが存在する場合、xcodebuildはエラーになるため、通常はチェックする必要があります。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-codeSigningIdentity.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    Override the code signing identity specified within the project config.\n\n    This lets you keep your xcode project setup to build with developer certificates\n    interactively but put your distribution certificate on the hosts running jenkins\n    to build your actual releases.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-codeSigningIdentity_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    プロジェクト設定内で指定されたコード署名IDを上書きします。\n    これによりデベロッパー証明書をインタラクティブ変更してビルドするようにxcodeプロジェクトの設定を行なうことができますが、リリースをビルドするためにjenkinsを実行するホストに航海用証明書を置いておく必要があります。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-configuration.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    This is the name of the configuration as defined in the Xcode project.<br/>\n    By default there are Debug and Release configurations.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-configuration_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    これはXcodeプロジェクトで定義されているConfigurationの名前です。<br/>\n    デフォルトでは Debug と Release が定義されています。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-embeddedProfileFile.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n      The relative path to the mobileprovision to embed, leave blank for no embedded profile.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-embeddedProfileFile_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n      埋め込み用の mobileprovision ファイルへの相対パスです。\n      埋め込み用のプロファイルが無いなら空欄のままにします。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-generateArchive.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2013 Jeffrey Todd Ligon\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    Checking this option will create an .xcarchive .app found in the build directory.<br/>\n    An .xcarchive is useful for submission to the app store or third party crash reporters.<br/>\n    You must specify a Scheme to perform an archive.</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-generateArchive_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2013 Jeffrey Todd Ligon\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    このオプションをチェックすると .xcarchive と .app をビルドディレクトリに作成します。<br/>\n    .xcarchive はApp Storeにアプリを送信したりサードパーティのクラッシュレポートを利用するのに便利です。<br/>\n    アーカイブの作成にはSchemeを指定する必要があります。</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-globalDevelopmentTeam_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>パッケージに署名するために利用する開発者チームの名前を指定します。\n    Xcode 8.3以降では.ipaに署名(これには現在xcodebuilderを使用しています)するために必要です。</p>\n    <p>開発者チームは開発者チームIDを指定するか、「Jenkinsの管理」で作成したものをここで設定できます</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-globalKeychainName_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>パッケージに署名するための証明書を取得すのに使用する設定済みキーチェーンの名前。</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-interpretTargetAsRegEx.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        Build all entries listed under the \"Targets:\" section of the xcodebuild -list output that match the regexp.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-interpretTargetAsRegEx_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        xcodebuild -listの \"Targets:\" セクションにリストされているすべてのエントリから正規表現と一致するものをビルドします。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-ipaName_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        出力するipaファイルのファイル名のパターンを指定します。<br/>\n        何も指定しなければアーカイブのベースネームにInfo.plistファイルの’CFBundleShortVersionString’の値と<br/>\n        ’CFBundleVersion’の値を加えた文字列が使われます。<br/>\n        また、以下の表の値を文字列中に使用することができます。<br/>\n        <table>\n        <tr><td>${BASE_NAME}</td><td>アーカイブのベースネームに置き換えられます</td></tr>\n        <tr><td>${VERSION}</td><td>Info.plistのCFBundleVersionに置き換えられます</td></tr>\n        <tr><td>${SHORT_VERSION}</td><td>Info.plistのCFBundleShortVersionStringに置き換えられます</td></tr>\n        <tr><td>${BUILD_DATE}</td><td>アプリをビルドした日付(yyyy.MM.dd)に置き換えられます</td></tr>\n        </table>\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-keychainName.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>The name of this configured keychain. Each job will specify a keychain configuration by the name.</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-keychainName_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>設定済みのキーチェーンの名前。各ジョブでは名前で指定された設定済みのキーチェーンを利用します。</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-keychainPath.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>The path of the keychain to use to retrieve certificates to sign the package (default : ${HOME}/Library/Keychains/login.keychain).</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-keychainPath_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>パッケージに署名するための証明書を取得するキーチェーンのパス。 (デフィルトは: ${HOME}/Library/Keychains/login.keychain)</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-keychainPwd.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>The password of the keychain to use to retrieve certificates to sign the package.</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-keychainPwd_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>パッケージに署名するための証明書を取得するキーチェーンのパスワード。</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-logfileOutputDirectory.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n      Specify the directory to output the log of xcodebuild.<br/>\n      If you leave it blank, it will be output to \"project directory/builds/${BUILD_NUMBER}/log\" with other logs.<br/>\n      If an output path is specified, it is output as a xcodebuild.log file in a relative directory under the \"build output directory\"\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-logfileOutputDirectory_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        xcodebuildのログを出力するディレクトリを指定します。<br/>\n        何も指定せずに空白のままにすると、他のログと共に \"プロジェクトディレクトリ/builds/${BUILD_NUMBER}/log\" へと出力されます。<br/>\n        出力パスを指定した場合には 「ビルドの出力ディレクトリ」 以下の相対ディレクトリに xcodebuild.log ファイルとして出力されます。<br/>\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-resultBundlePath.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n      Specify the directory to output the output the test result.<br/>\n      If you leave it blank, it will not output a test result and will not analyze the test results.<br />\n      If an output path is specified, it is output as a test result in a relative directory under the \"ResultBundlePath\".<br />\n      The plug-in analyzes the test result here and outputs a JUnit compatible XML file under the ${WORKSPACE}/test-reports.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-resultBundlePath_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        テスト結果の概要を出力するディレクトリを指定します。<br/>\n        何も指定せずに空白のままにすると、テスト結果の概要は出力されず、またテスト結果の概要の解析も行われません。<br />\n        出力パスを指定した場合にはプロジェクトルート以下に「ResultBundlePath」に指定された名前のディレクトリが作成され、そこにテスト結果の概要が出力されます。<br />\n        そしてプラグインは出力されたテスト結果の概要を解析して、JUnit互換のXMLファイルを ${WORKSPACE}/test-reports 以下に出力します。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-sdk.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        You only need to supply this value if you want to specify the SDK to build against. If empty, the SDK will be\n        determined by Xcode. If you wish to run OCUnit tests, you will need to use the iPhone Simulator's SDK, for\n        example:\n    </p>\n    <pre>/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.1.sdk/</pre>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-sdk_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        ビルドで使用するSDKを指定する場合にのみこの値を指定する必要があります。 空の場合にはSDKはXcodeによって決定されます。OCUnitテストを実行する場合はiPhone SimulatorのSDKを使用する必要があります。\n        例:\n    </p>\n    <pre>/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.1.sdk/</pre>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-signIpaOnXcrun.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>By default the xcode-plugin will sign the IPA when it runs xcrun on the app folder, dissabeling this\n      will prevent xcrun from having the --sign option added to the command.<br/>\n    This fixes a known issue with Xcode on Mavericks:<br/>\n    http://stackoverflow.com/questions/32504355/error-itms-90339-this-bundle-is-invalid-the-info-plist-contains-an-invalid-ke\n    http://stackoverflow.com/questions/32763288/ios-builds-ipa-creation-no-longer-works-from-the-command-line/32845990#32845990\n    http://cutting.io/posts/packaging-ios-apps-from-the-command-line/</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-signIpaOnXcrun_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>By default the xcode-plugin will sign the IPA when it runs xcrun on the app folder, dissabeling this\n      will prevent xcrun from having the --sign option added to the command.<br/>\n    This fixes a known issue with Xcode on Mavericks:<br/>\n    http://stackoverflow.com/questions/32504355/error-itms-90339-this-bundle-is-invalid-the-info-plist-contains-an-invalid-ke\n    http://stackoverflow.com/questions/32763288/ios-builds-ipa-creation-no-longer-works-from-the-command-line/32845990#32845990\n    http://cutting.io/posts/packaging-ios-apps-from-the-command-line/</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-symRoot.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        You only need to supply this value if you want to specify the SYMROOT path to use.<br/>\n        If empty, the default SYMROOT path will be used (it could be different depending of your Xcode version).<br/>\n        Supports all macros and also environment and <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">build\n        variables</a> from the <a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token\n        Macro Plugin</a>.<br/>\n        For example you can use the value : <br/>\n    </p>\n    <pre>${WORKSPACE}/symroot</pre>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-symRoot_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        SYMROOT として使うパスを指定する必要がある場合にだけ設定します。<br/>\n        空欄のままにすればデフォルトの SYMROOT パスが使われます。(これはXcodeのバージョンに依存します)<br/>\n        <a href=\"http://ci.jenkins-ci.org/env-vars.html\" target=\"_blank\">ビルド変数</a>に説明されている全ての環境変数と<a href=\"https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin\" target=\"_blank\">Token Macro Plugin</a>で説明されている>全てのマクロを使うことができます。<br/>\n        例えば次のような値を使用できます:<br/>\n    </p>\n    <pre>${WORKSPACE}/symroot</pre>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-target.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        The target to build. If left empty, this will build all targets in the project.<br/>\n        If you wish to build your binary and the unit test module, it is best to do this as two separate steps each with\n        their own target.<br/>\n        This was, the iPhone Simulator SDK can be specified for the unit tests.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-target_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        ビルドするターゲットです。空欄のままにするとプロジェクトの全てのターゲットをビルドします。<br/>\n        バイナリとユニットテストモジュールをビルドしたい場合には、それぞれ独自のターゲットを持つ2つの別々のステップとして実行するのが最善です。<br/>\n        そうすればiPhone Simulator SDKを単体テスト用に指定することができます。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-unlockKeychain_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    アーカイブに署名を行なう前にキーチェーンのロックを自動的に解除します。</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-useLegacyBuildSystem.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Instead of \"New Builld System\" which became available from Xcode 9, we build the application using the legacy build system.<br />\n    There is a possibility that you can handle old projects that cause problems with the new build system.<br />\n    Also, since new output formats of logs are changed in the new build system, it is also useful when you want to handle logs with legacy third party tools.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-useLegacyBuildSystem_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Xcode 9から利用可能となった\"New Builld System\"ではなく、旧来のビルドシステムを使ってアプリケーションのビルドを行います。<br />\n    それによって新しいビルドシステムでは問題が起きる古いプロジェクトを扱う事ができる可能性があります。<br />\n    また、新しいビルドシステムではログの出力フォーマットなどにも変更があるため、ログを旧来のサードパーティ製ツールで扱いたい場合にも便利です。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-xcodeProjectFile_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    もし、1つ以上のXcodeプロジェクトファイルがプロジェクトのパスに存在しているならば、どのプロジェクトをビルドの対象とするかを指定する必要があります。<br/>\n    もし、全てのプロジェクトをビルドする必要があるならば、それぞれのXcodeプロジェクトごとにXcodeのビルド手順を作成する必要があります。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-xcodeProjectPath_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    ワークスペース(workspace)からの相対パスでXcodeプロジェクトファイルが置かれたディレクトリの場所を指定します。\n    これはワークスペーストップディレクトリにXcodeプロジェクトのディレクトリが置かれていない場合ののみ指定が必要です。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-xcodeSchema_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>もし、あなたが「ターゲット」の設定よりも schema を優先してコンパイルしたい場合や、アーカイブや.ipaを生成したい場合に指定します。\n       この設定はXcodeのプロジェクトファイルでの設定やこのジョブの「ターゲット」での設定よりも優先されます。</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-xcodeWorkspaceFile_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>もし、あなたがprojectではなくworkspaceを使ってコンパイルを行ないたいなら指定します。\n     この設定はXcodeのプロジェクトファイルでの設定やこのジョブの「Configuration」パラメータよりも優先されます。</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-xcodebuildArguments.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>Extra xcodebuild parameters, added after the command that jenkins generates based on the rest of the config</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/au/com/rayh/XCodeBuilder/help-xcodebuildArguments_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>その他の設定に基づいてJenkinsが生成するコマンドの後に追加するxcodebuildパラメータ</p>\n</div>\n"
  },
  {
    "path": "src/main/resources/hudson/plugins/xcode/XcodeInstallation/config.jelly",
    "content": "<?jelly escape-by-default='true'?>\n<j:jelly xmlns:j=\"jelly:core\" xmlns:st=\"jelly:stapler\" xmlns:d=\"jelly:define\" xmlns:l=\"/lib/layout\" xmlns:t=\"/lib/hudson\" xmlns:f=\"/lib/form\">\n    <f:entry title=\"${%Name}\" field=\"name\">\n        <f:textbox />\n    </f:entry>\n    <f:entry title=\"${%Path to Xcode tools}\" field=\"home\">\n        <f:textbox />\n    </f:entry>\n</j:jelly>\n"
  },
  {
    "path": "src/main/resources/hudson/plugins/xcode/XcodeInstallation/config_it.properties",
    "content": "Name=Nome\nPath\\ to\\ Xcode\\ tools=Percorso del file eseguibile Xcode utensili\n"
  },
  {
    "path": "src/main/resources/hudson/plugins/xcode/XcodeInstallation/config_ja.properties",
    "content": "# The MIT License\n#\n# Copyright (c) 2016-, Seiji Sogabe\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n\nName=\\u540d\\u524d\nPath\\ to\\ Xcode\\ tools=Xcode tools\\u3078\\u306e\\u30d1\\u30b9\n"
  },
  {
    "path": "src/main/resources/hudson/plugins/xcode/XcodeInstallation/help-home.html",
    "content": "<div>\n    Set path to Xcode tools. This is the path displayed when executing \"xcode-select -p\".\n</div>\n"
  },
  {
    "path": "src/main/resources/hudson/plugins/xcode/XcodeInstallation/help-home_ja.html",
    "content": "<div>\n    Xcode toolsへのパスを指定します。これは\"xcode-select -p\"を実行した時に表示されるパスです。\n</div>\n"
  },
  {
    "path": "src/main/resources/index.jelly",
    "content": "<?jelly escape-by-default='true'?>\n<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<!--\n  This view is used to render the plugin list page.\n\n  Since we don't really have anything dynamic here, let's just use static HTML. \n-->\n<div>\n  This plugin provides builders to build xcode projects, invoke agvtool and package .ipa files\n</div>"
  },
  {
    "path": "src/main/webapp/help/help-appIDandProvisionUUID.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Set the application's Buldle ID and UUID or identifier combination of the provisioning profile to use when signing the application.<br />\nThe Buldle ID specified here and the UUID or identifier combination of the provisioning profile are recorded in the exportOptions.plist file and used for CodeSign when exporting IPA from the archive.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-appIDandProvisionUUID_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    アプリケーションに署名する際に使用する、アプリの Buldle IDとプロビジョニングプロファイルのUUIDまたは識別子の組み合わせを設定します。<br />\nここで指定されたBuldle IDとプロビジョニングプロファイルのUUIDまたは識別子の組み合わせはexportOptions.plistファイルへと記録され、アーカイブからIPAをエキスポートする際にCodeSignで使われます。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-assetPackManifestURL.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Export settings for non-App Store App.<br />\n    If the application is using on-demand resources and the application will installing OTA  with manifest.plist, this must be the base URL that specifies the host of the asset pack. This will set up the app to download the asset pack from the specified URL.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-assetPackManifestURL_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    非App Store向けエクスポートの設定です。<br />\n    アプリがオンデマンドリソースを使用していてアプリケーションがmanifest.plistを使用してOTAでインストールされる場合、これはアセットパックのホスト先を指定するベースURLでなければなりません。 これにより、指定されたURLからアセットパックをダウンロードするようにアプリが設定されます。 \n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-automaticSigning.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2014 Esteban Bouza Padin\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    Checking this option will automatically generate Provisioning Profile and certificates for signing application.<br/>\n    However, please be aware that using this function will automatically create Provisioning profile and certificates as necessary, so that old Provisioning profile and certificates will be invalid at that time.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-automaticSigning_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2014 Esteban Bouza Padin\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    このオプションをオンにするとプロビジョニングプロファイルとアプリケーション署名用の証明書が自動的に生成されます。<br/>\n    ただし、この機能を使用すると、必要に応じてプロビジョニングプロファイルと証明書が自動的に作成されるため、その時点で古いプロビジョニングプロファイルと証明書は無効になることに注意が必要です。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-bundleID.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Specify the Bundle ID of the application for which code sign to be performed.<br />\n    If the location of the Info.plist file contained in the compiled archive is set instead of the Bundle ID, read the Bundle ID from the Info.plist file and use that value.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-bundleID_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    コード署名を行なう対象となるアプリケーションのBundle IDを指定します。<br />\n    Bundle IDの代わりにコンパイル済みのアーカイブに含まれているInfo.plistファイルの場所が設定された場合には、Info.plistファイルからBundle IDを読み取り、その値を使用します。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-compileBitcode.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    If checked, Xcode will recompiling Bitcode and exporting IPA for the non App Store.<br />\n    The default is \"Yes\" (check is on).\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-compileBitcode_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    App Store向け以外のIPAをBitcodeをリコンパイルしてエクスポートするならチェックします。<br />\n    デフォルトは「はい」(チェックはオン)です。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-copyProvisioningProfile.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    If Checked, If Checked, and the filename of provisioning profile is specified in \"Provisioning profile UUID\",\n    the specified file is copied to a predetermined place.<br />\n    (\"/Users/${HOME}/Library/MobileDevice/Provisioning Profiles/\")<br />\n    This can be used to overwrite the contents of the developer profile or system settings in the provisioning profile in the project deployed from SCM etc.<br />\n    If the provisioning profile UUID or Specifire is set in \"provisioning profile UUID\", it does not do anything.\n    The default is \"Yes\" (check is on).\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-copyProvisioningProfile_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    チェックされ、「プロビジョニングプロファイルUUID」にプロビジョニングプロファイルのファイル名が設定されている場合は、<br />\n    指定されたファイルを所定の場所にコピーします。<br />\n    (\"/Users/${HOME}/Library/MobileDevice/Provisioning Profiles/\")<br />\n    これはSCMなどから展開されたプロジェクト中のプロビジョニングプロファイルで開発者プロファイルの内容やシステム設定を上書きするのに使えます。<br />\n    「プロビジョニングプロファイルUUID」に設定されているのがプロビジョニングプロファイルのUUIDや識別子なら何もしません。<br />\n    デフォルトは「はい」(チェックはオン)です。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-credentialKeychainId.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>The combination of the path and password defined in 'Credentials' for unlocking the keychain that contains the certificate for signing the package.</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-credentialKeychainId_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>パッケージに署名するための証明書を格納したキーチェーンをアンロックするための「認証情報」で定義されたパスとパスワードの組み合わせ。</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-developmentTeamID.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>The ID of the configured development team to use to sign the package. As of XCode 8.3, this is required now to sign an ipa (which now uses xcodebuilder).</p>\n    <p>If you want to use Xcode default for developer team ID, leave this field blank.</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-developmentTeamID_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>パッケージに署名するために利用する開発者チームIDを指定します。\n    Xcode 8.3以降では.ipaに署名(これには現在xcodebuilderを使用しています)するために必要です。</p>\n    <p>開発者チームIDにXcodeのデフォルトを使用する場合はこのフィールドを空白のままにします。</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-displayImageURL.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Export settings for non App Store.<br />\n    Specify the URL of the image (57 x 57 pixels) of the icon to be displayed when installing the application using manifest.plist.<br />\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-displayImageURL_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    非App Store向けエクスポートの設定です。<br />\n    manifest.plistを使ってアプリケーションをインストールする際に表示するアイコ\nンの画像(57x57ピクセル)のURLを指定します。<br />\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-embedOnDemandResources.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Export settings for non App Store.<br />\n    If the application is using on demand resources and this item is on, the asset pack is included in the application bundle, so you can test the app without the server hosting the asset pack.<br />\n    If onDemandResourcesAssetPacksBaseURL is not specified, the default is YES (check is on).\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-embedOnDemandResources_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    非App Store向けエクスポートの設定です。<br />\n    アプリケーションがオンデマンドリソースを使用していている場合、かつこの項目がオンなら、アセットパックはアプリケーションバンドルに組み込まれるため、アセットパックをホストするサーバーなしでアプリをテストできます。<br />\n    onDemandResourcesAssetPacksBaseURLが指定されていない場合、デフォルトは「はい」(チェックはオン)です。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-fullSizeImageURL.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Export settings for non App Store.<br />\n    Specify the URL of the image (512 x 512 pixels) of the icon to be displayed when installing the application using manifest.plist.<br />\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-fullSizeImageURL_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    非App Store向けエクスポートの設定です。<br />\n    manifest.plistを使ってアプリケーションをインストールする際に表示するアイコンの画像(512x512ピクセル)のURLを指定します。<br />\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-globalDevelopmentTeam.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>The name of the configured development team to use to sign the package. As of XCode 8.3, this is required now to sign an ipa (which now uses xcodebuilder).</p>\n    <p>A development team can be configured here by specifying a Development Team ID, or by creating one in the jenkins global configuration</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-globalDevelopmentTeam_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>パッケージに署名するために利用する開発者チームの名前を指定します。\n    Xcode 8.3以降では.ipaに署名(これには現在xcodebuilderを使用しています)するために必要です。</p>\n    <p>開発者チームは開発者チームIDを指定するか、「Jenkinsの管理」で作成したものをここで設定できます</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-globalKeychainName.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>The name of the configured keychain to use to retrieve certificates to sign the package.</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-globalKeychainName_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>パッケージに署名するための証明書を取得すのに使用する設定済みキーチェーンの名前。</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importDeveloperProfile.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n  Select the developer profile you exported from Xcode Preference to import into the keychain.</ br>\n  Developer profile must be registered with Jenkins in advance by \"Credentials\".</ br>\n  If you do not select this column, you can specify the identifier of the developer profile registered in \"Credentials\" with the next \"Developer Profile ID\".\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importDeveloperProfileId.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n  Specify the developer profile id you exported from Xcode Preference to import into the keychain.</ br>\n  Developer profile must be registered with Jenkins in advance by \"Credentials\".\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importDeveloperProfileId_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n  キーチェーンにインポートする、XcodeのPreferenceからエクスポートした開発者プロファイルのIDを設定します。</ br>\n  開発者プロファイルは事前に「認証情報」でJenkinsへと登録されている必要があります。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importDeveloperProfile_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n  キーチェーンにインポートする、XcodeのPreferenceからエクスポートした開発者プロファイルを選択します。</ br>\n  開発者プロファイルは事前に「認証情報」でJenkinsへと登録されている必要があります。\n  この欄を選択しない場合には、次の「開発者プロファイルのID」で「認証情報」に登録されている開発者プロファイルの識別子(ID)を指定する事ができます。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importIntoExistingKeychain.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n  If it is checked, the developer profile will be imported into the existing keychain.</ br>\n  If not checked, create a new key chain with the file name \"jenkins-\" + \"job name\" newly, and import the developer profile into this. (In this case, a random character string is automatically generated and used for the password)</ br>\n  When importing developer profiles into a temporary key chain, please make sure that there are no duplicate certificates or private keys in the developer profile you import into the default keychain etc.</ br>\n  If duplicate certificates or secret keys are included in both, Xcode gets confused and can not process the codesign correctly.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importIntoExistingKeychain_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n  チェックされている場合には、開発者プロファイルは既存のキーチェーンへとインポートされます。</ br>\n  チェックされていないなら、新しく\"jenkins-\" + \"ジョブ名”のファイル名でキーチェーンを新しく作成して、これに開発者プロファイルをインポートします。(この場合には、パスワードには自動的にランダムな文字列が生成されて使われます)</ br>\n  開発者プロファイルを新規のキーチェーンにインポートする際は、デフォルトのキーチェーンなどにインポートするデベロッパープロファイルと重複した証明書や秘密鍵がないことを確認してください。</ br>\n  重複した証明書や秘密鍵が複数のキーチェーンに含まれていると、Xcodeが混乱してしまいコード署名を正しく処理できません。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importKeychainId.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>The ID of a keychain defined in 'Credentials' to import a certificate for signing a package from a developer profile.</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importKeychainId_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>パッケージに署名するための証明書を開発者プロファイルからインポートする、「認証情報」で定義済みのキーチェーンID。</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importKeychainName.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>The name of the configured keychain to use to import certificates from developer profile to sign the package.</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-importKeychainName_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>パッケージに署名するための証明書を開発者プロファイルからインポートする設定済みキーチェーンの名前。</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-ipaExportMethod.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    The export method of the .app to generate the .ipa file. Should be one in 'development', 'ad-hoc', 'enterprise' or 'app-store'.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-ipaExportMethod_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    .appから.ipaを生成する際のエクスポート方法をdevelopment、ad-hoc、enterprise、app-storeのいずれかで指定します。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-ipaManifestPlistUrl.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n  Export settings for non App Store.<br />\n  The user can open the distribution manifest file with a Web browser and download the application on the Web.<br />\n  Set the URL for downloading the application here.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-ipaManifestPlistUrl_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    非App Store向けエクスポートの設定です。<br />\nユーザーは、Webブラウザで配布マニフェストファイルを開いて、Web上でアプリをダウンロードできます。<br />\nアプリケーションをダウンロードするためのURLをここに設定します。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-ipaName.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        Specify the file name pattern of the ipa file to be output.<br/>\n        If nothing is specified, the base name of the archive plus the value of 'CFBundleShortVersionString'<br/>\n        plus the value of 'CFBundleVersion' in the Info.plist file is used.<br/>\n        In addition, the values in the following table can be used in the string.< br/>\n        <table>\n        <tr><td>${BASE_NAME}</td><td>It is replaced with the base name of the archive</td></tr>\n        <tr><td>${VERSION}</td><td>It is replaced with CFBundleVersion in Info.plist</td></tr>\n        <tr><td>${SHORT_VERSION}</td><td>It is replaced with CFBundleShortVersionString in Info.plist</td></tr>\n        <tr><td>${BUILD_DATE}</td><td>It is replaced with date on which the application was built (yyyy.MM.dd)</td></tr>\n        </table>\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-ipaName_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n        出力するipaファイルのファイル名のパターンを指定します。<br/>\n        何も指定しなければアーカイブのベースネームにInfo.plistファイルの’CFBundleShortVersionString’の値と<br/>\n        ’CFBundleVersion’の値を加えた文字列が使われます。<br/>\n        また、以下の表の値を文字列中に使用することができます。<br/>\n        <table>\n        <tr><td>${BASE_NAME}</td><td>アーカイブのベースネームに置き換えられます</td></tr>\n        <tr><td>${VERSION}</td><td>Info.plistのCFBundleVersionに置き換えられます</td></tr>\n        <tr><td>${SHORT_VERSION}</td><td>Info.plistのCFBundleShortVersionStringに置き換えられます</td></tr>\n        <tr><td>${BUILD_DATE}</td><td>アプリをビルドした日付(yyyy.MM.dd)に置き換えられます</td></tr>\n        </table>\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-ipaOutputDirectory.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    The output directory for the .ipa file, relative to the build directory.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-ipaOutputDirectory_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    .ipaファイルの出力ディレクトリをビルド作業用ディレクトリ(build)からの相対パスで指定します。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-manifestPlistURL.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>Specify the URL for installing the application when creating the manifest.plist that is necessary when OTA installing the application from Web pages or email.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-manifestPlistURL_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>WebサートやメールからアプリケーションをOTAインストールする際に必要なmanifest.plistを作成する場合にアプリケーションをインストールするためのURLを指定します。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-manualSigning.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Kazuhide Takahashi\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    For this option you need to manually specify the combination of Provisioning profile UUID and BundleID.<br/>\n    This will be useful if you want to change the combination of Provisioning Profile and Certificate used for CodeSign when you build the application.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-manualSigning_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Kazuhide Takahashi\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    このオプションではプロビジョニングプロファイルのUUIDとBundleIDの組み合わせを手動で指定する必要があります。<br/>\n    これは、アプリケーションをビルドするときにコード署名で使用されるプロビジョニングプロファイルと証明書の組み合わせを変更したい場合に便利です。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-onDemandResourcesURL.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Export settings for non-App Store.<br />\n    If the application is using an on demand resource and embedOnDemandResourcesAssetPacksInBundle is not YES, this must be the base URL that specifies the host of the asset pack. This will set up the app to download the asset pack from the specified URL.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-onDemandResourcesURL_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    非App Store向けエクスポートの設定です。<br />\n    アプリがオンデマンドリソースを使用していてembedOnDemandResourcesAssetPacksInBundleがYESでない場合、これはアセットパックのホスト先を指定するベースURLでなければなりません。 これにより、指定されたURLからアセットパックをダウンロードするようにアプリが設定されます。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-provisioningUUID.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Specify the UUID or Specifire of the provisioning profile to use to sign the application.\n    If the location of the provisioning profile is set instead of the UUID or Specifire, read the UUID from the provisioning profile and use that value.\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-provisioningUUID_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Bryan Lahartinger\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    アプリケーションに署名するのに使用するプロビジョニングプロファイルのUUIDまたは識別子を指定します。<br />\n    UUIDまたは識別子の代わりにプロビジョニングプロファイルの場所が設定された場合には、プロビジョニングプロファイルからUUIDを読み取り、その値を使用します。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-readFromProject.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Kazuhide Takahashi\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    With this option, it automatically retrieve and sets the combination of BundleID and Provisioning profile UUID from the Xcode project file.<br/>\n    This is useful when you want to take over the combination of BundleID and Provisioning profile UUID that you used in the Xcode project (GUI).<br/>\n    \"Read from Xcode Project\" requires the following \"Build Configuration\" corresponding to \"Export method\" of \"General build settings\".<br/>\n    <table border=\"1\">\n      <tr><th>Export method</th><th>Build Configuration</th></tr>\n      <tr><td>development</td><td>Debug</td></tr>\n      <tr><td>ad-hoc</td><td>AdHoc</td></tr>\n      <tr><td>enterprise</td><td>Enterprise</td></tr>\n      <tr><td>app-store</td><td>Release</td></tr>\n    </table>\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-readFromProject_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2017 Kazuhide Takahashi\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    このオプションを使用するとBundleIDとプロビジョニングプロファイルUUIDの組み合わせがXcodeプロジェクトファイルから自動的に取得され設定されます。<br/>\n    これは、Xcodeプロジェクト(GUI)で使用したBundleIDとプロビジョニングプロファイルUUIDの組み合わせを引き継ぐ場合に便利です。<br/>\n    「Xcodeプロジェクトから読み込む」を使うには「全体のビルド設定」の「エクスポート方法」に対応する以下の「ビルド構成」が必要です。<br/>\n    <table border=\"1\">\n      <tr><th>エクスポート方法</th><th>ビルド構成</th></tr>\n      <tr><td>development</td><td>Debug</td></tr>\n      <tr><td>ad-hoc</td><td>AdHoc</td></tr>\n      <tr><td>enterprise</td><td>Enterprise</td></tr>\n      <tr><td>app-store</td><td>Release</td></tr>\n    </table>\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-thinning.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    Set this to thin the packages for one or more devices in Xcode when exporting IPA by methods other than App Store.</p>\n    <p>\n    Available options are:<br />\n    &lt;none&gt; (Xcode export non-thinned generic application),<br />\n    &lt;thin-for-all-variants&gt; (Xcode export universal applications and all available thinning variants),<br />\n    Or for a model identifier a specific device (eg \"iPhone 7, 1\").<br />\n    The default is &lt;none&gt;.<br />\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-thinning_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    App Store向け以外の方法でIPAをエクスポートする場合にXcodeで1つ以上のデバイス向けにパッケージを最適化したい場合に設定します。</p>\n    <p>\n    利用可能なオプションは:<br />\n    &lt;none&gt; (Xcodeは最適化されていない汎用アプリケーションを生成する),<br />\n    &lt;thin-for-all-variants&gt; (Xcodeは汎用アプリケーション向けに可能な限りの最適化を行ないIPAを生成する),<br />\n    または特定のデバイスのモデル識別子 (例えば \"iPhone 7, 1\") 向けに最適化する。<br />\n    デフォルトは &lt;none&gt; です。<br />\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-unlockKeychain.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    Automatically unlock the keychain before signing the archive?</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-unlockKeychain_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    アーカイブに署名を行なう前にキーチェーンのロックを自動的に解除します。</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-uploadBitcode.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    If Checked, include bitcode in IPA exporting for App Store.<br />\n    The default is \"Yes\" (check is on).\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-uploadBitcode_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    App Store向けにエクスポートするIPAにBitcodeを含める場合にはチェックします。<br />\n    デフォルトは「はい」(チェックはオン)です。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-uploadSymbols.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    If Checked, include symbols in IPA exporting for App Store.<br />\n    The default is \"Yes\" (check is on).\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-uploadSymbols_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>\n    App Store向けにエクスポートするIPAにシンボルを含める場合にはチェックします。<br />\n    デフォルトは「はい」(チェックはオン)です。\n    </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeProjectFile.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    If there is more than one Xcode project file in the project path, you will need to specify the file name of the project you wish to build.<br/>\n    If you need to build all project, you will need to create an Xcode build step for each one manually.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeProjectFile_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    もし、1つ以上のXcodeプロジェクトファイルがプロジェクトのパスに存在しているならば、どのプロジェクトをビルドの対象とするかを指定する必要があります。<br/>\n    もし、全てのプロジェクトをビルドする必要があるならば、それぞれのXcodeプロジェクトごとにXcodeのビルド手順を作成する必要があります。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeProjectPath.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    This is the relative path from the workspace to the directory that contains the Xcode project file.\n    You only need to supply this value if the Xcode project you wish to build is not in the root of the workspace.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeProjectPath_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    ワークスペース(workspace)からの相対パスでXcodeプロジェクトファイルが置かれたディレクトリの場所を指定します。\n    これはワークスペーストップディレクトリにXcodeプロジェクトのディレクトリが置かれていない場合ののみ指定が必要です。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeSchema.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>Needed if you want to compile for a specific schema instead of a target, or if you want to generate an archive or an IPA.\n        It takes precedence over 'Xcode Configuration' setting and this job 'target' parameter.</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeSchema_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n    <p>もし、あなたが「ターゲット」の設定よりも schema を優先してコンパイルしたい場合や、アーカイブや.ipaを生成したい場合に指定します。\n       この設定はXcodeのプロジェクトファイルでの設定やこのジョブの「ターゲット」での設定よりも優先されます。</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeToolsVersion.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    Select the version of Xcode Tools to use for building the project.\n  </p>\n  <p>\n    You can select the version of Xcode set by 'Global Tool Configuration' by plugin setting.<br />\n    If you choose the 'System Default' for Xcode version, plugin will not do anything,\n    so you can switch Xcode using environment variable 'DEVELOPER_DIR' as well.\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeToolsVersion_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 Ray Yamamoto Hilton\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>\n    プロジェクトのビルドに使用するXcodeツールのバージョンを選択します。\n  </p>\n  <p>\n    プラグイン設定で「Global Tool Configuration」で設定したXcodeのバージョンを選択できます。<br />\n    Xcode toolsのバージョンに「システムの設定」を選択した場合、プラグインは何もしませんが、\n    その場合には今までどおり環境変数 'DEVELOPER_DIR' を使ってXcodeを切り替えることもできます。\n  </p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeWorkspaceFile.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>Only needed if you want to compile a workspace instead of a project.\n     It takes precedence over 'Xcode Project File' setting and this job 'configuration' parameter.\"</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help/help-xcodeWorkspaceFile_ja.html",
    "content": "<!--\n  ~ The MIT License\n  ~\n  ~ Copyright (c) 2011 eXo platform\n  ~\n  ~ Permission is hereby granted, free of charge, to any person obtaining a copy\n  ~ of this software and associated documentation files (the \"Software\"), to deal\n  ~ in the Software without restriction, including without limitation the rights\n  ~ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  ~ copies of the Software, and to permit persons to whom the Software is\n  ~ furnished to do so, subject to the following conditions:\n  ~\n  ~ The above copyright notice and this permission notice shall be included in\n  ~ all copies or substantial portions of the Software.\n  ~\n  ~ THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  ~ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  ~ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  ~ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  ~ THE SOFTWARE.\n  -->\n\n<div>\n  <p>もし、あなたがprojectではなくworkspaceを使ってコンパイルを行ないたいなら指定します。\n     この設定はXcodeのプロジェクトファイルでの設定やこのジョブの「Configuration」パラメータよりも優先されます。</p>\n</div>\n"
  },
  {
    "path": "src/main/webapp/help-cleanTestReports.html",
    "content": "<div>\n  <p>\n    This will delete the processed test reports before invoking the build.\n    Usually it is a good idea only to do it in test targets,\n    otherwise if other Xcode target is built before tests – the build will fail to collect test reports.\n  </p>\n</div>\n\n"
  },
  {
    "path": "src/main/webapp/help-xcodebuildArguments.html",
    "content": "<div>\n  <p>\n    Arguments are currently separated by space, enclosing them in quotes won't help.\n  </p>\n  <p>\n    Passing custom arguments is convenient when you need to change some project options for Jenkins build,\n    but don't want them to persist in project file.\n    For example when running application tests, following settings often are nice fit:\n    <code>GCC_SYMBOLS_PRIVATE_EXTERN=NO COPY_PHASE_STRIP=NO</code>.\n    Otherwise Release build will usually fail because it won't be able to find application symbols to link with test bundle.\n  </p>\n</div>\n\n\n"
  },
  {
    "path": "src/test/java/Pkcs12.java",
    "content": "import javax.naming.InvalidNameException;\nimport javax.naming.ldap.LdapName;\nimport javax.naming.ldap.Rdn;\nimport javax.security.auth.x500.X500Principal;\nimport java.io.FileInputStream;\nimport java.security.KeyStore;\nimport java.security.cert.X509Certificate;\nimport java.util.Enumeration;\n\n/**\n * A test program to inspect PKCS12 file\n *\n * @author Kohsuke Kawaguchi\n */\npublic class Pkcs12 {\n    public static void main(String[] args) throws Exception {\n        KeyStore ks = KeyStore.getInstance(\"pkcs12\");\n        ks.load(new FileInputStream(args[0]),args[1].toCharArray());\n        Enumeration<String> en = ks.aliases();\n        while (en.hasMoreElements()) {\n            String s = en.nextElement();\n            System.out.println(s);\n            X509Certificate c = (X509Certificate)ks.getCertificate(s);\n            if (c!=null) {\n                X500Principal p = c.getSubjectX500Principal();\n                System.out.println(p.getName());\n                System.out.println(getCanonicalName(p));\n            }\n        }\n    }\n\n    private static String getCanonicalName(X500Principal p) throws InvalidNameException {\n        LdapName n = new LdapName(p.getName());\n        for (Rdn rdn : n.getRdns()) {\n            if (rdn.getType().equalsIgnoreCase(\"CN\"))\n                return rdn.getValue().toString();\n        }\n        return p.getName(); // fallback\n    }\n}\n"
  },
  {
    "path": "src/test/java/Pkcs7.java",
    "content": "import hudson.util.IOUtils;\nimport org.bouncycastle.cms.CMSSignedData;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.FileInputStream;\n\n/**\n * @author Kohsuke Kawaguchi\n */\npublic class Pkcs7 {\n    public static void main(String[] args) throws Exception {\n        CMSSignedData cms = new CMSSignedData(IOUtils.toByteArray(new FileInputStream(args[0])));\n        ByteArrayOutputStream payload = new ByteArrayOutputStream();\n        cms.getSignedContent().write(payload);\n\n        // mobile provisioning profile has a payload of plist\n        System.out.write(payload.toByteArray());\n    }\n}\n"
  },
  {
    "path": "src/test/java/au/com/rayh/JenkinsXCodeBuildOutputParserTest.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage au.com.rayh;\n\nimport hudson.FilePath;\nimport hudson.console.ConsoleNote;\nimport hudson.model.TaskListener;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.PrintStream;\nimport java.io.PrintWriter;\n\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\n\n/**\n *\n * @author ray\n */\npublic class JenkinsXCodeBuildOutputParserTest {\n    OutputParserTests test;\n\n    @Before\n    public void setUp() throws IOException, InterruptedException {\n        JenkinsXCodeBuildOutputParser parser = new JenkinsXCodeBuildOutputParser(new FilePath(new File(\".\")), new TaskListener() {\n\n            public PrintStream getLogger() {\n                try {\n                    return new PrintStream(\"test-output.txt\");\n                } catch(FileNotFoundException e) {\n                    throw new RuntimeException(e);\n                }\n            }\n\n            public void annotate(ConsoleNote consoleNote) throws IOException {\n                throw new UnsupportedOperationException(\"Not supported yet.\");\n            }\n\n            public void hyperlink(String s, String s1) throws IOException {\n                throw new UnsupportedOperationException(\"Not supported yet.\");\n            }\n\n            public PrintWriter error(String string) {\n                throw new UnsupportedOperationException(\"Not supported yet.\");\n            }\n\n            public PrintWriter error(String string, Object... os) {\n                throw new UnsupportedOperationException(\"Not supported yet.\");\n            }\n\n            public PrintWriter fatalError(String string) {\n                throw new UnsupportedOperationException(\"Not supported yet.\");\n            }\n\n            public PrintWriter fatalError(String string, Object... os) {\n                throw new UnsupportedOperationException(\"Not supported yet.\");\n            }\n        });\n        test = new OutputParserTests(parser);\n    }\n\n    @After\n    public void tearDown() {\n    }\n\n    @Test\n    public void shouldIgnoreStartSuiteLineThatContainsFullPath() throws Exception {\n    \ttest.shouldIgnoreStartSuiteLineThatContainsFullPath();\n    }\n\n    @Test\n    public void shouldParseStartTestSuite() throws Exception {\n    \ttest.shouldParseStartTestSuite();\n    }\n\n    @Test\n    public void shouldParseEndTestSuite() throws Exception {\n    \ttest.shouldParseEndTestSuite();\n    }\n\n    @Test\n    public void shouldParseStartTestCase() throws Exception {\n    \ttest.shouldParseStartTestCase();\n    }\n\n    @Test\n    public void shouldAddErrorToTestCase() throws Exception {\n    \ttest.shouldAddErrorToTestCase();\n    }\n\n    @Test\n    public void shouldParsePassedTestCase() throws Exception {\n    \ttest.shouldParsePassedTestCase();\n    }\n\n    @Test\n    public void shouldParseFailedTestCase() throws Exception {\n    \ttest.shouldParseFailedTestCase();\n    }\n}\n"
  },
  {
    "path": "src/test/java/au/com/rayh/OutputParserTests.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage au.com.rayh;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertNull;\n\nimport java.util.Date;\n\nimport au.com.rayh.report.TestCase;\nimport au.com.rayh.report.TestSuite;\n\n/**\n *\n * @author ray\n */\nclass OutputParserTests {\n    XCodeBuildOutputParser parser;\n\n    OutputParserTests(XCodeBuildOutputParser theParser) {\n    \tparser = theParser;\n    }\n\n    void shouldIgnoreStartSuiteLineThatContainsFullPath() throws Exception {\n        String line = \"Test Suite '/Users/ray/Development/Projects/Java/xcodebuild-hudson-plugin/work/jobs/PBS Streamer/workspace/build/Debug-iphonesimulator/TestSuite.octest(Tests)' started at 2010-10-02 13:39:22 GMT 0000\";\n        parser.handleLine(line);\n        assertNull(parser.currentTestSuite);\n    }\n\n    void shouldParseStartTestSuite() throws Exception {\n        String line = \"Test Suite 'PisClientTestCase' started at 2010-10-02 13:39:23 GMT 0000\";\n        parser.handleLine(line);\n        assertNotNull(parser.currentTestSuite);\n        assertEquals(\"PisClientTestCase\", parser.currentTestSuite.getName());\n        assertEquals(new Date(Date.UTC(110, 9, 2, 13, 39, 23)), parser.currentTestSuite.getStartTime());\n    }\n\n    void shouldParseEndTestSuite() throws Exception {\n        parser.currentTestSuite = new TestSuite(\"host\", \"PisClientTestCase\", new Date());\n\tparser.testSuitesHash.put(\"PisClientTestCase\", parser.currentTestSuite);\n        String line = \"Test Suite 'PisClientTestCase' finished at 2010-10-02 13:41:23 GMT 0000.\";\n        parser.handleLine(line);\n        assertNull(parser.currentTestSuite);\n        assertEquals(0, parser.exitCode);\n    }\n\n    void shouldParseStartTestSuiteXC() throws Exception {\n        String line = \"Test Suite 'All tests' started at 2014-12-12 05:12:52 +0000\";\n        parser.handleLine(line);\n        assertNotNull(parser.currentTestSuite);\n        assertEquals(\"All tests\", parser.currentTestSuite.getName());\n        assertEquals(new Date(Date.UTC(114, 11, 12, 05, 12, 52)), parser.currentTestSuite.getStartTime());\n    }\n\n    void shouldParseEndTestSuiteXC() throws Exception {\n        parser.currentTestSuite = new TestSuite(\"host\", \"All tests\", new Date());\n\tparser.testSuitesHash.put(\"All tests\", parser.currentTestSuite);\n        String line = \"Test Suite 'All tests' passed at 2014-12-12 05:12:52 +0000.\";\n        parser.handleLine(line);\n        assertNull(parser.currentTestSuite);\n        assertEquals(0, parser.exitCode);\n    }\n\n    void shouldParseStartTestCase() throws Exception {\n        parser.currentTestSuite = new TestSuite(\"host\", \"PisClientTestCase\", new Date());\n\tparser.testSuitesHash.put(\"PisClientTestCase\", parser.currentTestSuite);\n        String line = \"Test Case '-[PisClientTestCase testThatFails]' started.\";\n        parser.handleLine(line);\n        assertNotNull(parser.currentTestCase);\n        assertEquals(\"testThatFails\", parser.currentTestCase.getName());\n    }\n\n    void shouldAddErrorToTestCase() throws Exception {\n        parser.currentTestSuite = new TestSuite(\"host\", \"PisClientTestCase\", new Date());\n\tparser.testSuitesHash.put(\"PisClientTestCase\", parser.currentTestSuite);\n        parser.currentTestCase = new TestCase(\"PisClientTestCase\", \"testThatFails\");\n\tparser.currentTestSuite.getTestCasesHash().put(\"testThatFails\", parser.currentTestCase);\n        String line = \"/Users/ray/Development/Projects/Java/xcodebuild-hudson-plugin/work/jobs/PBS Streamer/workspace/PisClientTestCase.m:21: error: -[PisClientTestCase testThatFails] : \\\"((nil) != nil)\\\" should be true. This always fails\";\n        parser.handleLine(line);\n        assertEquals(1, parser.currentTestCase.getFailures().size());\n        assertEquals(\"/Users/ray/Development/Projects/Java/xcodebuild-hudson-plugin/work/jobs/PBS Streamer/workspace/PisClientTestCase.m:21\", parser.currentTestCase.getFailures().get(0).getLocation());\n        assertEquals(\"\\\"((nil) != nil)\\\" should be true. This always fails\", parser.currentTestCase.getFailures().get(0).getMessage());\n    }\n\t\n    void shouldAddUIErrorToTestCase() throws Exception {\n        parser.currentTestSuite = new TestSuite(\"host\", \"PisClientTestCase\", new Date());\n\tparser.testSuitesHash.put(\"PisClientTestCase\", parser.currentTestSuite);\n        parser.currentTestCase = new TestCase(\"PisClientTestCase\", \"testThatFails\");\n\tparser.currentTestSuite.getTestCasesHash().put(\"testThatFails\", parser.currentTestCase);\n        String line = \"t =    29.77s             Assertion Failure: AppUITests.m:31: UI Testing Failure - No matches found for Alert\";\n        parser.handleLine(line);\n        assertEquals(1, parser.currentTestCase.getFailures().size());\n        assertEquals(\"AppUITests.m:31\", parser.currentTestCase.getFailures().get(0).getLocation());\n        assertEquals(\"UI Testing Failure - No matches found for Alert\", parser.currentTestCase.getFailures().get(0).getMessage());\n    }\n\n    void shouldParsePassedTestCase() throws Exception {\n        parser.currentTestSuite = new TestSuite(\"host\", \"PisClientTestCase\", new Date());\n\tparser.testSuitesHash.put(\"PisClientTestCase\", parser.currentTestSuite);\n        parser.currentTestCase = new TestCase(\"PisClientTestCase\",\"testThatPasses\");\n\tparser.currentTestSuite.getTestCasesHash().put(\"testThatPasses\", parser.currentTestCase);\n        String line = \"Test Case '-[PisClientTestCase testThatPasses]' passed (1.234 seconds).\";\n        parser.handleLine(line);\n        assertNull(parser.currentTestCase);\n        assertEquals(1, parser.currentTestSuite.getTestCases().size());\n        assertEquals(\"testThatPasses\", parser.currentTestSuite.getTestCases().get(0).getName());\n        assertEquals(1.234f, parser.currentTestSuite.getTestCases().get(0).getTime(),0);\n        assertEquals(1,parser.currentTestSuite.getTests());\n        assertEquals(0,parser.currentTestSuite.getFailures());\n    }\n\n    void shouldParseFailedTestCase() throws Exception {\n        parser.currentTestSuite = new TestSuite(\"host\", \"PisClientTestCase\", new Date());\n\tparser.testSuitesHash.put(\"PisClientTestCase\", parser.currentTestSuite);\n        parser.currentTestCase = new TestCase(\"PisClientTestCase\",\"testThatFails\");\n\tparser.currentTestSuite.getTestCasesHash().put(\"testThatFails\", parser.currentTestCase);\n        String line = \"Test Case '-[PisClientTestCase testThatFails]' failed (1.234 seconds).\";\n        parser.handleLine(line);\n        assertNull(parser.currentTestCase);\n        assertEquals(1, parser.currentTestSuite.getTestCases().size());\n        assertEquals(\"testThatFails\", parser.currentTestSuite.getTestCases().get(0).getName());\n        assertEquals(1.234f, parser.currentTestSuite.getTestCases().get(0).getTime(),0);\n        assertEquals(1,parser.currentTestSuite.getTests());\n        assertEquals(1,parser.currentTestSuite.getFailures());\n    }\n}\n"
  },
  {
    "path": "src/test/java/au/com/rayh/XCodeBuildHelpParserTest.java",
    "content": "package au.com.rayh;\n\nimport org.junit.Assert;\nimport org.apache.commons.io.FileUtils;\nimport org.junit.Test;\n\n/**\n * Created by Kazuhide Takahashi on 4/26/18.\n */\npublic class XCodeBuildHelpParserTest {\n\n    @Test\n    public void testValidOutput() throws Throwable {\n        String xcodeBuildOutput = FileUtils.readFileToString(FileUtils.toFile(ClassLoader.getSystemResource(\"xcodebuildhelp-valid.txt\")));\n        XcodeBuildHelpParser parser = new XcodeBuildHelpParser(xcodeBuildOutput);\n        Assert.assertEquals(2, parser.getParameters().size());\n        Assert.assertTrue(parser.getParameters().contains(\"-SampleTarget1\"));\n        Assert.assertTrue(parser.getParameters().contains(\"-TestSampleTarget1\"));\n    }\n\n    @Test\n    public void testInvalidOutputNull() throws Throwable {\n        XcodeBuildHelpParser parser = new XcodeBuildHelpParser(null);\n        Assert.assertEquals(0, parser.getParameters().size());\n    }\n\n    @Test\n    public void testInvalidOutputEmpty() throws Throwable {\n        String xcodeBuildOutput = FileUtils.readFileToString(FileUtils.toFile(ClassLoader.getSystemResource(\"xcodebuildhelp-invalid.txt\")));\n        XcodeBuildHelpParser parser = new XcodeBuildHelpParser(\"\");\n        Assert.assertEquals(0, parser.getParameters().size());\n    }\n\n    @Test\n    public void testInvalidOutputExtraLine() throws Throwable {\n        String xcodeBuildOutput = FileUtils.readFileToString(FileUtils.toFile(ClassLoader.getSystemResource(\"xcodebuildhelp-invalid.txt\")));\n        XcodeBuildHelpParser parser = new XcodeBuildHelpParser(xcodeBuildOutput);\n        Assert.assertEquals(0, parser.getParameters().size());\n    }\n}\n"
  },
  {
    "path": "src/test/java/au/com/rayh/XCodeBuildListParserTest.java",
    "content": "package au.com.rayh;\n\nimport org.junit.Assert;\nimport org.apache.commons.io.FileUtils;\nimport org.junit.Test;\n\n/**\n * Created by timothy on 9/6/14.\n */\npublic class XCodeBuildListParserTest {\n\n\n    @Test\n    public void testValidOutput() throws Throwable {\n        String xcodeBuildOutput = FileUtils.readFileToString(FileUtils.toFile(ClassLoader.getSystemResource(\"xcodebuildlist-valid.txt\")));\n\n        XcodeBuildListParser parser = new XcodeBuildListParser(xcodeBuildOutput);\n\n        Assert.assertEquals(4, parser.getTargets().size());\n        Assert.assertEquals(2, parser.getConfigurations().size());\n        Assert.assertEquals(2, parser.getSchemes().size());\n\n        Assert.assertTrue(parser.getTargets().contains(\"SampleTarget1\"));\n        Assert.assertTrue(parser.getTargets().contains(\"SampleTarget2\"));\n        Assert.assertTrue(parser.getTargets().contains(\"TestSampleTarget1\"));\n        Assert.assertTrue(parser.getTargets().contains(\"TestSampleTarget2\"));\n        Assert.assertTrue(parser.getConfigurations().contains(\"BuildConfiguration1\"));\n        Assert.assertTrue(parser.getConfigurations().contains(\"BuildConfiguration2\"));\n        Assert.assertTrue(parser.getSchemes().contains(\"SampleScheme1\"));\n        Assert.assertTrue(parser.getSchemes().contains(\"SampleScheme2\"));\n\n    }\n\n    @Test\n    public void testInvalidOutputNull() throws Throwable {\n        XcodeBuildListParser parser = new XcodeBuildListParser(null);\n\n        Assert.assertEquals(0, parser.getTargets().size());\n        Assert.assertEquals(0, parser.getConfigurations().size());\n        Assert.assertEquals(0, parser.getSchemes().size());\n\n    }\n\n    @Test\n    public void testInvalidOutputEmpty() throws Throwable {\n        String xcodeBuildOutput = FileUtils.readFileToString(FileUtils.toFile(ClassLoader.getSystemResource(\"xcodebuildlist-invalid1.txt\")));\n\n        XcodeBuildListParser parser = new XcodeBuildListParser(\"\");\n\n        Assert.assertEquals(0, parser.getTargets().size());\n        Assert.assertEquals(0, parser.getConfigurations().size());\n        Assert.assertEquals(0, parser.getSchemes().size());\n\n    }\n\n    @Test\n    public void testInvalidOutputExtraLine() throws Throwable {\n        String xcodeBuildOutput = FileUtils.readFileToString(FileUtils.toFile(ClassLoader.getSystemResource(\"xcodebuildlist-invalid1.txt\")));\n\n        XcodeBuildListParser parser = new XcodeBuildListParser(xcodeBuildOutput);\n\n        Assert.assertEquals(0, parser.getTargets().size());\n        Assert.assertEquals(0, parser.getConfigurations().size());\n        Assert.assertEquals(0, parser.getSchemes().size());\n\n    }\n\n    @Test\n    public void testInvalidOutputMissngColon() throws Throwable {\n        String xcodeBuildOutput = FileUtils.readFileToString(FileUtils.toFile(ClassLoader.getSystemResource(\"xcodebuildlist-invalid2.txt\")));\n\n        XcodeBuildListParser parser = new XcodeBuildListParser(xcodeBuildOutput);\n\n        Assert.assertEquals(0, parser.getTargets().size());\n        Assert.assertEquals(0, parser.getConfigurations().size());\n        Assert.assertEquals(0, parser.getSchemes().size());\n\n    }\n}\n"
  },
  {
    "path": "src/test/java/au/com/rayh/XCodeBuildOutputParserTest.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2011 Ray Yamamoto Hilton\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage au.com.rayh;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.PrintStream;\n\nimport hudson.util.IOUtils;\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\n\n/**\n *\n * @author ray\n */\npublic class XCodeBuildOutputParserTest {\n    OutputParserTests test;\n\n    @Before\n    public void setUp() throws IOException, InterruptedException {\n        XCodeBuildOutputParser parser = new XCodeBuildOutputParser(new File(\".\"), new PrintStream(\"test-output.txt\"));\n        test = new OutputParserTests(parser);\n    }\n\n    @After\n    public void tearDown() {\n    }\n\n    @Test\n    public void shouldIgnoreStartSuiteLineThatContainsFullPath() throws Exception {\n    \ttest.shouldIgnoreStartSuiteLineThatContainsFullPath();\n    }\n\n    @Test\n    public void shouldParseStartTestSuite() throws Exception {\n    \ttest.shouldParseStartTestSuite();\n    }\n\n    @Test\n    public void shouldParseEndTestSuite() throws Exception {\n    \ttest.shouldParseEndTestSuite();\n    }\n\n    @Test\n    public void shouldParseStartTestSuiteXC() throws Exception {\n    \ttest.shouldParseStartTestSuiteXC();\n    }\n\n    @Test\n    public void shouldParseEndTestSuiteXC() throws Exception {\n    \ttest.shouldParseEndTestSuiteXC();\n    }\n\n    @Test\n    public void shouldParseStartTestCase() throws Exception {\n    \ttest.shouldParseStartTestCase();\n    }\n\n    @Test\n    public void shouldAddErrorToTestCase() throws Exception {\n    \ttest.shouldAddErrorToTestCase();\n    }\n    \n    @Test\n    public void shouldAddUIErrorToTestCase() throws Exception {\n    \ttest.shouldAddUIErrorToTestCase();\n    }\n\n    @Test\n    public void shouldParsePassedTestCase() throws Exception {\n    \ttest.shouldParsePassedTestCase();\n    }\n\n    @Test\n    public void shouldParseFailedTestCase() throws Exception {\n    \ttest.shouldParseFailedTestCase();\n    }\n\n    @Test\n    public void shouldParseFullXCPassingTestOutput1() throws IOException {\n        XCodeBuildOutputParser parser = parseTestOutput(\"/XCTest_output_passing_1.txt\");\n        assertEquals(0, parser.getExitCode());\n    }\n\n    @Test\n    public void shouldParseFullXCFailingTestOutput1() throws IOException {\n        XCodeBuildOutputParser parser = parseTestOutput(\"/XCTest_output_failing_1.txt\");\n        assertEquals(-1, parser.getExitCode());\n    }\n\n    //@Issue(\"JENKINS-26295\")\n    @Test\n    public void shouldParseFullXCFailingTestOutput2() throws IOException {\n        XCodeBuildOutputParser parser = parseTestOutput(\"/XCTest_output_failing_2.txt\");\n        assertEquals(-1, parser.getExitCode());\n    }\n\n    @Test\n    public void shouldParseFullXCCrashingTestOutput1() throws IOException {\n        XCodeBuildOutputParser parser = parseTestOutput(\"/XCTest_output_crashing_1.txt\");\n        assertEquals(-1, parser.getExitCode());\n    }\n\n    private XCodeBuildOutputParser parseTestOutput(String outputFileName) throws IOException {\n        ByteArrayOutputStream output = new ByteArrayOutputStream();\n        XCodeBuildOutputParser parser = new XCodeBuildOutputParser(new File(\".\"), output);\n        IOUtils.copy(getClass().getResourceAsStream(outputFileName), parser.captureOutputStream);\n        return parser;\n    }\n\n    // JENKINS-37072\n    @Test\n    public void shouldParseFullXCPassingTestComplex1() throws IOException {\n\tXCodeBuildOutputParser parser = parseTestOutput(\"/XCTest_output_complex_1.txt\");\n\tassertEquals(-1, parser.getExitCode());\n    }\n\n    // JENKINS-37072\n    @Test\n    public void shouldParseFullXCPassingTestComplex2() throws IOException {\n\tXCodeBuildOutputParser parser = parseTestOutput(\"/XCTest_output_complex_2.txt\");\n\tassertEquals(-1, parser.getExitCode());\n    }\n}\n"
  },
  {
    "path": "src/test/java/au/com/rayh/XCodeBuilderTest.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2012 Jerome Lacoste\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage au.com.rayh;\n\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport java.util.Collections;\n\nimport static org.junit.Assert.*;\nimport static java.util.Arrays.asList;\n\n\npublic class XCodeBuilderTest {\n\n    @Before\n    public void setUp() {\n    }\n\n    @After\n    public void tearDown() {\n    }\n\n    @Test\n    public void shouldSplitXcodeBuildArgumentsWithoutEscapedSpaces() throws Exception {\n        assertEquals(Collections.singletonList(\"GCC_SYMBOLS_PRIVATE_EXTERN=NO\"),\n            XCodeBuilder.splitXcodeBuildArguments(\"GCC_SYMBOLS_PRIVATE_EXTERN=NO\"));\n        assertEquals(asList(\"GCC_SYMBOLS_PRIVATE_EXTERN=NO\", \"COPY_PHASE_STRIP=NO\"),\n            XCodeBuilder.splitXcodeBuildArguments(\"GCC_SYMBOLS_PRIVATE_EXTERN=NO COPY_PHASE_STRIP=NO\"));\n    }\n\n    @Test\n    public void shouldSplitXcodeBuildArgumentsWithEscapedSpaces() throws Exception {\n        assertEquals(Collections.singletonList(\"CODE_SIGN_IDENTITY=iPhone Developer: Todd Kirby\"),\n            XCodeBuilder.splitXcodeBuildArguments(\"CODE_SIGN_IDENTITY=iPhone\\\\ Developer:\\\\ Todd\\\\ Kirby\"));\n        assertEquals(asList(\"A=B\", \"CODE_SIGN_IDENTITY=iPhone Developer: Todd Kirby\"),\n            XCodeBuilder.splitXcodeBuildArguments(\"A=B CODE_SIGN_IDENTITY=iPhone\\\\ Developer:\\\\ Todd\\\\ Kirby\"));\n        assertEquals(asList(\"A=B\", \"CODE_SIGN_IDENTITY=iPhone Distribution\", \"C=D\"),\n            XCodeBuilder.splitXcodeBuildArguments(\"A=B CODE_SIGN_IDENTITY=\\\"iPhone Distribution\\\" C=D\"));\n    }\n    @Test\n    public void shouldUnquoteWhenSplittingXcodeBuildArgumentsWithIncompleteDoubleQuote() throws Exception {\n        assertEquals(asList(\"A=B\", \"CODE_SIGN_IDENTITY=iPhone Distribution\"),\n            XCodeBuilder.splitXcodeBuildArguments(\"A=B CODE_SIGN_IDENTITY=\\\"iPhone Distribution\"));\n    }\n    @Test\n    public void shouldUnquoteWhenSplittingXcodeBuildArgumentsWithIncompleteSingleQuote() throws Exception {\n        assertEquals(asList(\"A=B\", \"CODE_SIGN_IDENTITY=iPhone\"),\n            XCodeBuilder.splitXcodeBuildArguments(\"A=B CODE_SIGN_IDENTITY='iPhone\"));\n    }\n}"
  },
  {
    "path": "src/test/java/au/com/rayh/XcodeProjectParserTest.java",
    "content": "package au.com.rayh;\n\nimport org.junit.Assert;\nimport org.apache.commons.io.FileUtils;\nimport org.junit.Test;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.io.File;\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.Arrays;\nimport org.junit.Assume;\nimport org.junit.Rule;\nimport org.junit.rules.TemporaryFolder;\nimport hudson.FilePath;\nimport hudson.Launcher.LocalLauncher;\nimport hudson.util.StreamTaskListener;\n\n/**\n * Created by Kazuhide Takahashi on 1/22/18.\n */\npublic class XcodeProjectParserTest {\n    @Rule public TemporaryFolder tmp = new TemporaryFolder();\n    @Test\n    public void testValidProject() throws Throwable {\n\tFile dir = tmp.getRoot();\n\tFilePath workspace = new FilePath(dir);\n\tString projectLocation = URLDecoder.decode(XcodeProjectParserTest.class.getClassLoader().getResource(\"XcodeProject.tar.gz\").getPath(), \"UTF-8\");\n\trun(workspace, \"tar\", \"zxvpf\", projectLocation);\n\tFilePath projectPath = workspace.child(\"TestXcodeProject.xcodeproj\");\n\tAssert.assertNotNull(projectPath);\n        HashMap<String, ProjectScheme> xcodeSchemes = XcodeProjectParser.listXcodeSchemes(projectPath);\n\tAssert.assertNotNull(xcodeSchemes);\n        Assert.assertEquals(1, xcodeSchemes.size());\n        String xcodeSchema = \"TestXcodeProject\";\n        Assert.assertTrue(xcodeSchemes.containsKey(xcodeSchema));\n        ProjectScheme projectScheme = xcodeSchemes.get(xcodeSchema);\n        Assert.assertEquals(\"container:TestXcodeProject.xcodeproj\", projectScheme.referencedContainer);\n        Assert.assertEquals(\"TestXcodeProject\", projectScheme.blueprintName);\n\tFilePath workspacePath = workspace.child(\"TestXcodeProject.xcworkspace\");\n\tAssert.assertNotNull(workspacePath);\n        List<String> projectList = XcodeProjectParser.parseXcodeWorkspace(workspacePath);\n\tAssert.assertNotNull(projectList);\n        Assert.assertEquals(1, projectList.size());\n        Assert.assertTrue(projectList.contains(\"TestXcodeProject.xcodeproj\"));\n        XcodeProject xcodeProject = XcodeProjectParser.parseXcodeProject(projectPath);\n        Assert.assertNotNull(xcodeProject.projectTarget.get(\"TestXcodeProject\"));\n        Assert.assertNotNull(xcodeProject.projectTarget.get(\"TestXcodeProjectTests\"));\n        Assert.assertNotNull(xcodeProject.projectTarget.get(\"TestXcodeProjectTests\"));\n    }\n\n    @Test\n    public void testInvalidProject() throws Throwable {\n\n    }\n\n    private static void run(FilePath dir, String... cmds) throws InterruptedException {\n        try {\n            Assert.assertEquals(0, new LocalLauncher(StreamTaskListener.fromStdout()).launch().cmds(cmds).pwd(dir).join());\n        } catch (IOException x) { // perhaps restrict to x.message.contains(\"Cannot run program\")? or \"error=2, No such file or directory\"?\n            Assume.assumeNoException(\"failed to run \" + Arrays.toString(cmds), x);\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/java/au/com/rayh/XcodeTestSummariesParserTest.java",
    "content": "package au.com.rayh;\n\nimport org.junit.Assert;\nimport org.apache.commons.io.FileUtils;\nimport org.junit.Test;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.io.File;\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.Arrays;\nimport org.junit.Assume;\nimport org.junit.Rule;\nimport org.junit.rules.TemporaryFolder;\nimport hudson.FilePath;\nimport hudson.Launcher.LocalLauncher;\nimport hudson.util.StreamTaskListener;\n\n/**\n * Created by Kazuhide Takahashi on 1/7/19.\n */\npublic class XcodeTestSummariesParserTest {\n    @Rule public TemporaryFolder tmp = new TemporaryFolder();\n    @Test\n    public void testValidTestSummaries() throws Throwable {\n\tFile dir = tmp.getRoot();\n\tFilePath workspace = new FilePath(dir);\n\tString projectLocation = URLDecoder.decode(XcodeTestSummariesParserTest.class.getClassLoader().getResource(\"XcodeTestSummaries.tar.gz\").getPath(), \"UTF-8\");\n\trun(workspace, \"tar\", \"zxvpf\", projectLocation);\n\tFilePath testSummariesPath = workspace.child(\"result/TestSummaries.plist\");\n\tAssert.assertNotNull(testSummariesPath);\n        XcodeTestSummariesParser parser = new XcodeTestSummariesParser(new FilePath(new File(\".\")));\n\tAssert.assertNotNull(parser);\n\tparser.parseTestSummariesPlist(testSummariesPath);\n    }\n\n    @Test\n    public void testInvalidTestSummaries() throws Throwable {\n\n    }\n\n    private static void run(FilePath dir, String... cmds) throws InterruptedException {\n        try {\n            Assert.assertEquals(0, new LocalLauncher(StreamTaskListener.fromStdout()).launch().cmds(cmds).pwd(dir).join());\n        } catch (IOException x) { // perhaps restrict to x.message.contains(\"Cannot run program\")? or \"error=2, No such file or directory\"?\n            Assume.assumeNoException(\"failed to run \" + Arrays.toString(cmds), x);\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/resources/XCTest_output_complex_1.txt",
    "content": "Test Suite 'All tests' started at 2018-05-17 07:07:31.814\nTest Suite 'XCUITests-ExampleTests.xctest' started at 2018-05-17 07:07:31.815\nTest Suite 'Objc_Test_Under_Score_Tests' started at 2018-05-17 07:07:31.816\nTest Case '-[Objc_Test_Under_Score_Tests testExample]' started.\nTest Case '-[Objc_Test_Under_Score_Tests testExample]' passed (0.001 seconds).\nTest Case '-[Objc_Test_Under_Score_Tests testPerformanceExample]' started.\nTest Case '-[Objc_Test_Under_Score_Tests testPerformanceExample]' passed (0.339 seconds).\nTest Suite 'Objc_Test_Under_Score_Tests' passed at 2018-05-17 07:07:32.157.\nTest Suite 'Objec_SubTests' started at 2018-05-17 07:07:32.157\nTest Case '-[Objec_SubTests testExample]' started.\nTest Case '-[Objec_SubTests testExample]' passed (0.000 seconds).\nTest Case '-[Objec_SubTests testPerformanceExample]' started.\nTest Case '-[Objec_SubTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'Objec_SubTests' passed at 2018-05-17 07:07:32.410.\nTest Suite 'RaiseAnExceptionTests' started at 2018-05-17 07:07:32.411\nTest Case '-[RaiseAnExceptionTests testExample1]' started.\n/Volumes/RAID10HDD/iOS/XCUITests_Example/XCUITests_ExampleTests/RaiseAnExceptionTests.m:32: error: -[RaiseAnExceptionTests testExample1] : failed: caught \"NSRangeException\", \"*** -[__NSArrayI objectAtIndex:]: index 11 beyond bounds [0 .. 2]\"\nTest Case '-[RaiseAnExceptionTests testExample1]' failed (0.015 seconds).\nTest Case '-[RaiseAnExceptionTests testExample2]' started.\n/Volumes/RAID10HDD/iOS/XCUITests_Example/XCUITests_ExampleTests/RaiseAnExceptionTests.m:40: error: -[RaiseAnExceptionTests testExample2] : ((result) equal to (@\"value1\")) failed: (\"value2\") is not equal to (\"value1\")\nTest Case '-[RaiseAnExceptionTests testExample2]' failed (0.001 seconds).\nTest Case '-[RaiseAnExceptionTests testExample3]' started.\nTest Case '-[RaiseAnExceptionTests testExample3]' passed (0.000 seconds).\nTest Case '-[RaiseAnExceptionTests testPerformanceExample]' started.\nTest Case '-[RaiseAnExceptionTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'RaiseAnExceptionTests' failed at 2018-05-17 07:07:32.681.\nTest Suite 'Swift_SubTests' started at 2018-05-17 07:07:32.682\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample1]' started.\n<unknown>:0: error: -[XCUITests_ExampleTests.Swift_SubTests testExample1] : failed: caught \"NSRangeException\", \"*** -[__NSArrayI objectAtIndex:]: index 10 beyond bounds [0 .. 2]\"\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample1]' failed (0.013 seconds).\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample2]' started.\n/Volumes/RAID10HDD/iOS/XCUITests_Example/XCUITests_ExampleTests/SubTests/Swift_SubTests.swift:36: error: -[XCUITests_ExampleTests.Swift_SubTests testExample2] : XCTAssertEqual failed: (\"Optional(\"value2\")\") is not equal to (\"Optional(\"value1\")\") - \nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample2]' failed (0.005 seconds).\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample3]' started.\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample3]' passed (0.000 seconds).\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testPerformanceExample]' started.\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'Swift_SubTests' failed at 2018-05-17 07:07:32.955.\nTest Suite 'Swift_Test_Under_Score_Tests' started at 2018-05-17 07:07:32.956\nTest Case '-[XCUITests_ExampleTests.Swift_Test_Under_Score_Tests testExample]' started.\nTest Case '-[XCUITests_ExampleTests.Swift_Test_Under_Score_Tests testExample]' passed (0.001 seconds).\nTest Case '-[XCUITests_ExampleTests.Swift_Test_Under_Score_Tests testPerformanceExample]' started.\nTest Case '-[XCUITests_ExampleTests.Swift_Test_Under_Score_Tests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'Swift_Test_Under_Score_Tests' passed at 2018-05-17 07:07:33.210.\nTest Suite 'XCUITests_AnotherTests' started at 2018-05-17 07:07:33.210\nTest Case '-[XCUITests_AnotherTests testExample]' started.\nTest Case '-[XCUITests_AnotherTests testExample]' passed (0.001 seconds).\nTest Case '-[XCUITests_AnotherTests testPerformanceExample]' started.\nTest Case '-[XCUITests_AnotherTests testPerformanceExample]' passed (0.253 seconds).\nTest Suite 'XCUITests_AnotherTests' passed at 2018-05-17 07:07:33.464.\nTest Suite 'XCUITests_ExampleTests' started at 2018-05-17 07:07:33.465\nTest Case '-[XCUITests_ExampleTests testExample]' started.\nTest Case '-[XCUITests_ExampleTests testExample]' passed (0.001 seconds).\nTest Case '-[XCUITests_ExampleTests testPerformanceExample]' started.\nTest Case '-[XCUITests_ExampleTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'XCUITests_ExampleTests' passed at 2018-05-17 07:07:33.718.\nTest Suite 'XCUITests_SubTests' started at 2018-05-17 07:07:33.719\nTest Case '-[XCUITests_SubTests testExample]' started.\nTest Case '-[XCUITests_SubTests testExample]' passed (0.000 seconds).\nTest Case '-[XCUITests_SubTests testPerformanceExample]' started.\nTest Case '-[XCUITests_SubTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'XCUITests_SubTests' passed at 2018-05-17 07:07:33.972.\nTest Suite 'XCUITests_SwiftTests' started at 2018-05-17 07:07:33.973\nTest Case '-[XCUITests_ExampleTests.XCUITests_SwiftTests testExample]' started.\nTest Case '-[XCUITests_ExampleTests.XCUITests_SwiftTests testExample]' passed (0.001 seconds).\nTest Case '-[XCUITests_ExampleTests.XCUITests_SwiftTests testPerformanceExample]' started.\nTest Case '-[XCUITests_ExampleTests.XCUITests_SwiftTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'XCUITests_SwiftTests' passed at 2018-05-17 07:07:34.227.\nTest Suite 'XCUITests-ExampleTests.xctest' failed at 2018-05-17 07:07:34.227.\nTest Suite 'All tests' failed at 2018-05-17 07:07:34.228.\nTest Suite 'All tests' started at 2018-05-17 07:07:40.691\nTest Suite 'XCUITests-ExampleUITests.xctest' started at 2018-05-17 07:07:40.692\nTest Suite 'XCUITests_ExampleUITests' started at 2018-05-17 07:07:40.693\nTest Case '-[XCUITests_ExampleUITests testExample]' started.\n    t =     0.00s Start Test at 2018-05-17 07:07:40.693\n    t =     0.07s Set Up\n    t =     0.07s     Open net.hoge2.XCUITests-Example\n    t =     0.12s         Launch net.hoge2.XCUITests-Example\n    t =     5.04s             Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.21s Tap \"Add\" Button\n    t =     6.22s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.26s     Find the \"Add\" Button\n    t =     6.26s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     6.30s         Find: Descendants matching type NavigationBar\n    t =     6.30s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     6.31s         Find: Descendants matching type Button\n    t =     6.31s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     6.41s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.46s     Synthesize event\n    t =     6.59s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.08s Tap \"Add\" Button\n    t =     7.08s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.12s     Find the \"Add\" Button\n    t =     7.13s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     7.15s         Find: Descendants matching type NavigationBar\n    t =     7.15s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     7.16s         Find: Descendants matching type Button\n    t =     7.16s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     7.26s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.31s     Synthesize event\n    t =     7.43s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.90s Tap Cell\n    t =     7.90s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.95s     Find the Cell\n    t =     7.95s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     7.98s         Find: Descendants matching type Table\n    t =     7.98s         Find: Descendants matching type Cell\n    t =     7.98s         Find: Element at index 0\n    t =     8.08s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.13s     Synthesize event\n    t =     8.26s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.79s Tap \"Master\" Button\n    t =     8.79s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.85s     Find the \"Master\" Button\n    t =     8.85s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     8.87s         Find: Descendants matching type NavigationBar\n    t =     8.87s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =     8.87s         Find: Descendants matching type Button\n    t =     8.87s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     8.98s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.03s     Synthesize event\n    t =     9.15s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.67s Tap Cell\n    t =     9.67s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.73s     Find the Cell\n    t =     9.73s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     9.75s         Find: Descendants matching type Table\n    t =     9.75s         Find: Descendants matching type Cell\n    t =     9.75s         Find: Element at index 1\n    t =     9.86s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.91s     Synthesize event\n    t =    10.03s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.56s Tap \"Master\" Button\n    t =    10.56s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.62s     Find the \"Master\" Button\n    t =    10.62s         Snapshot accessibility hierarchy for app with pid 39901\n    t =    10.64s         Find: Descendants matching type NavigationBar\n    t =    10.64s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =    10.64s         Find: Descendants matching type Button\n    t =    10.64s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    10.75s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.80s     Synthesize event\n    t =    10.92s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.44s Tap \"Edit\" Button\n    t =    11.44s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.49s     Find the \"Edit\" Button\n    t =    11.50s         Snapshot accessibility hierarchy for app with pid 39901\n    t =    11.52s         Find: Descendants matching type NavigationBar\n    t =    11.52s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    11.52s         Find: Descendants matching type Button\n    t =    11.52s         Find: Elements matching predicate '\"Edit\" IN identifiers'\n    t =    11.63s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.67s     Synthesize event\n    t =    11.79s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.28s Tap \"Done\" Button\n    t =    12.28s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.33s     Find the \"Done\" Button\n    t =    12.33s         Snapshot accessibility hierarchy for app with pid 39901\n    t =    12.36s         Find: Descendants matching type NavigationBar\n    t =    12.36s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    12.36s         Find: Descendants matching type Button\n    t =    12.36s         Find: Elements matching predicate '\"Done\" IN identifiers'\n    t =    12.47s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.52s     Synthesize event\n    t =    12.64s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    13.11s Tear Down\nTest Case '-[XCUITests_ExampleUITests testExample]' passed (13.316 seconds).\nTest Suite 'XCUITests_ExampleUITests' passed at 2018-05-17 07:07:54.010.\nTest Suite 'XCUITests_ExampleUITestsFail' started at 2018-05-17 07:07:54.011\nTest Case '-[XCUITests_ExampleUITestsFail testExample]' started.\n    t =     0.00s Start Test at 2018-05-17 07:07:54.012\n    t =     0.05s Set Up\n    t =     0.15s     Open net.hoge2.XCUITests-Example\n    t =     0.19s         Launch net.hoge2.XCUITests-Example\n    t =     0.19s             Terminate net.hoge2.XCUITests-Example:39901\n    t =     5.29s             Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.45s Tap \"Add\" Button\n    t =     6.45s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.49s     Find the \"Add\" Button\n    t =     6.50s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     6.53s         Find: Descendants matching type NavigationBar\n    t =     6.54s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     6.54s         Find: Descendants matching type Button\n    t =     6.54s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     6.64s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.69s     Synthesize event\n    t =     6.82s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.30s Tap \"Add\" Button\n    t =     7.30s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.35s     Find the \"Add\" Button\n    t =     7.35s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     7.38s         Find: Descendants matching type NavigationBar\n    t =     7.38s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     7.38s         Find: Descendants matching type Button\n    t =     7.38s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     7.49s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.54s     Synthesize event\n    t =     7.66s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.13s Tap Cell\n    t =     8.13s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.18s     Find the Cell\n    t =     8.18s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     8.20s         Find: Descendants matching type Table\n    t =     8.20s         Find: Descendants matching type Cell\n    t =     8.21s         Find: Element at index 0\n    t =     8.31s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.36s     Synthesize event\n    t =     8.49s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.02s Tap \"Master\" Button\n    t =     9.02s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.08s     Find the \"Master\" Button\n    t =     9.08s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     9.10s         Find: Descendants matching type NavigationBar\n    t =     9.10s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =     9.10s         Find: Descendants matching type Button\n    t =     9.10s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     9.21s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.26s     Synthesize event\n    t =     9.38s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.90s Tap Cell\n    t =     9.90s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.95s     Find the Cell\n    t =     9.95s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     9.98s         Find: Descendants matching type Table\n    t =     9.98s         Find: Descendants matching type Cell\n    t =     9.98s         Find: Element at index 1\n    t =    10.08s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.13s     Synthesize event\n    t =    10.26s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.78s Tap \"Master\" Button\n    t =    10.78s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.83s     Find the \"Master\" Button\n    t =    10.83s         Snapshot accessibility hierarchy for app with pid 39907\n    t =    10.85s         Find: Descendants matching type NavigationBar\n    t =    10.85s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =    10.85s         Find: Descendants matching type Button\n    t =    10.85s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    10.96s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.01s     Synthesize event\n    t =    11.12s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.64s Tap \"Edit\" Button\n    t =    11.64s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.69s     Find the \"Edit\" Button\n    t =    11.69s         Snapshot accessibility hierarchy for app with pid 39907\n    t =    11.71s         Find: Descendants matching type NavigationBar\n    t =    11.71s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    11.72s         Find: Descendants matching type Button\n    t =    11.72s         Find: Elements matching predicate '\"Edit\" IN identifiers'\n    t =    11.82s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.87s     Synthesize event\n    t =    11.99s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.47s Tap Cell\n    t =    12.47s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.52s     Find the Cell\n    t =    12.52s         Snapshot accessibility hierarchy for app with pid 39907\n    t =    12.54s         Find: Descendants matching type Table\n    t =    12.54s         Find: Descendants matching type Cell\n    t =    12.54s         Find: Element at index 0\n    t =    12.65s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.70s     Synthesize event\n    t =    12.82s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.87s Tap \"Delete\" Button\n    t =    12.87s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.91s     Find the \"Delete\" Button\n    t =    12.92s         Snapshot accessibility hierarchy for app with pid 39907\n    t =    12.94s         Find: Descendants matching type Table\n    t =    12.94s         Find: Descendants matching type Button\n    t =    12.94s         Find: Elements matching predicate '\"Delete\" IN identifiers'\n    t =    13.05s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    14.10s         Find the \"Delete\" Button (retry 1)\n    t =    14.10s             Snapshot accessibility hierarchy for app with pid 39907\n    t =    14.12s             Find: Descendants matching type Table\n    t =    14.13s             Find: Descendants matching type Button\n    t =    14.13s             Find: Elements matching predicate '\"Delete\" IN identifiers'\n    t =    14.23s             Wait for net.hoge2.XCUITests-Example to idle\n    t =    15.28s         Find the \"Delete\" Button (retry 2)\n    t =    15.29s             Snapshot accessibility hierarchy for app with pid 39907\n    t =    15.31s             Find: Descendants matching type Table\n    t =    15.31s             Find: Descendants matching type Button\n    t =    15.31s             Find: Elements matching predicate '\"Delete\" IN identifiers'\n    t =    15.42s             Wait for net.hoge2.XCUITests-Example to idle\n    t =    15.52s         Assertion Failure: XCUITests_ExampleUITestsFail.m:57: No matches found for Find: Elements matching predicate '\"Delete\" IN identifiers' from input {(\n** TEST FAILED **\n    t =    15.56s Tear Down\nTest Case '-[XCUITests_ExampleUITestsFail testExample]' failed (15.769 seconds).\nTest Suite 'XCUITests_ExampleUITestsFail' failed at 2018-05-17 07:08:09.782.\nTest Suite 'XCUITests_SubUITests' started at 2018-05-17 07:08:09.783\nTest Case '-[XCUITests_SubUITests testExample]' started.\n    t =     0.00s Start Test at 2018-05-17 07:08:09.784\n    t =     0.04s Set Up\n    t =     0.14s     Open net.hoge2.XCUITests-Example\n    t =     0.18s         Launch net.hoge2.XCUITests-Example\n    t =     0.18s             Terminate net.hoge2.XCUITests-Example:39907\n    t =     5.27s             Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.46s Tap \"Add\" Button\n    t =     6.46s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.51s     Find the \"Add\" Button\n    t =     6.51s         Snapshot accessibility hierarchy for app with pid 39915\n    t =     6.55s         Find: Descendants matching type NavigationBar\n    t =     6.55s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     6.55s         Find: Descendants matching type Button\n    t =     6.56s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     6.66s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.71s     Synthesize event\n    t =     6.85s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.33s Tap \"Add\" Button\n    t =     7.33s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.39s     Find the \"Add\" Button\n    t =     7.39s         Snapshot accessibility hierarchy for app with pid 39915\n    t =     7.42s         Find: Descendants matching type NavigationBar\n    t =     7.42s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     7.42s         Find: Descendants matching type Button\n    t =     7.42s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     7.53s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.57s     Synthesize event\n    t =     7.69s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.17s Tap Cell\n    t =     8.17s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.22s     Find the Cell\n    t =     8.22s         Snapshot accessibility hierarchy for app with pid 39915\n    t =     8.24s         Find: Descendants matching type Table\n    t =     8.24s         Find: Descendants matching type Cell\n    t =     8.24s         Find: Element at index 0\n    t =     8.35s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.40s     Synthesize event\n    t =     8.52s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.06s Tap \"Master\" Button\n    t =     9.06s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.12s     Find the \"Master\" Button\n    t =     9.12s         Snapshot accessibility hierarchy for app with pid 39915\n    t =     9.15s         Find: Descendants matching type NavigationBar\n    t =     9.15s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =     9.15s         Find: Descendants matching type Button\n    t =     9.15s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     9.26s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.31s     Synthesize event\n    t =     9.44s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.95s Tap Cell\n    t =     9.95s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.01s     Find the Cell\n    t =    10.01s         Snapshot accessibility hierarchy for app with pid 39915\n    t =    10.03s         Find: Descendants matching type Table\n    t =    10.04s         Find: Descendants matching type Cell\n    t =    10.04s         Find: Element at index 1\n    t =    10.14s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.20s     Synthesize event\n    t =    10.33s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.85s Tap \"Master\" Button\n    t =    10.85s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.90s     Find the \"Master\" Button\n    t =    10.90s         Snapshot accessibility hierarchy for app with pid 39915\n    t =    10.92s         Find: Descendants matching type NavigationBar\n    t =    10.93s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =    10.93s         Find: Descendants matching type Button\n    t =    10.93s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    11.04s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.09s     Synthesize event\n    t =    11.21s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.72s Tap \"Edit\" Button\n    t =    11.72s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.78s     Find the \"Edit\" Button\n    t =    11.78s         Snapshot accessibility hierarchy for app with pid 39915\n    t =    11.81s         Find: Descendants matching type NavigationBar\n    t =    11.81s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    11.81s         Find: Descendants matching type Button\n    t =    11.81s         Find: Elements matching predicate '\"Edit\" IN identifiers'\n    t =    11.91s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.96s     Synthesize event\n    t =    12.08s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.56s Tap \"Done\" Button\n    t =    12.56s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.62s     Find the \"Done\" Button\n    t =    12.62s         Snapshot accessibility hierarchy for app with pid 39915\n    t =    12.65s         Find: Descendants matching type NavigationBar\n    t =    12.65s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    12.65s         Find: Descendants matching type Button\n    t =    12.65s         Find: Elements matching predicate '\"Done\" IN identifiers'\n    t =    12.76s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.81s     Synthesize event\n    t =    12.93s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    13.41s Tear Down\nTest Case '-[XCUITests_SubUITests testExample]' passed (13.610 seconds).\nTest Suite 'XCUITests_SubUITests' passed at 2018-05-17 07:08:23.394.\nTest Suite 'XCUITests-ExampleUITests.xctest' failed at 2018-05-17 07:08:23.395.\nTest Suite 'All tests' failed at 2018-05-17 07:08:23.396.\n"
  },
  {
    "path": "src/test/resources/XCTest_output_complex_2.txt",
    "content": "Test Suite 'All tests' started at 2018-05-17 07:07:31.814\nTest Suite 'XCUITests-ExampleTests.xctest' started at 2018-05-17 07:07:31.815\nTest Suite 'Objc_Test_Under_Score_Tests' started at 2018-05-17 07:07:31.816\nTest Case '-[Objc_Test_Under_Score_Tests testExample]' started.\nTest Case '-[Objc_Test_Under_Score_Tests testExample]' passed (0.001 seconds).\nTest Case '-[Objc_Test_Under_Score_Tests testPerformanceExample]' started.\nTest Case '-[Objc_Test_Under_Score_Tests testPerformanceExample]' passed (0.339 seconds).\nTest Suite 'Objc_Test_Under_Score_Tests' passed at 2018-05-17 07:07:32.157.\nTest Suite 'Objec_SubTests' started at 2018-05-17 07:07:32.157\nTest Case '-[Objec_SubTests testExample]' started.\nTest Case '-[Objec_SubTests testExample]' passed (0.000 seconds).\nTest Case '-[Objec_SubTests testPerformanceExample]' started.\nTest Case '-[Objec_SubTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'Objec_SubTests' passed at 2018-05-17 07:07:32.410.\nTest Suite 'RaiseAnExceptionTests' started at 2018-05-17 07:07:32.411\nTest Case '-[RaiseAnExceptionTests testExample1]' started.\n/Volumes/RAID10HDD/iOS/XCUITests_Example/XCUITests_ExampleTests/RaiseAnExceptionTests.m:32: error: -[RaiseAnExceptionTests testExample1] : failed: caught \"NSRangeException\", \"*** -[__NSArrayI objectAtIndex:]: index 11 beyond bounds [0 .. 2]\"\nTest Case '-[RaiseAnExceptionTests testExample2]' started.\n/Volumes/RAID10HDD/iOS/XCUITests_Example/XCUITests_ExampleTests/RaiseAnExceptionTests.m:40: error: -[RaiseAnExceptionTests testExample2] : ((result) equal to (@\"value1\")) failed: (\"value2\") is not equal to (\"value1\")\nTest Case '-[RaiseAnExceptionTests testExample2]' failed (0.001 seconds).\nTest Case '-[RaiseAnExceptionTests testExample3]' started.\nTest Case '-[RaiseAnExceptionTests testExample1]' failed (0.015 seconds).\nTest Case '-[RaiseAnExceptionTests testExample3]' passed (0.000 seconds).\nTest Case '-[RaiseAnExceptionTests testPerformanceExample]' started.\nTest Case '-[RaiseAnExceptionTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'RaiseAnExceptionTests' failed at 2018-05-17 07:07:32.681.\nTest Suite 'Swift_SubTests' started at 2018-05-17 07:07:32.682\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample1]' started.\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample1]' failed (0.013 seconds).\n<unknown>:0: error: -[XCUITests_ExampleTests.Swift_SubTests testExample1] : failed: caught \"NSRangeException\", \"*** -[__NSArrayI objectAtIndex:]: index 10 beyond bounds [0 .. 2]\"\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample2]' started.\n/Volumes/RAID10HDD/iOS/XCUITests_Example/XCUITests_ExampleTests/SubTests/Swift_SubTests.swift:36: error: -[XCUITests_ExampleTests.Swift_SubTests testExample2] : XCTAssertEqual failed: (\"Optional(\"value2\")\") is not equal to (\"Optional(\"value1\")\") - \nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample2]' failed (0.005 seconds).\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample3]' started.\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testExample3]' passed (0.000 seconds).\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testPerformanceExample]' started.\nTest Case '-[XCUITests_ExampleTests.Swift_SubTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'Swift_SubTests' failed at 2018-05-17 07:07:32.955.\nTest Suite 'Swift_Test_Under_Score_Tests' started at 2018-05-17 07:07:32.956\nTest Case '-[XCUITests_ExampleTests.Swift_Test_Under_Score_Tests testExample]' started.\nTest Case '-[XCUITests_ExampleTests.Swift_Test_Under_Score_Tests testExample]' passed (0.001 seconds).\nTest Case '-[XCUITests_ExampleTests.Swift_Test_Under_Score_Tests testPerformanceExample]' started.\nTest Case '-[XCUITests_ExampleTests.Swift_Test_Under_Score_Tests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'Swift_Test_Under_Score_Tests' passed at 2018-05-17 07:07:33.210.\nTest Suite 'XCUITests_AnotherTests' started at 2018-05-17 07:07:33.210\nTest Case '-[XCUITests_AnotherTests testExample]' started.\nTest Case '-[XCUITests_AnotherTests testExample]' passed (0.001 seconds).\nTest Case '-[XCUITests_AnotherTests testPerformanceExample]' started.\nTest Case '-[XCUITests_AnotherTests testPerformanceExample]' passed (0.253 seconds).\nTest Suite 'XCUITests_AnotherTests' passed at 2018-05-17 07:07:33.464.\nTest Suite 'XCUITests_ExampleTests' started at 2018-05-17 07:07:33.465\nTest Case '-[XCUITests_ExampleTests testExample]' started.\nTest Case '-[XCUITests_ExampleTests testExample]' passed (0.001 seconds).\nTest Case '-[XCUITests_ExampleTests testPerformanceExample]' started.\nTest Case '-[XCUITests_ExampleTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'XCUITests_ExampleTests' passed at 2018-05-17 07:07:33.718.\nTest Suite 'XCUITests_SubTests' started at 2018-05-17 07:07:33.719\nTest Case '-[XCUITests_SubTests testExample]' started.\nTest Case '-[XCUITests_SubTests testExample]' passed (0.000 seconds).\nTest Case '-[XCUITests_SubTests testPerformanceExample]' started.\nTest Case '-[XCUITests_SubTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'XCUITests_SubTests' passed at 2018-05-17 07:07:33.972.\nTest Suite 'XCUITests_SwiftTests' started at 2018-05-17 07:07:33.973\nTest Case '-[XCUITests_ExampleTests.XCUITests_SwiftTests testExample]' started.\nTest Case '-[XCUITests_ExampleTests.XCUITests_SwiftTests testExample]' passed (0.001 seconds).\nTest Case '-[XCUITests_ExampleTests.XCUITests_SwiftTests testPerformanceExample]' started.\nTest Case '-[XCUITests_ExampleTests.XCUITests_SwiftTests testPerformanceExample]' passed (0.252 seconds).\nTest Suite 'XCUITests_SwiftTests' passed at 2018-05-17 07:07:34.227.\nTest Suite 'XCUITests-ExampleTests.xctest' failed at 2018-05-17 07:07:34.227.\nTest Suite 'All tests' failed at 2018-05-17 07:07:34.228.\nTest Suite 'All tests' started at 2018-05-17 07:07:40.691\nTest Suite 'XCUITests-ExampleUITests.xctest' started at 2018-05-17 07:07:40.692\nTest Suite 'XCUITests_ExampleUITests' started at 2018-05-17 07:07:40.693\nTest Case '-[XCUITests_ExampleUITests testExample]' started.\n    t =     0.00s Start Test at 2018-05-17 07:07:40.693\n    t =     0.07s Set Up\n    t =     0.07s     Open net.hoge2.XCUITests-Example\n    t =     0.12s         Launch net.hoge2.XCUITests-Example\n    t =     5.04s             Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.21s Tap \"Add\" Button\n    t =     6.22s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.26s     Find the \"Add\" Button\n    t =     6.26s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     6.30s         Find: Descendants matching type NavigationBar\n    t =     6.30s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     6.31s         Find: Descendants matching type Button\n    t =     6.31s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     6.41s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.46s     Synthesize event\n    t =     6.59s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.08s Tap \"Add\" Button\n    t =     7.08s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.12s     Find the \"Add\" Button\n    t =     7.13s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     7.15s         Find: Descendants matching type NavigationBar\n    t =     7.15s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     7.16s         Find: Descendants matching type Button\n    t =     7.16s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     7.26s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.31s     Synthesize event\n    t =     7.43s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.90s Tap Cell\n    t =     7.90s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.95s     Find the Cell\n    t =     7.95s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     7.98s         Find: Descendants matching type Table\n    t =     7.98s         Find: Descendants matching type Cell\n    t =     7.98s         Find: Element at index 0\n    t =     8.08s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.13s     Synthesize event\n    t =     8.26s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.79s Tap \"Master\" Button\n    t =     8.79s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.85s     Find the \"Master\" Button\n    t =     8.85s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     8.87s         Find: Descendants matching type NavigationBar\n    t =     8.87s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =     8.87s         Find: Descendants matching type Button\n    t =     8.87s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     8.98s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.03s     Synthesize event\n    t =     9.15s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.67s Tap Cell\n    t =     9.67s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.73s     Find the Cell\n    t =     9.73s         Snapshot accessibility hierarchy for app with pid 39901\n    t =     9.75s         Find: Descendants matching type Table\n    t =     9.75s         Find: Descendants matching type Cell\n    t =     9.75s         Find: Element at index 1\n    t =     9.86s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.91s     Synthesize event\n    t =    10.03s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.56s Tap \"Master\" Button\n    t =    10.56s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.62s     Find the \"Master\" Button\n    t =    10.62s         Snapshot accessibility hierarchy for app with pid 39901\n    t =    10.64s         Find: Descendants matching type NavigationBar\n    t =    10.64s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =    10.64s         Find: Descendants matching type Button\n    t =    10.64s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    10.75s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.80s     Synthesize event\n    t =    10.92s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.44s Tap \"Edit\" Button\n    t =    11.44s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.49s     Find the \"Edit\" Button\n    t =    11.50s         Snapshot accessibility hierarchy for app with pid 39901\n    t =    11.52s         Find: Descendants matching type NavigationBar\n    t =    11.52s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    11.52s         Find: Descendants matching type Button\n    t =    11.52s         Find: Elements matching predicate '\"Edit\" IN identifiers'\n    t =    11.63s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.67s     Synthesize event\n    t =    11.79s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.28s Tap \"Done\" Button\n    t =    12.28s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.33s     Find the \"Done\" Button\n    t =    12.33s         Snapshot accessibility hierarchy for app with pid 39901\n    t =    12.36s         Find: Descendants matching type NavigationBar\n    t =    12.36s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    12.36s         Find: Descendants matching type Button\n    t =    12.36s         Find: Elements matching predicate '\"Done\" IN identifiers'\n    t =    12.47s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.52s     Synthesize event\n    t =    12.64s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    13.11s Tear Down\nTest Case '-[XCUITests_ExampleUITests testExample]' passed (13.316 seconds).\nTest Suite 'XCUITests_ExampleUITests' passed at 2018-05-17 07:07:54.010.\nTest Suite 'XCUITests_ExampleUITestsFail' started at 2018-05-17 07:07:54.011\nTest Case '-[XCUITests_ExampleUITestsFail testExample]' started.\n    t =     0.00s Start Test at 2018-05-17 07:07:54.012\n    t =     0.05s Set Up\n    t =     0.15s     Open net.hoge2.XCUITests-Example\n    t =     0.19s         Launch net.hoge2.XCUITests-Example\n    t =     0.19s             Terminate net.hoge2.XCUITests-Example:39901\n    t =     5.29s             Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.45s Tap \"Add\" Button\n    t =     6.45s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.49s     Find the \"Add\" Button\n    t =     6.50s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     6.53s         Find: Descendants matching type NavigationBar\n    t =     6.54s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     6.54s         Find: Descendants matching type Button\n    t =     6.54s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     6.64s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.69s     Synthesize event\n    t =     6.82s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.30s Tap \"Add\" Button\n    t =     7.30s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.35s     Find the \"Add\" Button\n    t =     7.35s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     7.38s         Find: Descendants matching type NavigationBar\n    t =     7.38s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     7.38s         Find: Descendants matching type Button\n    t =     7.38s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     7.49s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.54s     Synthesize event\n    t =     7.66s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.13s Tap Cell\n    t =     8.13s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.18s     Find the Cell\n    t =     8.18s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     8.20s         Find: Descendants matching type Table\n    t =     8.20s         Find: Descendants matching type Cell\n    t =     8.21s         Find: Element at index 0\n    t =     8.31s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.36s     Synthesize event\n    t =     8.49s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.02s Tap \"Master\" Button\n    t =     9.02s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.08s     Find the \"Master\" Button\n    t =     9.08s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     9.10s         Find: Descendants matching type NavigationBar\n    t =     9.10s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =     9.10s         Find: Descendants matching type Button\n    t =     9.10s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     9.21s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.26s     Synthesize event\n    t =     9.38s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.90s Tap Cell\n    t =     9.90s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.95s     Find the Cell\n    t =     9.95s         Snapshot accessibility hierarchy for app with pid 39907\n    t =     9.98s         Find: Descendants matching type Table\n    t =     9.98s         Find: Descendants matching type Cell\n    t =     9.98s         Find: Element at index 1\n    t =    10.08s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.13s     Synthesize event\n    t =    10.26s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.78s Tap \"Master\" Button\n    t =    10.78s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.83s     Find the \"Master\" Button\n    t =    10.83s         Snapshot accessibility hierarchy for app with pid 39907\n    t =    10.85s         Find: Descendants matching type NavigationBar\n    t =    10.85s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =    10.85s         Find: Descendants matching type Button\n    t =    10.85s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    10.96s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.01s     Synthesize event\n    t =    11.12s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.64s Tap \"Edit\" Button\n    t =    11.64s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.69s     Find the \"Edit\" Button\n    t =    11.69s         Snapshot accessibility hierarchy for app with pid 39907\n    t =    11.71s         Find: Descendants matching type NavigationBar\n    t =    11.71s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    11.72s         Find: Descendants matching type Button\n    t =    11.72s         Find: Elements matching predicate '\"Edit\" IN identifiers'\n    t =    11.82s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.87s     Synthesize event\n    t =    11.99s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.47s Tap Cell\n    t =    12.47s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.52s     Find the Cell\n    t =    12.52s         Snapshot accessibility hierarchy for app with pid 39907\n    t =    12.54s         Find: Descendants matching type Table\n    t =    12.54s         Find: Descendants matching type Cell\n    t =    12.54s         Find: Element at index 0\n    t =    12.65s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.70s     Synthesize event\n    t =    12.82s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.87s Tap \"Delete\" Button\n    t =    12.87s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.91s     Find the \"Delete\" Button\n    t =    12.92s         Snapshot accessibility hierarchy for app with pid 39907\n    t =    12.94s         Find: Descendants matching type Table\n    t =    12.94s         Find: Descendants matching type Button\n    t =    12.94s         Find: Elements matching predicate '\"Delete\" IN identifiers'\n    t =    13.05s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    14.10s         Find the \"Delete\" Button (retry 1)\n    t =    14.10s             Snapshot accessibility hierarchy for app with pid 39907\n    t =    14.12s             Find: Descendants matching type Table\n    t =    14.13s             Find: Descendants matching type Button\n    t =    14.13s             Find: Elements matching predicate '\"Delete\" IN identifiers'\n    t =    14.23s             Wait for net.hoge2.XCUITests-Example to idle\n    t =    15.28s         Find the \"Delete\" Button (retry 2)\n    t =    15.29s             Snapshot accessibility hierarchy for app with pid 39907\n    t =    15.31s             Find: Descendants matching type Table\n    t =    15.31s             Find: Descendants matching type Button\n    t =    15.31s             Find: Elements matching predicate '\"Delete\" IN identifiers'\n    t =    15.42s             Wait for net.hoge2.XCUITests-Example to idle\n** TEST FAILED **\n    t =    15.56s Tear Down\nTest Case '-[XCUITests_ExampleUITestsFail testExample]' failed (15.769 seconds).\n    t =    15.52s         Assertion Failure: XCUITests_ExampleUITestsFail.m:57: No matches found for Find: Elements matching predicate '\"Delete\" IN identifiers' from input {(\nTest Suite 'XCUITests_ExampleUITestsFail' failed at 2018-05-17 07:08:09.782.\nTest Suite 'XCUITests_SubUITests' started at 2018-05-17 07:08:09.783\nTest Case '-[XCUITests_SubUITests testExample]' started.\n    t =     0.00s Start Test at 2018-05-17 07:08:09.784\n    t =     0.04s Set Up\n    t =     0.14s     Open net.hoge2.XCUITests-Example\n    t =     0.18s         Launch net.hoge2.XCUITests-Example\n    t =     0.18s             Terminate net.hoge2.XCUITests-Example:39907\n    t =     5.27s             Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.46s Tap \"Add\" Button\n    t =     6.46s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.51s     Find the \"Add\" Button\n    t =     6.51s         Snapshot accessibility hierarchy for app with pid 39915\n    t =     6.55s         Find: Descendants matching type NavigationBar\n    t =     6.55s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     6.55s         Find: Descendants matching type Button\n    t =     6.56s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     6.66s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     6.71s     Synthesize event\n    t =     6.85s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.33s Tap \"Add\" Button\n    t =     7.33s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.39s     Find the \"Add\" Button\n    t =     7.39s         Snapshot accessibility hierarchy for app with pid 39915\n    t =     7.42s         Find: Descendants matching type NavigationBar\n    t =     7.42s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     7.42s         Find: Descendants matching type Button\n    t =     7.42s         Find: Elements matching predicate '\"Add\" IN identifiers'\n    t =     7.53s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     7.57s     Synthesize event\n    t =     7.69s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.17s Tap Cell\n    t =     8.17s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.22s     Find the Cell\n    t =     8.22s         Snapshot accessibility hierarchy for app with pid 39915\n    t =     8.24s         Find: Descendants matching type Table\n    t =     8.24s         Find: Descendants matching type Cell\n    t =     8.24s         Find: Element at index 0\n    t =     8.35s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     8.40s     Synthesize event\n    t =     8.52s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.06s Tap \"Master\" Button\n    t =     9.06s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.12s     Find the \"Master\" Button\n    t =     9.12s         Snapshot accessibility hierarchy for app with pid 39915\n    t =     9.15s         Find: Descendants matching type NavigationBar\n    t =     9.15s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =     9.15s         Find: Descendants matching type Button\n    t =     9.15s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =     9.26s         Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.31s     Synthesize event\n    t =     9.44s     Wait for net.hoge2.XCUITests-Example to idle\n    t =     9.95s Tap Cell\n    t =     9.95s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.01s     Find the Cell\n    t =    10.01s         Snapshot accessibility hierarchy for app with pid 39915\n    t =    10.03s         Find: Descendants matching type Table\n    t =    10.04s         Find: Descendants matching type Cell\n    t =    10.04s         Find: Element at index 1\n    t =    10.14s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.20s     Synthesize event\n    t =    10.33s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.85s Tap \"Master\" Button\n    t =    10.85s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    10.90s     Find the \"Master\" Button\n    t =    10.90s         Snapshot accessibility hierarchy for app with pid 39915\n    t =    10.92s         Find: Descendants matching type NavigationBar\n    t =    10.93s         Find: Elements matching predicate '\"Detail\" IN identifiers'\n    t =    10.93s         Find: Descendants matching type Button\n    t =    10.93s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    11.04s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.09s     Synthesize event\n    t =    11.21s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.72s Tap \"Edit\" Button\n    t =    11.72s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.78s     Find the \"Edit\" Button\n    t =    11.78s         Snapshot accessibility hierarchy for app with pid 39915\n    t =    11.81s         Find: Descendants matching type NavigationBar\n    t =    11.81s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    11.81s         Find: Descendants matching type Button\n    t =    11.81s         Find: Elements matching predicate '\"Edit\" IN identifiers'\n    t =    11.91s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    11.96s     Synthesize event\n    t =    12.08s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.56s Tap \"Done\" Button\n    t =    12.56s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.62s     Find the \"Done\" Button\n    t =    12.62s         Snapshot accessibility hierarchy for app with pid 39915\n    t =    12.65s         Find: Descendants matching type NavigationBar\n    t =    12.65s         Find: Elements matching predicate '\"Master\" IN identifiers'\n    t =    12.65s         Find: Descendants matching type Button\n    t =    12.65s         Find: Elements matching predicate '\"Done\" IN identifiers'\n    t =    12.76s         Wait for net.hoge2.XCUITests-Example to idle\n    t =    12.81s     Synthesize event\n    t =    12.93s     Wait for net.hoge2.XCUITests-Example to idle\n    t =    13.41s Tear Down\nTest Case '-[XCUITests_SubUITests testExample]' passed (13.610 seconds).\nTest Suite 'XCUITests-ExampleUITests.xctest' failed at 2018-05-17 07:08:23.395.\nTest Suite 'XCUITests_SubUITests' passed at 2018-05-17 07:08:23.394.\n    t =    15.52s         Assertion Failure: XCUITests_ExampleUITestsFail.m:57: No matches found for Find: Elements matching predicate '\"Delete\" IN identifiers' from input {(\nTest Suite 'All tests' failed at 2018-05-17 07:08:23.396.\n"
  },
  {
    "path": "src/test/resources/XCTest_output_crashing_1.txt",
    "content": "=== BUILD TARGET Pods-MatrixSDK-Mantle OF PROJECT Pods WITH CONFIGURATION Debug ===\n\nCheck dependencies\n\n=== BUILD TARGET Pods-MatrixSDK-AFNetworking OF PROJECT Pods WITH CONFIGURATION Debug ===\nCheck dependencies\n\n=== BUILD TARGET Pods-MatrixSDK OF PROJECT Pods WITH CONFIGURATION Debug ===\n\nCheck dependencies\n\n=== BUILD TARGET MatrixSDK OF PROJECT MatrixSDK WITH CONFIGURATION Debug ===\n\nCheck dependencies\n\nPhaseScriptExecution Check\\ Pods\\ Manifest.lock /Users/davidjb/Library/Developer/Xcode/DerivedData/MatrixSDK-fxluueiwaovpfwffbxfypleqfrnl/Build/Intermediates/MatrixSDK.build/Debug-iphonesimulator/MatrixSDK.build/Script-977E3F228F61BF8765F90684.sh\n    cd /Users/davidjb/matrix/matrix-ios-sdk/sdk\n    /bin/sh -c /Users/davidjb/Library/Developer/Xcode/DerivedData/MatrixSDK-fxluueiwaovpfwffbxfypleqfrnl/Build/Intermediates/MatrixSDK.build/Debug-iphonesimulator/MatrixSDK.build/Script-977E3F228F61BF8765F90684.sh\n\nPhaseScriptExecution Copy\\ Pods\\ Resources /Users/davidjb/Library/Developer/Xcode/DerivedData/MatrixSDK-fxluueiwaovpfwffbxfypleqfrnl/Build/Intermediates/MatrixSDK.build/Debug-iphonesimulator/MatrixSDK.build/Script-FDD4B60A568A908CBDAC1A26.sh\n    cd /Users/davidjb/matrix/matrix-ios-sdk/sdk\n    /bin/sh -c /Users/davidjb/Library/Developer/Xcode/DerivedData/MatrixSDK-fxluueiwaovpfwffbxfypleqfrnl/Build/Intermediates/MatrixSDK.build/Debug-iphonesimulator/MatrixSDK.build/Script-FDD4B60A568A908CBDAC1A26.sh\nbuilding file list ... done\n\nsent 29 bytes  received 20 bytes  98.00 bytes/sec\ntotal size is 0  speedup is 0.00\n\n=== BUILD TARGET MatrixSDKTests OF PROJECT MatrixSDK WITH CONFIGURATION Debug ===\n\nCheck dependencies\n\nTest Suite 'All tests' started at 2014-12-15 17:55:06 +0000\nTest Suite 'MatrixSDKTests.xctest' started at 2014-12-15 17:55:06 +0000\nTest Suite 'MXErrorTests' started at 2014-12-15 17:55:06 +0000\nTest Case '-[MXErrorTests testInit]' started.\nTest Case '-[MXErrorTests testInit]' passed (0.031 seconds).\nTest Case '-[MXErrorTests testNonMatrixNSError]' started.\nTest Case '-[MXErrorTests testNonMatrixNSError]' passed (0.000 seconds).\nTest Case '-[MXErrorTests testNSError]' started.\nTest Case '-[MXErrorTests testNSError]' passed (0.000 seconds).\nTest Suite 'MXErrorTests' passed at 2014-12-15 17:55:06 +0000.\n\t Executed 3 tests, with 0 failures (0 unexpected) in 0.032 (0.033) seconds\nTest Suite 'MXEventTests' started at 2014-12-15 17:55:06 +0000\nTest Case '-[MXEventTests testIsState]' started.\n2014-12-15 17:55:06.800 xctest[2422:5067215] Request failed for path: register - HTTP code: 0\n2014-12-15 17:55:06.800 xctest[2422:5067215] *** Assertion failure in -[MatrixSDKTestsData getBobCredentials:], /Users/davidjb/matrix/matrix-ios-sdk/sdk/MatrixSDKTests/MatrixSDKTestsData.m:109\n2014-12-15 17:55:06.810 xctest[2422:5067215] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Cannot create mxBOB account'\n*** First throw call stack:\n(\n\t0   CoreFoundation                      0x00883946 __exceptionPreprocess + 182\n\t1   libobjc.A.dylib                     0x0050ca97 objc_exception_throw + 44\n\t2   CoreFoundation                      0x008837da +[NSException raise:format:arguments:] + 138\n\t3   Foundation                          0x00180810 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 118\n\t4   MatrixSDKTests                      0x0357de1c __40-[MatrixSDKTestsData getBobCredentials:]_block_invoke19 + 892\n\t5   MatrixSDK                           0x0376d974 __73-[MXRestClient registerOrLoginWithUser:user:andPassword:success:failure:]_block_invoke57 + 84\n\t6   MatrixSDK                           0x0375f51e __87-[MXHTTPClient requestWithMethod:path:parameters:data:headers:timeout:success:failure:]_block_invoke68 + 862\n\t7   MatrixSDK                           0x037798b1 __64-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]_block_invoke_3 + 97\n\t8   libdispatch.dylib                   0x019bfa2a _dispatch_call_block_and_release + 15\n\t9   libdispatch.dylib                   0x019dc03f _dispatch_client_callout + 14\n\t10  libdispatch.dylib                   0x019c5764 _dispatch_main_queue_callback_4CF + 470\n\t11  CoreFoundation                      0x007dd95e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14\n\t12  CoreFoundation                      0x0079c760 __CFRunLoopRun + 2256\n\t13  CoreFoundation                      0x0079bbcb CFRunLoopRunSpecific + 443\n\t14  CoreFoundation                      0x0079b9fb CFRunLoopRunInMode + 123\n\t15  Foundation                          0x00113d98 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 309\n\t16  XCTest                              0x20119a31 -[XCTestCase(AsynchronousTesting) waitForExpectationsWithTimeout:handler:] + 1192\n\t17  MatrixSDKTests                      0x0357e70b -[MatrixSDKTestsData doMXRestClientTestWithBob:readyToTest:] + 427\n\t18  MatrixSDKTests                      0x0357ed85 -[MatrixSDKTestsData doMXRestClientTestWithBobAndARoom:readyToTest:] + 245\n\t19  MatrixSDKTests                      0x03581e7f -[MatrixSDKTestsData doMXRestClientTestWithBobAndARoomWithMessages:readyToTest:] + 239\n\t20  MatrixSDKTests                      0x035e2c83 -[MXEventTests testIsState] + 179\n\t21  CoreFoundation                      0x0076676d __invoking___ + 29\n\t22  CoreFoundation                      0x00766618 -[NSInvocation invoke] + 360\n\t23  XCTest                              0x2010897b -[XCTestCase invokeTest] + 320\n\t24  XCTest                              0x20108bb9 -[XCTestCase performTest:] + 184\n\t25  XCTest                              0x20114162 -[XCTest run] + 314\n\t26  XCTest                              0x20107598 -[XCTestSuite performTest:] + 406\n\t27  XCTest                              0x20114162 -[XCTest run] + 314\n\t28  XCTest                              0x20107598 -[XCTestSuite performTest:] + 406\n\t29  XCTest                              0x20114162 -[XCTest run] + 314\n\t30  XCTest                              0x20107598 -[XCTestSuite performTest:] + 406\n\t31  XCTest                              0x20114162 -[XCTest run] + 314\n\t32  XCTest                              0x20103de2 __25-[XCTestDriver _runSuite]_block_invoke + 61\n\t33  XCTest                              0x20110c82 -[XCTestObservationCenter _observeTestExecutionForBlock:] + 184\n\t34  XCTest                              0x20103d06 -[XCTestDriver _runSuite] + 285\n\t35  XCTest                              0x20104951 -[XCTestDriver _checkForTestManager] + 272\n\t36  XCTest                              0x20104c6b -[XCTestDriver runTestSuite:completionHandler:] + 378\n\t37  XCTest                              0x2011775c +[XCTestProbe runTests:] + 216\n\t38  libobjc.A.dylib                     0x0052267e +[NSObject performSelector:withObject:] + 70\n\t39  xctest                              0x00046237 xctest + 4663\n\t40  xctest                              0x000464ac xctest + 5292\n\t41  xctest                              0x0004658f xctest + 5519\n\t42  xctest                              0x00045e3d xctest + 3645\n\t43  libdyld.dylib                       0x01a02ac9 start + 1\n)\nlibc++abi.dylib: terminating with uncaught exception of type NSException\n"
  },
  {
    "path": "src/test/resources/XCTest_output_failing_1.txt",
    "content": "Test Suite 'All tests' started at 2014-12-12 05:02:01 +0000\nTest Suite 'UnitTestsCardExampleTests.xctest' started at 2014-12-12 05:02:01 +0000\nTest Suite 'CardTestCase' started at 2014-12-12 05:02:01 +0000\nTest Case '-[CardTestCase testDoesNotMatchDifferentCard]' started.\nTest Case '-[CardTestCase testDoesNotMatchDifferentCard]' passed (0.000 seconds).\nTest Case '-[CardTestCase testMatchesDifferentCardWithSameContents]' started.\nTest Case '-[CardTestCase testMatchesDifferentCardWithSameContents]' passed (0.000 seconds).\nTest Case '-[CardTestCase testMatchesForAtLeastOneCard]' started.\nTest Case '-[CardTestCase testMatchesForAtLeastOneCard]' passed (0.000 seconds).\nTest Suite 'CardTestCase' passed at 2014-12-12 05:02:01 +0000.\n\t Executed 3 tests, with 0 failures (0 unexpected) in 0.001 (0.003) seconds\nTest Suite 'DeckTestCase' started at 2014-12-12 05:02:01 +0000\nTest Case '-[DeckTestCase testDeckWithMultipleCardsWillRandomlyDrawThemAll]' started.\nTest Case '-[DeckTestCase testDeckWithMultipleCardsWillRandomlyDrawThemAll]' passed (0.001 seconds).\nTest Case '-[DeckTestCase testDrawCardFromEmptyDeckAnswersNoCard]' started.\nTest Case '-[DeckTestCase testDrawCardFromEmptyDeckAnswersNoCard]' passed (0.000 seconds).\nTest Case '-[DeckTestCase testDrawnRandomCardsAreDifferent]' started.\nTest Case '-[DeckTestCase testDrawnRandomCardsAreDifferent]' passed (0.000 seconds).\nTest Case '-[DeckTestCase testOneCardDeckShouldAnswerThatCard]' started.\nTest Case '-[DeckTestCase testOneCardDeckShouldAnswerThatCard]' passed (0.000 seconds).\nTest Suite 'DeckTestCase' passed at 2014-12-12 05:02:01 +0000.\n\t Executed 4 tests, with 0 failures (0 unexpected) in 0.002 (0.013) seconds\nTest Suite 'PlayingCardDeckTestCase' started at 2014-12-12 05:02:01 +0000\nTest Case '-[PlayingCardDeckTestCase testPlayingCardDeckAnswersPlayingCards]' started.\nTest Case '-[PlayingCardDeckTestCase testPlayingCardDeckAnswersPlayingCards]' passed (0.001 seconds).\nTest Case '-[PlayingCardDeckTestCase testPlayingCardDeckHasTheCorrectInitialCards]' started.\nTest Case '-[PlayingCardDeckTestCase testPlayingCardDeckHasTheCorrectInitialCards]' passed (0.001 seconds).\nTest Suite 'PlayingCardDeckTestCase' passed at 2014-12-12 05:02:01 +0000.\n\t Executed 2 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds\nTest Suite 'PlayingCardTestCase' started at 2014-12-12 05:02:01 +0000\nTest Case '-[PlayingCardTestCase testSetSuitAnyValidAccepted]' started.\nTest Case '-[PlayingCardTestCase testSetSuitAnyValidAccepted]' passed (0.000 seconds).\nTest Case '-[PlayingCardTestCase testSetSuitInvalidRejected]' started.\nTest Case '-[PlayingCardTestCase testSetSuitInvalidRejected]' passed (0.000 seconds).\nTest Case '-[PlayingCardTestCase testTheValidSuits]' started.\n/Users/lacostej/Code/Jenkins/xcode-plugin/examples/UnitTestsCardExample/UnitTestsCardExampleTests/PlayingCardTestCase.m:34: error: -[PlayingCardTestCase testTheValidSuits] : ((howMany) equal to (3)) failed: (\"4\") is not equal to (\"3\") - Should be only 4\nTest Case '-[PlayingCardTestCase testTheValidSuits]' failed (0.001 seconds).\nTest Suite 'PlayingCardTestCase' failed at 2014-12-12 05:02:01 +0000.\n\t Executed 3 tests, with 1 failure (0 unexpected) in 0.002 (0.003) seconds\nTest Suite 'UnitTestsCardExampleTests.xctest' failed at 2014-12-12 05:02:01 +0000.\n\t Executed 12 tests, with 1 failure (0 unexpected) in 0.006 (0.024) seconds\nTest Suite 'All tests' failed at 2014-12-12 05:02:01 +0000.\n\t Executed 12 tests, with 1 failure (0 unexpected) in 0.006 (0.026) seconds\nFailing tests:\n\t-[PlayingCardTestCase testTheValidSuits]\n** TEST FAILED **\n"
  },
  {
    "path": "src/test/resources/XCTest_output_failing_2.txt",
    "content": "Test Suite 'All tests' started at 2015-01-05 18:41:39 +0000\nTest Suite 'OMPlus-DemoTests.xctest' started at 2015-01-05 18:41:39 +0000\nTest Suite 'OMCOffsetRangeClosedOpenTests' started at 2015-01-05 18:41:39 +0000\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testContainsClosedOpenShouldContainStart]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testContainsClosedOpenShouldContainStart]' passed (0.008 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testContainsClosedOpenShouldNotContainEnd]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testContainsClosedOpenShouldNotContainEnd]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testContainsClosedOpenShouldNotContainValueGreaterThanEnd]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testContainsClosedOpenShouldNotContainValueGreaterThanEnd]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testContainsClosedOpenShouldNotContainValueLesserThanStart]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testContainsClosedOpenShouldNotContainValueLesserThanStart]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldContainRange]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldContainRange]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldContainRangeEndingOnEnd]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldContainRangeEndingOnEnd]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldIntersectOtherRangeContainingEnd]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldIntersectOtherRangeContainingEnd]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldIntersectOtherRangeContainingEntireRange]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldIntersectOtherRangeContainingEntireRange]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldIntersectOtherRangeContainingStart]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldIntersectOtherRangeContainingStart]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldNotIntersectOtherRangeEndingOnStart]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldNotIntersectOtherRangeEndingOnStart]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldNotIntersectOtherRangeStartingOnEnd]' started.\nTest Case '-[OMPlus_DemoTests.OMCOffsetRangeClosedOpenTests testShouldNotIntersectOtherRangeStartingOnEnd]' passed (0.002 seconds).\nTest Suite 'OMCOffsetRangeClosedOpenTests' passed at 2015-01-05 18:41:39 +0000.\nExecuted 11 tests, with 0 failures (0 unexpected) in 0.012 (0.037) seconds\nTest Suite 'OMDPacketSpecificationTest' started at 2015-01-05 18:41:39 +0000\nTest Case '-[OMPlus_DemoTests.OMDPacketSpecificationTest testFindsMultipleIssues]' started.\nTest Case '-[OMPlus_DemoTests.OMDPacketSpecificationTest testFindsMultipleIssues]' passed (0.011 seconds).\nTest Suite 'OMDPacketSpecificationTest' passed at 2015-01-05 18:41:39 +0000.\nExecuted 1 test, with 0 failures (0 unexpected) in 0.011 (0.012) seconds\nTest Suite 'OMSAccountRegistrationTests' started at 2015-01-05 18:41:39 +0000\nTest Case '-[OMPlus_DemoTests.OMSAccountRegistrationTests testShouldRegisterAnAccount]' started.\nTest Case '-[OMPlus_DemoTests.OMSAccountRegistrationTests testShouldRegisterAnAccount]' passed (0.065 seconds).\nTest Case '-[OMPlus_DemoTests.OMSAccountRegistrationTests testShouldUpdateExistingAccount]' started.\nTest Case '-[OMPlus_DemoTests.OMSAccountRegistrationTests testShouldUpdateExistingAccount]' passed (0.012 seconds).\nTest Suite 'OMSAccountRegistrationTests' passed at 2015-01-05 18:41:39 +0000.\nExecuted 2 tests, with 0 failures (0 unexpected) in 0.077 (0.078) seconds\nTest Suite 'OMSCappedTimeSeriesTests' started at 2015-01-05 18:41:39 +0000\nTest Case '-[OMPlus_DemoTests.OMSCappedTimeSeriesTests testClearing]' started.\nTest Case '-[OMPlus_DemoTests.OMSCappedTimeSeriesTests testClearing]' passed (0.008 seconds).\nTest Suite 'OMSCappedTimeSeriesTests' passed at 2015-01-05 18:41:39 +0000.\nExecuted 1 test, with 0 failures (0 unexpected) in 0.008 (0.011) seconds\nTest Suite 'OMSCoreEventPushingQueueStrategyTests' started at 2015-01-05 18:41:39 +0000\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testRemainingCountShouldAddItemsFromTheThreeQueues]' started.\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testRemainingCountShouldAddItemsFromTheThreeQueues]' passed (1.925 seconds).\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testRemainingCountShouldCountSinceLastAcknowledgement]' started.\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testRemainingCountShouldCountSinceLastAcknowledgement]' passed (0.628 seconds).\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testShouldFetch6000BoxSyncEventsAnd1000BoxLiveEventsAnd500SdkEvents]' started.\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testShouldFetch6000BoxSyncEventsAnd1000BoxLiveEventsAnd500SdkEvents]' passed (1.245 seconds).\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testShouldFetch6000BoxSyncEventsAnd1500BoxLiveEvents]' started.\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testShouldFetch6000BoxSyncEventsAnd1500BoxLiveEvents]' passed (2.141 seconds).\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testShouldFetch7500BoxSyncEvents]' started.\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testShouldFetch7500BoxSyncEvents]' passed (2.637 seconds).\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testShouldFetchFromLastAcknowledgement]' started.\nTest Case '-[OMPlus_DemoTests.OMSCoreEventPushingQueueStrategyTests testShouldFetchFromLastAcknowledgement]' passed (0.819 seconds).\nTest Suite 'OMSCoreEventPushingQueueStrategyTests' passed at 2015-01-05 18:41:48 +0000.\nExecuted 6 tests, with 0 failures (0 unexpected) in 9.395 (9.398) seconds\nTest Suite 'OMSCredentialRegistrationTests' started at 2015-01-05 18:41:48 +0000\nTest Case '-[OMPlus_DemoTests.OMSCredentialRegistrationTests testShouldNotRegisterMultipleCredentials]' started.\nTest Case '-[OMPlus_DemoTests.OMSCredentialRegistrationTests testShouldNotRegisterMultipleCredentials]' passed (0.023 seconds).\nTest Case '-[OMPlus_DemoTests.OMSCredentialRegistrationTests testShouldRegisterCredentials]' started.\nTest Case '-[OMPlus_DemoTests.OMSCredentialRegistrationTests testShouldRegisterCredentials]' passed (0.010 seconds).\nTest Case '-[OMPlus_DemoTests.OMSCredentialRegistrationTests testShouldUpdatePassword]' started.\nTest Case '-[OMPlus_DemoTests.OMSCredentialRegistrationTests testShouldUpdatePassword]' passed (0.014 seconds).\nTest Suite 'OMSCredentialRegistrationTests' passed at 2015-01-05 18:41:49 +0000.\nExecuted 3 tests, with 0 failures (0 unexpected) in 0.047 (0.048) seconds\nTest Suite 'OMSDailyReportStoreTests' started at 2015-01-05 18:41:49 +0000\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldFindAllOrderedByDay]' started.\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldFindAllOrderedByDay]' passed (0.019 seconds).\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldRetrieveLatestLifestyleReport]' started.\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldRetrieveLatestLifestyleReport]' passed (0.024 seconds).\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldRetrieveLifestyleReportByDay]' started.\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldRetrieveLifestyleReportByDay]' passed (0.016 seconds).\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldRetrieveLifestyleReportsWithinTimeRange]' started.\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldRetrieveLifestyleReportsWithinTimeRange]' passed (0.022 seconds).\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldStoreLifestyleReport]' started.\nTest Case '-[OMPlus_DemoTests.OMSDailyReportStoreTests testShouldStoreLifestyleReport]' passed (0.016 seconds).\nTest Suite 'OMSDailyReportStoreTests' passed at 2015-01-05 18:41:49 +0000.\nExecuted 5 tests, with 0 failures (0 unexpected) in 0.097 (0.099) seconds\nTest Suite 'OMSDoublePrimitiveTests' started at 2015-01-05 18:41:49 +0000\nTest Case '-[OMPlus_DemoTests.OMSDoublePrimitiveTests testShouldRountDoubleToInt]' started.\nTest Case '-[OMPlus_DemoTests.OMSDoublePrimitiveTests testShouldRountDoubleToInt]' passed (0.001 seconds).\nTest Suite 'OMSDoublePrimitiveTests' passed at 2015-01-05 18:41:49 +0000.\nExecuted 1 test, with 0 failures (0 unexpected) in 0.001 (0.001) seconds\nTest Suite 'OMSFitnessTestFacadeTests' started at 2015-01-05 18:41:49 +0000\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testHasToFinishBeforeStarting]' started.\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testHasToFinishBeforeStarting]' passed (0.014 seconds).\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testHasToStartBeforeEnding]' started.\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testHasToStartBeforeEnding]' passed (0.014 seconds).\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testHasToStartBeforeRecovery]' started.\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testHasToStartBeforeRecovery]' passed (0.013 seconds).\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testWithoutScore]' started.\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testWithoutScore]' passed (0.012 seconds).\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testWithScore]' started.\nTest Case '-[OMPlus_DemoTests.OMSFitnessTestFacadeTests testWithScore]' passed (0.013 seconds).\nTest Suite 'OMSFitnessTestFacadeTests' passed at 2015-01-05 18:41:49 +0000.\nExecuted 5 tests, with 0 failures (0 unexpected) in 0.066 (0.068) seconds\nTest Suite 'OMSGoalsProjectorTests' started at 2015-01-05 18:41:49 +0000\nTest Case '-[OMPlus_DemoTests.OMSGoalsProjectorTests testAddTimeInHrZoneGoal]' started.\nTest Case '-[OMPlus_DemoTests.OMSGoalsProjectorTests testAddTimeInHrZoneGoal]' passed (0.015 seconds).\nTest Case '-[OMPlus_DemoTests.OMSGoalsProjectorTests testPerformanceExample]' started.\n<unknown>:0: Test Case '-[OMPlus_DemoTests.OMSGoalsProjectorTests testPerformanceExample]' measured [Time, seconds] average: 0.000, relative standard deviation: 114.408%, values: [0.000005, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: \"\", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100\nTest Case '-[OMPlus_DemoTests.OMSGoalsProjectorTests testPerformanceExample]' passed (0.275 seconds).\nTest Case '-[OMPlus_DemoTests.OMSGoalsProjectorTests testRemoveTimeInHrZoneGoal]' started.\nTest Case '-[OMPlus_DemoTests.OMSGoalsProjectorTests testRemoveTimeInHrZoneGoal]' passed (0.012 seconds).\nTest Case '-[OMPlus_DemoTests.OMSGoalsProjectorTests testUpdateTimeInHrZoneGoal]' started.\nTest Case '-[OMPlus_DemoTests.OMSGoalsProjectorTests testUpdateTimeInHrZoneGoal]' passed (0.013 seconds).\nTest Suite 'OMSGoalsProjectorTests' passed at 2015-01-05 18:41:49 +0000.\nExecuted 4 tests, with 0 failures (0 unexpected) in 0.316 (0.318) seconds\nTest Suite 'OMSHeightUnitsConverterTests' started at 2015-01-05 18:41:49 +0000\nTest Case '-[OMPlus_DemoTests.OMSHeightUnitsConverterTests testShouldMapToInternationalMetric]' started.\nTest Case '-[OMPlus_DemoTests.OMSHeightUnitsConverterTests testShouldMapToInternationalMetric]' passed (0.000 seconds).\nTest Suite 'OMSHeightUnitsConverterTests' passed at 2015-01-05 18:41:49 +0000.\nExecuted 1 test, with 0 failures (0 unexpected) in 0.000 (0.001) seconds\nTest Suite 'OMSKafkaConsumersTests' started at 2015-01-05 18:41:49 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testFivePersistentElementsShouldBeLeftToConsumeWhenConsumingPersistentMessages]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testFivePersistentElementsShouldBeLeftToConsumeWhenConsumingPersistentMessages]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testFivePersistentElementsShouldBeLeftToConsumeWhenConsumingTransientMessages]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testFivePersistentElementsShouldBeLeftToConsumeWhenConsumingTransientMessages]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testFiveTransientElementsShouldBeLeftToConsumeWhenConsumingTransientMessages]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testFiveTransientElementsShouldBeLeftToConsumeWhenConsumingTransientMessages]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testNoTransientElementsShouldBeLeftToConsumeWhenConsumingPersistentMessagesOnly]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testNoTransientElementsShouldBeLeftToConsumeWhenConsumingPersistentMessagesOnly]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testSixPersistentElementsShouldBeLeftToConsumeWhenConsumingTransientMessagesUsingNilClientOffset]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testSixPersistentElementsShouldBeLeftToConsumeWhenConsumingTransientMessagesUsingNilClientOffset]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testSixTransientElementsShouldBeLeftToConsumeWhenConsumingTransientMessagesUsingNilClientOffset]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testSixTransientElementsShouldBeLeftToConsumeWhenConsumingTransientMessagesUsingNilClientOffset]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testZeroElementsShouldBeLeftToConsumeWhenTopicOffsetIsNil]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testZeroElementsShouldBeLeftToConsumeWhenTopicOffsetIsNil]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testZeroElementsShouldBeLeftToConsumeWhenTopicPersistentOffsetIsNil]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaConsumersTests testZeroElementsShouldBeLeftToConsumeWhenTopicPersistentOffsetIsNil]' passed (0.000 seconds).\nTest Suite 'OMSKafkaConsumersTests' passed at 2015-01-05 18:41:49 +0000.\nExecuted 8 tests, with 0 failures (0 unexpected) in 0.002 (0.008) seconds\nTest Suite 'OMSKafkaEventuallyPersistentQueueTests' started at 2015-01-05 18:41:49 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testEmptyQueueShouldNotHaveAnyNewestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testEmptyQueueShouldNotHaveAnyNewestMessage]' passed (0.043 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testEmptyQueueShouldNotHaveAnyNewestPersistedMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testEmptyQueueShouldNotHaveAnyNewestPersistedMessage]' passed (0.018 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testEmptyQueueShouldNotHaveAnyOldestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testEmptyQueueShouldNotHaveAnyOldestMessage]' passed (0.019 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldFetchAndMergeResultsFromPersistentAndTransientQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldFetchAndMergeResultsFromPersistentAndTransientQueue]' passed (0.025 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldFetchFromTransientQueueFromOffset0WithoutAnyMessageAlreadyPersisted]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldFetchFromTransientQueueFromOffset0WithoutAnyMessageAlreadyPersisted]' passed (0.016 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldFetchFromTransientQueueFromOffset1WithoutAnyMessageAlreadyPersisted]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldFetchFromTransientQueueFromOffset1WithoutAnyMessageAlreadyPersisted]' passed (0.017 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldFlushTransientQueueWhenRequested]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldFlushTransientQueueWhenRequested]' passed (0.018 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldNotFetchDeletedItemsFromTransientAndPersistentQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldNotFetchDeletedItemsFromTransientAndPersistentQueue]' passed (0.022 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldReturnNewestMessageFromTransientQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldReturnNewestMessageFromTransientQueue]' passed (0.020 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldReturnNewestPersistedMessageFromTransientQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldReturnNewestPersistedMessageFromTransientQueue]' passed (0.020 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldReturnOldestMessageFromPersistentTransientQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldReturnOldestMessageFromPersistentTransientQueue]' passed (0.021 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldReturnOldestMessageFromTransientQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShouldReturnOldestMessageFromTransientQueue]' passed (0.019 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShoulOnlyPersistOnThirdMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaEventuallyPersistentQueueTests testShoulOnlyPersistOnThirdMessage]' passed (0.019 seconds).\nTest Suite 'OMSKafkaEventuallyPersistentQueueTests' passed at 2015-01-05 18:41:49 +0000.\nExecuted 13 tests, with 0 failures (0 unexpected) in 0.276 (0.282) seconds\nTest Suite 'OMSKafkaGarbageCollectorTests' started at 2015-01-05 18:41:49 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaGarbageCollectorTests testGCDoesntDeleteWhenNotConsumed]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaGarbageCollectorTests testGCDoesntDeleteWhenNotConsumed]' passed (0.026 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaGarbageCollectorTests testGCHandleNilOffsetSoItAvoidDeletingUnconsumedElements]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaGarbageCollectorTests testGCHandleNilOffsetSoItAvoidDeletingUnconsumedElements]' passed (0.024 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaGarbageCollectorTests testGCKeepsOnlyOneElementInTheQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaGarbageCollectorTests testGCKeepsOnlyOneElementInTheQueue]' passed (0.026 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaGarbageCollectorTests testGCWaitsForSlowestConsumer]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaGarbageCollectorTests testGCWaitsForSlowestConsumer]' passed (0.026 seconds).\nTest Suite 'OMSKafkaGarbageCollectorTests' passed at 2015-01-05 18:41:49 +0000.\nExecuted 4 tests, with 0 failures (0 unexpected) in 0.102 (0.112) seconds\nTest Suite 'OMSKafkaMessageIndexTests' started at 2015-01-05 18:41:49 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testEmptyIndexShouldNotReturnAnyLogicalOffsetRange]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testEmptyIndexShouldNotReturnAnyLogicalOffsetRange]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testEmptyIndexShouldNotReturnAnyLogicalOffsetRangeAssociatedWithPhysicalRange]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testEmptyIndexShouldNotReturnAnyLogicalOffsetRangeAssociatedWithPhysicalRange]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testEmptyIndexShouldNotReturnAnyPhysicalOffset]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testEmptyIndexShouldNotReturnAnyPhysicalOffset]' passed (0.021 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testIndexShouldNotReturnAnyLogicalOffsetRangeAssociatedWithNonExistingPhysicalRange]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testIndexShouldNotReturnAnyLogicalOffsetRangeAssociatedWithNonExistingPhysicalRange]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testIndexShouldReturnLogicalOffsetRangeAssociatedWithExistingPhysicalRange]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testIndexShouldReturnLogicalOffsetRangeAssociatedWithExistingPhysicalRange]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testIndexWithOneRangeShouldReturnIt]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testIndexWithOneRangeShouldReturnIt]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testIndexWithSeveralRangesShouldMergeThem]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testIndexWithSeveralRangesShouldMergeThem]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testPruneShouldHaveClosedOpenSemantics]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testPruneShouldHaveClosedOpenSemantics]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldNotReturnAnyPhysicalOffsetContainingLogicalOffsetOutsideOfInterval]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldNotReturnAnyPhysicalOffsetContainingLogicalOffsetOutsideOfInterval]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldNotReturnPysicalOffsetRangeWhenNoIntersectionBetweenIndexAndQuery]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldNotReturnPysicalOffsetRangeWhenNoIntersectionBetweenIndexAndQuery]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldPruneOldMappingsAndKeepNewOnes]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldPruneOldMappingsAndKeepNewOnes]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldRestoreEmptyState]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldRestoreEmptyState]' passed (0.003 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldRestoreState]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldRestoreState]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnNilPhysicalOffsetRange]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnNilPhysicalOffsetRange]' passed (0.007 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPhysicalOffsetContainingLogicalOffset]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPhysicalOffsetContainingLogicalOffset]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPhysicalOffsetRangeOf1Element]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPhysicalOffsetRangeOf1Element]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPhysicalOffsetRangeOf3Elements]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPhysicalOffsetRangeOf3Elements]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPysicalOffsetRangeAssociatedWithLogicalOffsetFullyContainedInIndex]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPysicalOffsetRangeAssociatedWithLogicalOffsetFullyContainedInIndex]' passed (0.015 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPysicalOffsetRangeAssociatedWithLogicalOffsetIntersectingEnd]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPysicalOffsetRangeAssociatedWithLogicalOffsetIntersectingEnd]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPysicalOffsetRangeAssociatedWithLogicalOffsetIntersectingStart]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPysicalOffsetRangeAssociatedWithLogicalOffsetIntersectingStart]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPysicalOffsetRangeWhenThereAreGaps]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaMessageIndexTests testShouldReturnPysicalOffsetRangeWhenThereAreGaps]' passed (0.000 seconds).\nTest Suite 'OMSKafkaMessageIndexTests' passed at 2015-01-05 18:41:50 +0000.\nExecuted 21 tests, with 0 failures (0 unexpected) in 0.051 (0.107) seconds\nTest Suite 'OMSKafkaPersistentQueueTests' started at 2015-01-05 18:41:50 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testCreatedMessageIndexShouldBeDirty]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testCreatedMessageIndexShouldBeDirty]' passed (0.025 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testCreatedMessageIndexShouldNotBeDirty]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testCreatedMessageIndexShouldNotBeDirty]' passed (0.021 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testEmptyQueueShouldNotReturnNewestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testEmptyQueueShouldNotReturnNewestMessage]' passed (0.016 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testEmptyQueueShouldNotReturnOldestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testEmptyQueueShouldNotReturnOldestMessage]' passed (0.016 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testNonEmptyQueueShouldReturnNewestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testNonEmptyQueueShouldReturnNewestMessage]' passed (0.020 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testNonEmptyQueueShouldReturnOldestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testNonEmptyQueueShouldReturnOldestMessage]' passed (0.020 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testPersistingEmptyArrayShouldNotChangeTheCount]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testPersistingEmptyArrayShouldNotChangeTheCount]' passed (0.017 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testPersistingEmptyArrayShouldNotLeadToWeirdErrors]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testPersistingEmptyArrayShouldNotLeadToWeirdErrors]' passed (0.017 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldCreateIndex]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldCreateIndex]' passed (0.024 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldDeleteMessagesUntilGivenOffsetAtBeginningOfNextBucket]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldDeleteMessagesUntilGivenOffsetAtBeginningOfNextBucket]' passed (0.026 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldDeleteMessagesUntilGivenOffsetInTheMiddleOfBucket]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldDeleteMessagesUntilGivenOffsetInTheMiddleOfBucket]' passed (0.028 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchAllElementsFromGivenBucket]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchAllElementsFromGivenBucket]' passed (0.022 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchElementsSpanningThreeBuckets]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchElementsSpanningThreeBuckets]' passed (0.030 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchElementsSpanningTwoBuckets]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchElementsSpanningTwoBuckets]' passed (0.022 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchMaxWithHoles]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchMaxWithHoles]' passed (0.021 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchSomeElementsOfGivenBucket]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldFetchSomeElementsOfGivenBucket]' passed (0.020 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldHandleHolesInBuckets]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldHandleHolesInBuckets]' passed (0.026 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldNotDoAnythingStupidWhenDeletingFromEmptyQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldNotDoAnythingStupidWhenDeletingFromEmptyQueue]' passed (0.014 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldNotFetchAnyElementNotExisting]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldNotFetchAnyElementNotExisting]' passed (0.022 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldNotReadMessageIndexUnknownQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldNotReadMessageIndexUnknownQueue]' passed (0.018 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldOnlyRetrieveExistingElementsEventIfMaxAsksForMore]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldOnlyRetrieveExistingElementsEventIfMaxAsksForMore]' passed (0.021 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldPersistAndRetrieveBucketOfOnlyOneElement]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldPersistAndRetrieveBucketOfOnlyOneElement]' passed (0.020 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldReadPersistedMessageIndex]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldReadPersistedMessageIndex]' passed (0.019 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldReturnCountOfMessages]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaPersistentQueueTests testShouldReturnCountOfMessages]' passed (0.020 seconds).\nTest Suite 'OMSKafkaPersistentQueueTests' passed at 2015-01-05 18:41:50 +0000.\nExecuted 24 tests, with 0 failures (0 unexpected) in 0.505 (0.515) seconds\nTest Suite 'OMSKafkaRACClientTests' started at 2015-01-05 18:41:50 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACClientTests testPeekOutOfOrder]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACClientTests testPeekOutOfOrder]' passed (0.035 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACClientTests testShouldPeekSpecificRange]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACClientTests testShouldPeekSpecificRange]' passed (0.028 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACClientTests testStreamsPacketsUntilTheEnd]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACClientTests testStreamsPacketsUntilTheEnd]' passed (6.405 seconds).\nTest Suite 'OMSKafkaRACClientTests' passed at 2015-01-05 18:41:57 +0000.\nExecuted 3 tests, with 0 failures (0 unexpected) in 6.467 (6.469) seconds\nTest Suite 'OMSKafkaRACConsumerTests' started at 2015-01-05 18:41:57 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testPeekedElementsThatAreNotAcknowledgedShouldCountAsRemaining]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testPeekedElementsThatAreNotAcknowledgedShouldCountAsRemaining]' passed (0.034 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldBeBehind]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldBeBehind]' passed (0.029 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldConsumeOnlyElementOfQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldConsumeOnlyElementOfQueue]' passed (0.031 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldConsumeOnlyTwoElementsOutOfThree]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldConsumeOnlyTwoElementsOutOfThree]' passed (0.027 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldFetchFromPreviousAcknowledgement]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldFetchFromPreviousAcknowledgement]' passed (0.027 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldGetRemainingCountWhenNothingHasBeenAcknowledged]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldGetRemainingCountWhenNothingHasBeenAcknowledged]' passed (0.028 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldGetRemainingCountWhenSomeElementsHaveBeenAcknowledged]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldGetRemainingCountWhenSomeElementsHaveBeenAcknowledged]' passed (0.029 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldNotFetchAnyDataFromEmptyQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldNotFetchAnyDataFromEmptyQueue]' passed (0.028 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldPersistOffset]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldPersistOffset]' passed (0.029 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldSignalWhenQueueSizeIncreases]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testShouldSignalWhenQueueSizeIncreases]' passed (0.029 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testSignalsWhenMessagesAreConsumed]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testSignalsWhenMessagesAreConsumed]' passed (0.030 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testUpdatesZookeeper]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaRACConsumerTests testUpdatesZookeeper]' passed (0.027 seconds).\nTest Suite 'OMSKafkaRACConsumerTests' passed at 2015-01-05 18:41:57 +0000.\nExecuted 12 tests, with 0 failures (0 unexpected) in 0.348 (0.353) seconds\nTest Suite 'OMSKafkaSynchronousConsumerTests' started at 2015-01-05 18:41:57 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaSynchronousConsumerTests test]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaSynchronousConsumerTests test]' passed (0.030 seconds).\nTest Suite 'OMSKafkaSynchronousConsumerTests' passed at 2015-01-05 18:41:57 +0000.\nExecuted 1 test, with 0 failures (0 unexpected) in 0.030 (0.030) seconds\nTest Suite 'OMSKafkaTopicTests' started at 2015-01-05 18:41:57 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testEmptyQueueShouldNotReturnAnyNewestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testEmptyQueueShouldNotReturnAnyNewestMessage]' passed (0.029 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testEmptyQueueShouldNotReturnAnyOldestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testEmptyQueueShouldNotReturnAnyOldestMessage]' passed (0.030 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueuesShouldNotMixUp]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueuesShouldNotMixUp]' passed (0.031 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueueWithOneElementShouldReturnItAsNewestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueueWithOneElementShouldReturnItAsNewestMessage]' passed (0.027 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueueWithOneElementShouldReturnItAsOldestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueueWithOneElementShouldReturnItAsOldestMessage]' passed (0.028 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueueWithTwoElementsShouldReturnNewestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueueWithTwoElementsShouldReturnNewestMessage]' passed (0.031 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueueWithTwoMessagesShouldReturnOldestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testQueueWithTwoMessagesShouldReturnOldestMessage]' passed (0.033 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldFetchFromGivenOffset]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldFetchFromGivenOffset]' passed (0.026 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldIncrementsOffsets]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldIncrementsOffsets]' passed (0.029 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldNotFetchAnyDataFromEmptyQueue]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldNotFetchAnyDataFromEmptyQueue]' passed (0.030 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldNotFetchAnyDataWhenMaxResultsIsZero]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldNotFetchAnyDataWhenMaxResultsIsZero]' passed (0.028 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldNotFetchDeletedOffsets]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldNotFetchDeletedOffsets]' passed (0.028 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldUpdateZookeeper]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTopicTests testShouldUpdateZookeeper]' passed (0.025 seconds).\nTest Suite 'OMSKafkaTopicTests' passed at 2015-01-05 18:41:57 +0000.\nExecuted 13 tests, with 0 failures (0 unexpected) in 0.375 (0.380) seconds\nTest Suite 'OMSKafkaTransientQueueTests' started at 2015-01-05 18:41:57 +0000\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testDeletingFromEmptyQueueShouldNotDoAnything]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testDeletingFromEmptyQueueShouldNotDoAnything]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testFilteringEmptyBufferShouldReturnEmptyArray]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testFilteringEmptyBufferShouldReturnEmptyArray]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldBeOverCapacity]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldBeOverCapacity]' passed (0.032 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldCountFiveMessages]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldCountFiveMessages]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldCountZeroMessages]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldCountZeroMessages]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldDeleteAllElements]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldDeleteAllElements]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldFetchAllMessages]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldFetchAllMessages]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldFetchSomeMessagesFromOffset0]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldFetchSomeMessagesFromOffset0]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldFetchSomeMessagesFromOffset2]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldFetchSomeMessagesFromOffset2]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldFilterBufferShouldOnlyKeepRequestedElements]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldFilterBufferShouldOnlyKeepRequestedElements]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldHaveMessagesBeforeOrEqual4]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldHaveMessagesBeforeOrEqual4]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldHaveMessagesBeforeOrEqual5]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldHaveMessagesBeforeOrEqual5]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldHaveMessagesBeforeOrEqual7]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldHaveMessagesBeforeOrEqual7]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldHaveMessagesBeforeOrEqual9]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldHaveMessagesBeforeOrEqual9]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldKeepLastElement]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldKeepLastElement]' passed (0.033 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldNotBeOverCapacity]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldNotBeOverCapacity]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldNotFetchAnyMessageFromEmptyStore]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldNotFetchAnyMessageFromEmptyStore]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldNotReturnNeestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldNotReturnNeestMessage]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldNotReturnOldestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldNotReturnOldestMessage]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldReturnNewestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldReturnNewestMessage]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldReturnOldestMessage]' started.\nTest Case '-[OMPlus_DemoTests.OMSKafkaTransientQueueTests testShouldReturnOldestMessage]' passed (0.000 seconds).\nTest Suite 'OMSKafkaTransientQueueTests' passed at 2015-01-05 18:41:57 +0000.\nExecuted 21 tests, with 0 failures (0 unexpected) in 0.074 (0.099) seconds\nTest Suite 'OMSNSUUIDTests' started at 2015-01-05 18:41:57 +0000\nTest Case '-[OMPlus_DemoTests.OMSNSUUIDTests testEquality]' started.\nTest Case '-[OMPlus_DemoTests.OMSNSUUIDTests testEquality]' passed (0.000 seconds).\nTest Suite 'OMSNSUUIDTests' passed at 2015-01-05 18:41:57 +0000.\nExecuted 1 test, with 0 failures (0 unexpected) in 0.000 (0.001) seconds\nTest Suite 'OMSSpecificationIssueStoreTests' started at 2015-01-05 18:41:57 +0000\nTest Case '-[OMPlus_DemoTests.OMSSpecificationIssueStoreTests testShouldCreateIssue]' started.\nTest Case '-[OMPlus_DemoTests.OMSSpecificationIssueStoreTests testShouldCreateIssue]' passed (0.020 seconds).\nTest Suite 'OMSSpecificationIssueStoreTests' passed at 2015-01-05 18:41:57 +0000.\nExecuted 1 test, with 0 failures (0 unexpected) in 0.020 (0.021) seconds\nTest Suite 'OMSTimeInHrZoneGoalAlerterTests' started at 2015-01-05 18:41:57 +0000\nTest Case '-[OMPlus_DemoTests.OMSTimeInHrZoneGoalAlerterTests testAnotherZoneAchieved]' started.\nTest Case '-[OMPlus_DemoTests.OMSTimeInHrZoneGoalAlerterTests testAnotherZoneAchieved]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSTimeInHrZoneGoalAlerterTests testZoneAchieved]' started.\nTest Case '-[OMPlus_DemoTests.OMSTimeInHrZoneGoalAlerterTests testZoneAchieved]' passed (0.001 seconds).\nTest Case '-[OMPlus_DemoTests.OMSTimeInHrZoneGoalAlerterTests testZoneEntered]' started.\nTest Case '-[OMPlus_DemoTests.OMSTimeInHrZoneGoalAlerterTests testZoneEntered]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSTimeInHrZoneGoalAlerterTests testZoneLeft]' started.\nTest Case '-[OMPlus_DemoTests.OMSTimeInHrZoneGoalAlerterTests testZoneLeft]' passed (0.001 seconds).\nTest Suite 'OMSTimeInHrZoneGoalAlerterTests' passed at 2015-01-05 18:41:57 +0000.\nExecuted 4 tests, with 0 failures (0 unexpected) in 0.002 (0.040) seconds\nTest Suite 'OMSURIParserTests' started at 2015-01-05 18:41:57 +0000\nTest Case '-[OMPlus_DemoTests.OMSURIParserTests testShouldParseNoParameter]' started.\nTest Case '-[OMPlus_DemoTests.OMSURIParserTests testShouldParseNoParameter]' passed (0.000 seconds).\nTest Case '-[OMPlus_DemoTests.OMSURIParserTests testShouldParseOneParameter]' started.\nTest Case '-[OMPlus_DemoTests.OMSURIParserTests testShouldParseOneParameter]' passed (0.007 seconds).\nTest Case '-[OMPlus_DemoTests.OMSURIParserTests testShouldParseTwoParameters]' started.\nTest Case '-[OMPlus_DemoTests.OMSURIParserTests testShouldParseTwoParameters]' passed (0.039 seconds).\nTest Suite 'OMSURIParserTests' passed at 2015-01-05 18:41:57 +0000.\nExecuted 3 tests, with 0 failures (0 unexpected) in 0.046 (0.048) seconds\nTest Suite 'OMSUserTraitsRegistrationTests' started at 2015-01-05 18:41:57 +0000\nTest Case '-[OMPlus_DemoTests.OMSUserTraitsRegistrationTests testShouldChangedUserTraitsHeight]' started.\nTest Case '-[OMPlus_DemoTests.OMSUserTraitsRegistrationTests testShouldChangedUserTraitsHeight]' passed (0.016 seconds).\nTest Case '-[OMPlus_DemoTests.OMSUserTraitsRegistrationTests testShouldCorrectUserTraitsHeight]' started.\nTest Case '-[OMPlus_DemoTests.OMSUserTraitsRegistrationTests testShouldCorrectUserTraitsHeight]' passed (0.015 seconds).\nTest Case '-[OMPlus_DemoTests.OMSUserTraitsRegistrationTests testShouldRegisterUserTraits]' started.\nTest Case '-[OMPlus_DemoTests.OMSUserTraitsRegistrationTests testShouldRegisterUserTraits]' passed (0.016 seconds).\nTest Suite 'OMSUserTraitsRegistrationTests' passed at 2015-01-05 18:41:58 +0000.\nExecuted 3 tests, with 0 failures (0 unexpected) in 0.048 (0.049) seconds\nTest Suite 'OMSWeightUnitsConverterTests' started at 2015-01-05 18:41:58 +0000\nTest Case '-[OMPlus_DemoTests.OMSWeightUnitsConverterTests testShouldMapToInternationalMetric]' started.\nTest Case '-[OMPlus_DemoTests.OMSWeightUnitsConverterTests testShouldMapToInternationalMetric]' passed (0.000 seconds).\nTest Suite 'OMSWeightUnitsConverterTests' passed at 2015-01-05 18:41:58 +0000.\nExecuted 1 test, with 0 failures (0 unexpected) in 0.000 (0.001) seconds\nTest Suite 'OMSWorkoutGeneratorTests' started at 2015-01-05 18:41:58 +0000\nTest Case '-[OMPlus_DemoTests.OMSWorkoutGeneratorTests testPacketsGoingBackInTime]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutGeneratorTests testPacketsGoingBackInTime]' passed (0.017 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutGeneratorTests testWorkoutWithoutPackets]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutGeneratorTests testWorkoutWithoutPackets]' passed (0.001 seconds).\nTest Suite 'OMSWorkoutGeneratorTests' passed at 2015-01-05 18:41:58 +0000.\nExecuted 2 tests, with 0 failures (0 unexpected) in 0.018 (0.019) seconds\nTest Suite 'OMSWorkoutReportProjectorTests' started at 2015-01-05 18:41:58 +0000\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testGeneratesLiveReport]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testGeneratesLiveReport]' passed (0.102 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testMarksForGCWhenIdle]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testMarksForGCWhenIdle]' passed (0.041 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testPastReportsAreGenerated]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testPastReportsAreGenerated]' passed (0.532 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testTwoLiveReportsGenerated]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testTwoLiveReportsGenerated]' passed (0.038 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testUpdatesAggregateWorkoutStats]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testUpdatesAggregateWorkoutStats]' passed (0.143 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testZeroesDontContributeToAggregates]' started.\n/Users/clement/Desktop/Repos/omplus-sdk/OMPlus-SDK/OMPlus-Demo-Tests/OMSWorkoutReportProjectorTests.swift:256: error: -[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testZeroesDontContributeToAggregates] : XCTAssertEqual failed: (\"18\") is not equal to (\"15\") - peak HR from second workout\nTest Case '-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testZeroesDontContributeToAggregates]' failed (0.098 seconds).\nTest Suite 'OMSWorkoutReportProjectorTests' failed at 2015-01-05 18:41:59 +0000.\nExecuted 6 tests, with 1 failure (0 unexpected) in 0.954 (0.956) seconds\nTest Suite 'OMSWorkoutStoreTests' started at 2015-01-05 18:41:59 +0000\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testRetrieveWorkoutReportViewModelWithBestScore]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testRetrieveWorkoutReportViewModelWithBestScore]' passed (0.018 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testSavesAggregateWorkoutStats]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testSavesAggregateWorkoutStats]' passed (0.024 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldAssignReportToWorkout]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldAssignReportToWorkout]' passed (0.021 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldBeIdempotentWhenAssigningReportToWorkout]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldBeIdempotentWhenAssigningReportToWorkout]' passed (0.014 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldBeIdempotentWhenProcessingWorkoutEndTaggedEvent]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldBeIdempotentWhenProcessingWorkoutEndTaggedEvent]' passed (0.011 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldBeIdempotentWhenProcessingWorkoutStartTaggedEvent]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldBeIdempotentWhenProcessingWorkoutStartTaggedEvent]' passed (0.019 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldCreateWorkout]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldCreateWorkout]' passed (0.011 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetAllWorkouts]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetAllWorkouts]' passed (0.012 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetCompletedWorkouts]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetCompletedWorkouts]' passed (0.014 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetCompletedWorkoutsWithoutReports]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetCompletedWorkoutsWithoutReports]' passed (0.017 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetCurrentWorkout]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetCurrentWorkout]' passed (0.014 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetIncompleteWorkouts]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldGetIncompleteWorkouts]' passed (0.014 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldNotGetCurrentWorkout]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldNotGetCurrentWorkout]' passed (0.013 seconds).\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldRetrieveWorkoutsWithinTimeRange]' started.\nTest Case '-[OMPlus_DemoTests.OMSWorkoutStoreTests testShouldRetrieveWorkoutsWithinTimeRange]' passed (0.017 seconds).\nTest Suite 'OMSWorkoutStoreTests' passed at 2015-01-05 18:41:59 +0000.\nExecuted 14 tests, with 0 failures (0 unexpected) in 0.218 (0.224) seconds\nTest Suite 'OMSZookeeperTests' started at 2015-01-05 18:41:59 +0000\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testFlushesToDisk]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testFlushesToDisk]' passed (0.007 seconds).\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testInitialOffsetConsumedShouldBeNil]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testInitialOffsetConsumedShouldBeNil]' passed (0.003 seconds).\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testInitialPersistentOffsetShouldBeNil]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testInitialPersistentOffsetShouldBeNil]' passed (0.004 seconds).\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testInitialTransientOffsetShouldBeNil]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testInitialTransientOffsetShouldBeNil]' passed (0.004 seconds).\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldNotifyOfLastOffsetConsumedUpdate]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldNotifyOfLastOffsetConsumedUpdate]' passed (0.005 seconds).\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldNotifyOfLastPersistentOffsetUpdate]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldNotifyOfLastPersistentOffsetUpdate]' passed (0.005 seconds).\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldNotifyOfLastTransientOffsetUpdate]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldNotifyOfLastTransientOffsetUpdate]' passed (0.004 seconds).\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldUpdateLastConsumerOffset]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldUpdateLastConsumerOffset]' passed (0.004 seconds).\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldUpdateLastPersistentOffset]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldUpdateLastPersistentOffset]' passed (0.003 seconds).\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldUpdateLastTransientOffset]' started.\nTest Case '-[OMPlus_DemoTests.OMSZookeeperTests testShouldUpdateLastTransientOffset]' passed (0.003 seconds).\nTest Suite 'OMSZookeeperTests' passed at 2015-01-05 18:41:59 +0000.\nExecuted 10 tests, with 0 failures (0 unexpected) in 0.042 (0.093) seconds\nTest Suite 'OMPlus-DemoTests.xctest' failed at 2015-01-05 18:41:59 +0000.\nExecuted 205 tests, with 1 failure (0 unexpected) in 19.611 (19.948) seconds\nTest Suite 'All tests' failed at 2015-01-05 18:41:59 +0000.\nExecuted 205 tests, with 1 failure (0 unexpected) in 19.611 (19.949) seconds\nFailing tests:\n\t-[OMPlus_DemoTests.OMSWorkoutReportProjectorTests testZeroesDontContributeToAggregates]\n** TEST FAILED **\n"
  },
  {
    "path": "src/test/resources/XCTest_output_passing_1.txt",
    "content": "Test Suite 'All tests' started at 2014-12-12 04:48:53 +0000\nTest Suite 'UnitTestsCardExampleTests.xctest' started at 2014-12-12 04:48:53 +0000\nTest Suite 'CardTestCase' started at 2014-12-12 04:48:53 +0000\nTest Case '-[CardTestCase testDoesNotMatchDifferentCard]' started.\nTest Case '-[CardTestCase testDoesNotMatchDifferentCard]' passed (0.000 seconds).\nTest Case '-[CardTestCase testMatchesDifferentCardWithSameContents]' started.\nTest Case '-[CardTestCase testMatchesDifferentCardWithSameContents]' passed (0.000 seconds).\nTest Case '-[CardTestCase testMatchesForAtLeastOneCard]' started.\nTest Case '-[CardTestCase testMatchesForAtLeastOneCard]' passed (0.000 seconds).\nTest Suite 'CardTestCase' passed at 2014-12-12 04:48:53 +0000.\n\t Executed 3 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds\nTest Suite 'DeckTestCase' started at 2014-12-12 04:48:53 +0000\nTest Case '-[DeckTestCase testDeckWithMultipleCardsWillRandomlyDrawThemAll]' started.\nTest Case '-[DeckTestCase testDeckWithMultipleCardsWillRandomlyDrawThemAll]' passed (0.001 seconds).\nTest Case '-[DeckTestCase testDrawCardFromEmptyDeckAnswersNoCard]' started.\nTest Case '-[DeckTestCase testDrawCardFromEmptyDeckAnswersNoCard]' passed (0.000 seconds).\nTest Case '-[DeckTestCase testDrawnRandomCardsAreDifferent]' started.\nTest Case '-[DeckTestCase testDrawnRandomCardsAreDifferent]' passed (0.000 seconds).\nTest Case '-[DeckTestCase testOneCardDeckShouldAnswerThatCard]' started.\nTest Case '-[DeckTestCase testOneCardDeckShouldAnswerThatCard]' passed (0.000 seconds).\nTest Suite 'DeckTestCase' passed at 2014-12-12 04:48:53 +0000.\n\t Executed 4 tests, with 0 failures (0 unexpected) in 0.001 (0.003) seconds\nTest Suite 'PlayingCardDeckTestCase' started at 2014-12-12 04:48:53 +0000\nTest Case '-[PlayingCardDeckTestCase testPlayingCardDeckAnswersPlayingCards]' started.\nTest Case '-[PlayingCardDeckTestCase testPlayingCardDeckAnswersPlayingCards]' passed (0.001 seconds).\nTest Case '-[PlayingCardDeckTestCase testPlayingCardDeckHasTheCorrectInitialCards]' started.\nTest Case '-[PlayingCardDeckTestCase testPlayingCardDeckHasTheCorrectInitialCards]' passed (0.001 seconds).\nTest Suite 'PlayingCardDeckTestCase' passed at 2014-12-12 04:48:53 +0000.\n\t Executed 2 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds\nTest Suite 'PlayingCardTestCase' started at 2014-12-12 04:48:53 +0000\nTest Case '-[PlayingCardTestCase testSetSuitAnyValidAccepted]' started.\nTest Case '-[PlayingCardTestCase testSetSuitAnyValidAccepted]' passed (0.000 seconds).\nTest Case '-[PlayingCardTestCase testSetSuitInvalidRejected]' started.\nTest Case '-[PlayingCardTestCase testSetSuitInvalidRejected]' passed (0.000 seconds).\nTest Case '-[PlayingCardTestCase testTheValidSuits]' started.\nTest Case '-[PlayingCardTestCase testTheValidSuits]' passed (0.000 seconds).\nTest Suite 'PlayingCardTestCase' passed at 2014-12-12 04:48:53 +0000.\n\t Executed 3 tests, with 0 failures (0 unexpected) in 0.001 (0.002) seconds\nTest Suite 'UnitTestsCardExampleTests.xctest' passed at 2014-12-12 04:48:53 +0000.\n\t Executed 12 tests, with 0 failures (0 unexpected) in 0.004 (0.015) seconds\nTest Suite 'All tests' passed at 2014-12-12 04:48:53 +0000.\n\t Executed 12 tests, with 0 failures (0 unexpected) in 0.004 (0.017) seconds\n** TEST SUCCEEDED **\n\n"
  },
  {
    "path": "src/test/resources/xcodebuildhelp-invalid.txt",
    "content": "xcodebuild -help output\n    SampleTarget1 Extra text here.\n    TestSampleTarget1 Extra text here.\n    Extra text here.\n"
  },
  {
    "path": "src/test/resources/xcodebuildhelp-valid.txt",
    "content": "xcodebuild -help output\n    -SampleTarget1 Extra text here.\n    -TestSampleTarget1 Extra text here.\n    Extra text here.\n"
  },
  {
    "path": "src/test/resources/xcodebuildlist-invalid1.txt",
    "content": "Information about project \"SampleXcodeProject\":\n    Targets:\n\n        SampleTarget1\n        SampleTarget2\n        TestSampleTarget1\n        TestSampleTarget2\n\n    Build Configurations:\n\n        BuildConfiguration1\n        BuildConfiguration2\n\n    If no build configuration is specified and -scheme is not passed then \"Release\" is used.\n\n    Schemes:\n\n        SampleScheme1\n        SampleScheme2\n"
  },
  {
    "path": "src/test/resources/xcodebuildlist-invalid2.txt",
    "content": "Information about project \"SampleXcodeProject\":\n    Targets\n        SampleTarget1\n        SampleTarget2\n        TestSampleTarget1\n        TestSampleTarget2\n\n    Build Configurations\n        BuildConfiguration1\n        BuildConfiguration2\n\n    If no build configuration is specified and -scheme is not passed then \"Release\" is used.\n\n    Schemes\n        SampleScheme1\n        SampleScheme2\n"
  },
  {
    "path": "src/test/resources/xcodebuildlist-valid.txt",
    "content": "Information about project \"SampleXcodeProject\":\n    Targets:\n        SampleTarget1\n        SampleTarget2\n        TestSampleTarget1\n        TestSampleTarget2\n\n    Build Configurations:\n        BuildConfiguration1\n        BuildConfiguration2\n\n    If no build configuration is specified and -scheme is not passed then \"Release\" is used.\n\n    Schemes:\n        SampleScheme1\n        SampleScheme2\n"
  }
]