@moifort/stack 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +26 -2
  3. package/bin/stack.ts +109 -0
  4. package/hooks/shutdown-simulators-after-push.sh +19 -0
  5. package/package.json +40 -4
  6. package/routines/daily-health.md +78 -0
  7. package/routines/deprecations.md +23 -0
  8. package/routines/sentry-autofix.md +76 -0
  9. package/routines/stack-upgrade.md +45 -0
  10. package/rules/00-collaboration.md +81 -0
  11. package/rules/01-workflow.md +81 -0
  12. package/rules/02-commits.md +71 -0
  13. package/rules/03-code-review.md +25 -0
  14. package/rules/04-push.md +75 -0
  15. package/rules/05-release.md +40 -0
  16. package/rules/06-changelog.md +48 -0
  17. package/rules/07-appstore.md +77 -0
  18. package/rules/08-copy.md +52 -0
  19. package/rules/09-backend.md +132 -0
  20. package/rules/10-ios.md +206 -0
  21. package/rules/11-ops.md +114 -0
  22. package/rules/12-ci.md +32 -0
  23. package/rules/13-ai.md +71 -0
  24. package/rules/14-infra.md +90 -0
  25. package/rules/15-tooling.md +81 -0
  26. package/rules/16-routines.md +69 -0
  27. package/rules/17-landing.md +76 -0
  28. package/skills/appstore/SKILL.md +53 -0
  29. package/skills/domain/SKILL.md +136 -0
  30. package/skills/graphql/SKILL.md +83 -0
  31. package/skills/ios-feature/SKILL.md +94 -0
  32. package/skills/stack-install/SKILL.md +35 -0
  33. package/skills/stack-upgrade/SKILL.md +27 -0
  34. package/src/catalogue.ts +33 -0
  35. package/src/config.ts +20 -0
  36. package/src/init.ts +63 -0
  37. package/src/migrations.ts +72 -0
  38. package/src/migrations.unit.test.ts +44 -0
  39. package/src/package.ts +8 -0
  40. package/src/render.ts +13 -0
  41. package/src/render.unit.test.ts +17 -0
  42. package/src/sync.int.test.ts +103 -0
  43. package/src/sync.ts +161 -0
  44. package/src/templates.ts +121 -0
  45. package/src/validate-content.ts +65 -0
  46. package/templates/backend/.env.example +10 -0
  47. package/templates/backend/.github/workflows/deploy.yml +151 -0
  48. package/templates/backend/.github/workflows/schema.yml +59 -0
  49. package/templates/backend/.github/workflows/test-feat.yml +40 -0
  50. package/templates/backend/.github/workflows/test-int.yml +40 -0
  51. package/templates/backend/.github/workflows/test-unit.yml +64 -0
  52. package/templates/backend/docs/api-evolution.md +67 -0
  53. package/templates/backend/firebase.json +21 -0
  54. package/templates/backend/firestore.indexes.json +4 -0
  55. package/templates/backend/firestore.rules +11 -0
  56. package/templates/backend/infra/auth.tf +54 -0
  57. package/templates/backend/infra/backend.tf +6 -0
  58. package/templates/backend/infra/cicd.tf +63 -0
  59. package/templates/backend/infra/firebase.tf +26 -0
  60. package/templates/backend/infra/firestore.tf +53 -0
  61. package/templates/backend/infra/function.tf +171 -0
  62. package/templates/backend/infra/main.tf +26 -0
  63. package/templates/backend/infra/observer.tf +18 -0
  64. package/templates/backend/infra/outputs.tf +30 -0
  65. package/templates/backend/infra/project.tf +64 -0
  66. package/templates/backend/infra/scheduler.tf +28 -0
  67. package/templates/backend/infra/secrets.tf +44 -0
  68. package/templates/backend/infra/state.tf +13 -0
  69. package/templates/backend/infra/terraform.tfvars.example +16 -0
  70. package/templates/backend/infra/variables.tf +104 -0
  71. package/templates/backend/infra/versions.tf +30 -0
  72. package/templates/backend/nitro.config.ts +40 -0
  73. package/templates/backend/package.json +51 -0
  74. package/templates/backend/scripts/deprecations/inspector-rule.ts +29 -0
  75. package/templates/backend/scripts/deprecations/status.ts +50 -0
  76. package/templates/backend/scripts/deprecations/status.unit.test.ts +57 -0
  77. package/templates/backend/scripts/deprecations/usage.ts +79 -0
  78. package/templates/backend/scripts/deprecations/usage.unit.test.ts +64 -0
  79. package/templates/backend/scripts/deprecations.ts +224 -0
  80. package/templates/backend/scripts/export-graphql-schema.ts +11 -0
  81. package/templates/backend/scripts/generate-changelog-asset.ts +27 -0
  82. package/templates/backend/scripts/install-terraform.sh +61 -0
  83. package/templates/backend/scripts/tf +11 -0
  84. package/templates/backend/server/domain/changelog/business-rules.ts +60 -0
  85. package/templates/backend/server/domain/changelog/business-rules.unit.test.ts +88 -0
  86. package/templates/backend/server/domain/changelog/infrastructure/graphql/queries.ts +17 -0
  87. package/templates/backend/server/domain/changelog/infrastructure/graphql/types.ts +23 -0
  88. package/templates/backend/server/domain/changelog/primitives.ts +19 -0
  89. package/templates/backend/server/domain/changelog/query.ts +13 -0
  90. package/templates/backend/server/domain/changelog/query.unit.test.ts +19 -0
  91. package/templates/backend/server/domain/changelog/types.ts +9 -0
  92. package/templates/backend/server/domain/shared/graphql/builder.ts +52 -0
  93. package/templates/backend/server/domain/shared/graphql/errors.ts +19 -0
  94. package/templates/backend/server/domain/shared/graphql/scalars.ts +51 -0
  95. package/templates/backend/server/domain/shared/graphql/schema.ts +21 -0
  96. package/templates/backend/server/domain/shared/language.ts +26 -0
  97. package/templates/backend/server/domain/shared/page.ts +25 -0
  98. package/templates/backend/server/domain/shared/page.unit.test.ts +51 -0
  99. package/templates/backend/server/domain/shared/primitives.ts +50 -0
  100. package/templates/backend/server/domain/shared/primitives.unit.test.ts +25 -0
  101. package/templates/backend/server/domain/shared/types.ts +14 -0
  102. package/templates/backend/server/domain/user/command.ts +16 -0
  103. package/templates/backend/server/domain/user/infrastructure/graphql/inputs.ts +12 -0
  104. package/templates/backend/server/domain/user/infrastructure/graphql/mutations.ts +40 -0
  105. package/templates/backend/server/domain/user/infrastructure/graphql/queries.ts +13 -0
  106. package/templates/backend/server/domain/user/infrastructure/graphql/types.ts +35 -0
  107. package/templates/backend/server/domain/user/infrastructure/repository.ts +59 -0
  108. package/templates/backend/server/domain/user/mutations.feat.test.ts +42 -0
  109. package/templates/backend/server/domain/user/query.int.test.ts +49 -0
  110. package/templates/backend/server/domain/user/query.ts +34 -0
  111. package/templates/backend/server/domain/user/types.ts +20 -0
  112. package/templates/backend/server/domain/user/use-case.ts +18 -0
  113. package/templates/backend/server/middleware/auth.ts +54 -0
  114. package/templates/backend/server/plugins/00-sentry.ts +74 -0
  115. package/templates/backend/server/plugins/01-request-log.ts +28 -0
  116. package/templates/backend/server/plugins/02-graphql.ts +69 -0
  117. package/templates/backend/server/plugins/03-boot-time.ts +21 -0
  118. package/templates/backend/server/routes/admin/migrate.post.ts +9 -0
  119. package/templates/backend/server/routes/app-config.get.ts +15 -0
  120. package/templates/backend/server/routes/graphql.ts +52 -0
  121. package/templates/backend/server/system/app-support.ts +17 -0
  122. package/templates/backend/server/system/config/index.ts +18 -0
  123. package/templates/backend/server/system/config/primitives.ts +20 -0
  124. package/templates/backend/server/system/config/primitives.unit.test.ts +13 -0
  125. package/templates/backend/server/system/config/types.ts +8 -0
  126. package/templates/backend/server/system/firebase.ts +19 -0
  127. package/templates/backend/server/system/identity.ts +18 -0
  128. package/templates/backend/server/system/logger.ts +119 -0
  129. package/templates/backend/server/system/logger.unit.test.ts +109 -0
  130. package/templates/backend/server/system/migration/migrations/index.ts +6 -0
  131. package/templates/backend/server/system/migration/primitives.ts +18 -0
  132. package/templates/backend/server/system/migration/runner.ts +52 -0
  133. package/templates/backend/server/system/migration/types.ts +16 -0
  134. package/templates/backend/server/system/read-meter.ts +100 -0
  135. package/templates/backend/server/system/read-meter.unit.test.ts +97 -0
  136. package/templates/backend/server/system/request-cache.ts +139 -0
  137. package/templates/backend/server/system/request-cache.unit.test.ts +166 -0
  138. package/templates/backend/server/system/secret-box.ts +49 -0
  139. package/templates/backend/server/system/secret-box.unit.test.ts +46 -0
  140. package/templates/backend/server/test/bdd.ts +12 -0
  141. package/templates/backend/server/test/fake-firestore.ts +483 -0
  142. package/templates/backend/server/utils/apollo.ts +13 -0
  143. package/templates/backend/server/utils/fetch.ts +5 -0
  144. package/templates/backend/server/utils/firestore.ts +91 -0
  145. package/templates/backend/server/utils/input.ts +36 -0
  146. package/templates/backend/server/utils/input.unit.test.ts +43 -0
  147. package/templates/backend/server/utils/slug.ts +21 -0
  148. package/templates/backend/tsconfig.json +16 -0
  149. package/templates/base/.github/workflows/renovate.yml +17 -0
  150. package/templates/base/CHANGELOG.fr.md +3 -0
  151. package/templates/base/CHANGELOG.md +7 -0
  152. package/templates/base/CLAUDE.md +34 -0
  153. package/templates/base/README.md +12 -0
  154. package/templates/base/biome.json +47 -0
  155. package/templates/base/bunfig.toml +2 -0
  156. package/templates/base/docs/adr/0001-built-on-the-polyforms-stack.md +21 -0
  157. package/templates/base/docs/data-recovery.md +116 -0
  158. package/templates/base/docs/ideas.md +4 -0
  159. package/templates/base/project-context.md +43 -0
  160. package/templates/base/renovate.json +37 -0
  161. package/templates/ios/.github/workflows/build-ios.yml +168 -0
  162. package/templates/ios/.github/workflows/ios-upload.yml +308 -0
  163. package/templates/ios/.github/workflows/release-ios.yml +178 -0
  164. package/templates/ios/.github/workflows/testflight-ios.yml +57 -0
  165. package/templates/ios/infra/Gemfile +5 -0
  166. package/templates/ios/infra/fastlane/Appfile +1 -0
  167. package/templates/ios/infra/fastlane/Fastfile +54 -0
  168. package/templates/ios/infra/fastlane/metadata/copyright.txt +1 -0
  169. package/templates/ios/infra/fastlane/metadata/en-US/description.txt +0 -0
  170. package/templates/ios/infra/fastlane/metadata/en-US/keywords.txt +0 -0
  171. package/templates/ios/infra/fastlane/metadata/en-US/name.txt +1 -0
  172. package/templates/ios/infra/fastlane/metadata/en-US/privacy_url.txt +1 -0
  173. package/templates/ios/infra/fastlane/metadata/en-US/promotional_text.txt +0 -0
  174. package/templates/ios/infra/fastlane/metadata/en-US/subtitle.txt +1 -0
  175. package/templates/ios/infra/fastlane/metadata/en-US/support_url.txt +1 -0
  176. package/templates/ios/infra/fastlane/metadata/fr-FR/description.txt +0 -0
  177. package/templates/ios/infra/fastlane/metadata/fr-FR/keywords.txt +0 -0
  178. package/templates/ios/infra/fastlane/metadata/fr-FR/name.txt +1 -0
  179. package/templates/ios/infra/fastlane/metadata/fr-FR/privacy_url.txt +1 -0
  180. package/templates/ios/infra/fastlane/metadata/fr-FR/promotional_text.txt +0 -0
  181. package/templates/ios/infra/fastlane/metadata/fr-FR/subtitle.txt +1 -0
  182. package/templates/ios/infra/fastlane/metadata/fr-FR/support_url.txt +1 -0
  183. package/templates/ios/infra/fastlane/metadata/primary_category.txt +1 -0
  184. package/templates/ios/infra/ios.tf +28 -0
  185. package/templates/ios/ios/ExportOptions.plist +26 -0
  186. package/templates/ios/ios/apollo-codegen-config.json +16 -0
  187. package/templates/ios/ios/project.yml +94 -0
  188. package/templates/ios/ios/{{APP_NAME}}/App.swift +46 -0
  189. package/templates/ios/ios/{{APP_NAME}}/Assets.xcassets/AppIcon.appiconset/AppIcon.png +0 -0
  190. package/templates/ios/ios/{{APP_NAME}}/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
  191. package/templates/ios/ios/{{APP_NAME}}/Assets.xcassets/Contents.json +6 -0
  192. package/templates/ios/ios/{{APP_NAME}}/Assets.xcassets/LaunchBackground.colorset/Contents.json +38 -0
  193. package/templates/ios/ios/{{APP_NAME}}/ContentView.swift +17 -0
  194. package/templates/ios/ios/{{APP_NAME}}/Features/Auth/AppleNonce.swift +33 -0
  195. package/templates/ios/ios/{{APP_NAME}}/Features/Auth/AuthRoot.swift +74 -0
  196. package/templates/ios/ios/{{APP_NAME}}/Features/Auth/AuthSession.swift +86 -0
  197. package/templates/ios/ios/{{APP_NAME}}/Features/Auth/LoginScreen.swift +83 -0
  198. package/templates/ios/ios/{{APP_NAME}}/Features/Home/HomeScreen.swift +21 -0
  199. package/templates/ios/ios/{{APP_NAME}}/Features/Home/components/pages/HomePage.swift +40 -0
  200. package/templates/ios/ios/{{APP_NAME}}/Features/Onboarding/AccountEnvironment.swift +7 -0
  201. package/templates/ios/ios/{{APP_NAME}}/Features/Onboarding/GraphQL/Onboarding.graphql +16 -0
  202. package/templates/ios/ios/{{APP_NAME}}/Features/Onboarding/OnboardingAPI.swift +28 -0
  203. package/templates/ios/ios/{{APP_NAME}}/Features/Onboarding/OnboardingClient.swift +26 -0
  204. package/templates/ios/ios/{{APP_NAME}}/Features/Onboarding/OnboardingGate.swift +50 -0
  205. package/templates/ios/ios/{{APP_NAME}}/Features/Onboarding/OnboardingScreen.swift +69 -0
  206. package/templates/ios/ios/{{APP_NAME}}/Features/Onboarding/components/pages/FirstNamePage.swift +66 -0
  207. package/templates/ios/ios/{{APP_NAME}}/Features/Onboarding/components/pages/WelcomePage.swift +37 -0
  208. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/ChangelogScreen.swift +25 -0
  209. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/ChangelogViewModel.swift +27 -0
  210. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/GraphQL/Settings.graphql +11 -0
  211. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/ProfileSettingsScreen.swift +30 -0
  212. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/ProfileSettingsViewModel.swift +51 -0
  213. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/SettingsAPI.swift +37 -0
  214. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/SettingsClient.swift +40 -0
  215. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/SettingsHomeScreen.swift +39 -0
  216. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/components/organisms/DeleteAccountButton.swift +30 -0
  217. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/components/organisms/SettingsRow.swift +56 -0
  218. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/components/organisms/SignOutButton.swift +23 -0
  219. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/components/pages/ChangelogPage.swift +59 -0
  220. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/components/pages/FeedbackSheet.swift +118 -0
  221. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/components/pages/ProfileSettingsPage.swift +90 -0
  222. package/templates/ios/ios/{{APP_NAME}}/Features/Settings/components/pages/SettingsHomePage.swift +70 -0
  223. package/templates/ios/ios/{{APP_NAME}}/Info.plist +14 -0
  224. package/templates/ios/ios/{{APP_NAME}}/Localizable.xcstrings +1030 -0
  225. package/templates/ios/ios/{{APP_NAME}}/PrivacyInfo.xcprivacy +122 -0
  226. package/templates/ios/ios/{{APP_NAME}}/Shared/APIClient.swift +23 -0
  227. package/templates/ios/ios/{{APP_NAME}}/Shared/AcceptLanguageInterceptor.swift +20 -0
  228. package/templates/ios/ios/{{APP_NAME}}/Shared/Components/atoms/AsyncButton.swift +73 -0
  229. package/templates/ios/ios/{{APP_NAME}}/Shared/Components/atoms/AsyncToolbarButton.swift +69 -0
  230. package/templates/ios/ios/{{APP_NAME}}/Shared/Components/atoms/ToolbarIconButton.swift +46 -0
  231. package/templates/ios/ios/{{APP_NAME}}/Shared/Components/molecules/EmptyState.swift +132 -0
  232. package/templates/ios/ios/{{APP_NAME}}/Shared/Components/molecules/LabeledInfoRow.swift +29 -0
  233. package/templates/ios/ios/{{APP_NAME}}/Shared/Components/styles/CaptionLabelStyle.swift +45 -0
  234. package/templates/ios/ios/{{APP_NAME}}/Shared/Components/styles/Copyable.swift +32 -0
  235. package/templates/ios/ios/{{APP_NAME}}/Shared/Components/styles/EdgeToEdgeSeparator.swift +14 -0
  236. package/templates/ios/ios/{{APP_NAME}}/Shared/Components/styles/RowLabelStyle.swift +58 -0
  237. package/templates/ios/ios/{{APP_NAME}}/Shared/CursorPage.swift +26 -0
  238. package/templates/ios/ios/{{APP_NAME}}/Shared/DataChanges.swift +19 -0
  239. package/templates/ios/ios/{{APP_NAME}}/Shared/ErrorPresenter.swift +62 -0
  240. package/templates/ios/ios/{{APP_NAME}}/Shared/ErrorReporting.swift +35 -0
  241. package/templates/ios/ios/{{APP_NAME}}/Shared/FeedbackReporting.swift +42 -0
  242. package/templates/ios/ios/{{APP_NAME}}/Shared/FirebaseTokenInterceptor.swift +49 -0
  243. package/templates/ios/ios/{{APP_NAME}}/Shared/GraphQLClient.swift +54 -0
  244. package/templates/ios/ios/{{APP_NAME}}/Shared/GraphQLHelpers.swift +128 -0
  245. package/templates/ios/ios/{{APP_NAME}}/Shared/GraphQLLoggingInterceptor.swift +28 -0
  246. package/templates/ios/ios/{{APP_NAME}}/Shared/LoadGate.swift +30 -0
  247. package/templates/ios/ios/{{APP_NAME}}/Shared/Secrets.swift.example +9 -0
  248. package/templates/ios/ios/{{APP_NAME}}/Shared/Services/AppSupportGate.swift +50 -0
  249. package/templates/ios/ios/{{APP_NAME}}/Shared/Shell/StartupLoadingView.swift +23 -0
  250. package/templates/ios/ios/{{APP_NAME}}/Shared/Shell/UpdateRequiredView.swift +24 -0
  251. package/templates/ios/ios/{{APP_NAME}}/Shared/Showcase.swift +13 -0
  252. package/templates/ios/ios/{{APP_NAME}}/Shared/SnapshotCache.swift +78 -0
  253. package/templates/ios/ios/{{APP_NAME}}/Shared/UITestEnvironment.swift +70 -0
  254. package/templates/ios/ios/{{APP_NAME}}/{{APP_NAME}}.entitlements +10 -0
  255. package/templates/ios/ios/{{APP_NAME}}Tests/Onboarding/OnboardingGateTests.swift +38 -0
  256. package/templates/ios/ios/{{APP_NAME}}Tests/Settings/SettingsViewModelTests.swift +63 -0
  257. package/templates/ios/ios/{{APP_NAME}}Tests/Support/TestDoubles.swift +35 -0
  258. package/templates/ios/package.merge.json +10 -0
  259. package/templates/ios/scripts/apollo-codegen.ts +31 -0
  260. package/templates/ios/scripts/check-ios-components.ts +72 -0
  261. package/templates/ios/scripts/check-strings.ts +103 -0
  262. package/templates/ios/scripts/install-device.sh +29 -0
  263. package/templates/ios/scripts/testflight.ts +213 -0
@@ -0,0 +1,1030 @@
1
+ {
2
+ "sourceLanguage" : "fr",
3
+ "strings" : {
4
+ "Accueil" : {
5
+ "localizations" : {
6
+ "en" : {
7
+ "stringUnit" : {
8
+ "state" : "translated",
9
+ "value" : "Home"
10
+ }
11
+ },
12
+ "fr" : {
13
+ "stringUnit" : {
14
+ "state" : "translated",
15
+ "value" : "Accueil"
16
+ }
17
+ }
18
+ }
19
+ },
20
+ "Ajouter" : {
21
+ "localizations" : {
22
+ "en" : {
23
+ "stringUnit" : {
24
+ "state" : "translated",
25
+ "value" : "Add"
26
+ }
27
+ },
28
+ "fr" : {
29
+ "stringUnit" : {
30
+ "state" : "translated",
31
+ "value" : "Ajouter"
32
+ }
33
+ }
34
+ }
35
+ },
36
+ "Ajoutez un premier élément pour commencer." : {
37
+ "localizations" : {
38
+ "en" : {
39
+ "stringUnit" : {
40
+ "state" : "translated",
41
+ "value" : "Add a first item to get started."
42
+ }
43
+ },
44
+ "fr" : {
45
+ "stringUnit" : {
46
+ "state" : "translated",
47
+ "value" : "Ajoutez un premier élément pour commencer."
48
+ }
49
+ }
50
+ }
51
+ },
52
+ "Annuler" : {
53
+ "localizations" : {
54
+ "en" : {
55
+ "stringUnit" : {
56
+ "state" : "translated",
57
+ "value" : "Cancel"
58
+ }
59
+ },
60
+ "fr" : {
61
+ "stringUnit" : {
62
+ "state" : "translated",
63
+ "value" : "Annuler"
64
+ }
65
+ }
66
+ }
67
+ },
68
+ "Apple n'a pas renvoyé de jeton." : {
69
+ "localizations" : {
70
+ "en" : {
71
+ "stringUnit" : {
72
+ "state" : "translated",
73
+ "value" : "Apple did not return a token."
74
+ }
75
+ },
76
+ "fr" : {
77
+ "stringUnit" : {
78
+ "state" : "translated",
79
+ "value" : "Apple n'a pas renvoyé de jeton."
80
+ }
81
+ }
82
+ }
83
+ },
84
+ "Application" : {
85
+ "localizations" : {
86
+ "en" : {
87
+ "stringUnit" : {
88
+ "state" : "translated",
89
+ "value" : "App"
90
+ }
91
+ },
92
+ "fr" : {
93
+ "stringUnit" : {
94
+ "state" : "translated",
95
+ "value" : "Application"
96
+ }
97
+ }
98
+ }
99
+ },
100
+ "Bienvenue dans {{APP_NAME}}" : {
101
+ "localizations" : {
102
+ "en" : {
103
+ "stringUnit" : {
104
+ "state" : "translated",
105
+ "value" : "Welcome to {{APP_NAME}}"
106
+ }
107
+ },
108
+ "fr" : {
109
+ "stringUnit" : {
110
+ "state" : "translated",
111
+ "value" : "Bienvenue dans {{APP_NAME}}"
112
+ }
113
+ }
114
+ }
115
+ },
116
+ "Bonjour %@" : {
117
+ "localizations" : {
118
+ "en" : {
119
+ "stringUnit" : {
120
+ "state" : "translated",
121
+ "value" : "Hello %@"
122
+ }
123
+ },
124
+ "fr" : {
125
+ "stringUnit" : {
126
+ "state" : "translated",
127
+ "value" : "Bonjour %@"
128
+ }
129
+ }
130
+ }
131
+ },
132
+ "Ce qui arrive dans l'application s'affichera ici." : {
133
+ "localizations" : {
134
+ "en" : {
135
+ "stringUnit" : {
136
+ "state" : "translated",
137
+ "value" : "What comes into the app will show here."
138
+ }
139
+ },
140
+ "fr" : {
141
+ "stringUnit" : {
142
+ "state" : "translated",
143
+ "value" : "Ce qui arrive dans l'application s'affichera ici."
144
+ }
145
+ }
146
+ }
147
+ },
148
+ "Cette version de {{APP_NAME}} n'est plus compatible avec le serveur. La dernière version est disponible sur l'App Store." : {
149
+ "localizations" : {
150
+ "en" : {
151
+ "stringUnit" : {
152
+ "state" : "translated",
153
+ "value" : "This version of {{APP_NAME}} no longer works with the server. The latest version is on the App Store."
154
+ }
155
+ },
156
+ "fr" : {
157
+ "stringUnit" : {
158
+ "state" : "translated",
159
+ "value" : "Cette version de {{APP_NAME}} n'est plus compatible avec le serveur. La dernière version est disponible sur l'App Store."
160
+ }
161
+ }
162
+ }
163
+ },
164
+ "Chargement…" : {
165
+ "localizations" : {
166
+ "en" : {
167
+ "stringUnit" : {
168
+ "state" : "translated",
169
+ "value" : "Loading…"
170
+ }
171
+ },
172
+ "fr" : {
173
+ "stringUnit" : {
174
+ "state" : "translated",
175
+ "value" : "Chargement…"
176
+ }
177
+ }
178
+ }
179
+ },
180
+ "Commencer" : {
181
+ "localizations" : {
182
+ "en" : {
183
+ "stringUnit" : {
184
+ "state" : "translated",
185
+ "value" : "Get started"
186
+ }
187
+ },
188
+ "fr" : {
189
+ "stringUnit" : {
190
+ "state" : "translated",
191
+ "value" : "Commencer"
192
+ }
193
+ }
194
+ }
195
+ },
196
+ "Comment vous appelez-vous ?" : {
197
+ "localizations" : {
198
+ "en" : {
199
+ "stringUnit" : {
200
+ "state" : "translated",
201
+ "value" : "What is your name?"
202
+ }
203
+ },
204
+ "fr" : {
205
+ "stringUnit" : {
206
+ "state" : "translated",
207
+ "value" : "Comment vous appelez-vous ?"
208
+ }
209
+ }
210
+ }
211
+ },
212
+ "Compte" : {
213
+ "localizations" : {
214
+ "en" : {
215
+ "stringUnit" : {
216
+ "state" : "translated",
217
+ "value" : "Account"
218
+ }
219
+ },
220
+ "fr" : {
221
+ "stringUnit" : {
222
+ "state" : "translated",
223
+ "value" : "Compte"
224
+ }
225
+ }
226
+ }
227
+ },
228
+ "Connectez-vous pour retrouver vos données." : {
229
+ "localizations" : {
230
+ "en" : {
231
+ "stringUnit" : {
232
+ "state" : "translated",
233
+ "value" : "Sign in to find your data."
234
+ }
235
+ },
236
+ "fr" : {
237
+ "stringUnit" : {
238
+ "state" : "translated",
239
+ "value" : "Connectez-vous pour retrouver vos données."
240
+ }
241
+ }
242
+ }
243
+ },
244
+ "Connexion impossible" : {
245
+ "localizations" : {
246
+ "en" : {
247
+ "stringUnit" : {
248
+ "state" : "translated",
249
+ "value" : "Cannot connect"
250
+ }
251
+ },
252
+ "fr" : {
253
+ "stringUnit" : {
254
+ "state" : "translated",
255
+ "value" : "Connexion impossible"
256
+ }
257
+ }
258
+ }
259
+ },
260
+ "Contenu" : {
261
+ "localizations" : {
262
+ "en" : {
263
+ "stringUnit" : {
264
+ "state" : "translated",
265
+ "value" : "Content"
266
+ }
267
+ },
268
+ "fr" : {
269
+ "stringUnit" : {
270
+ "state" : "translated",
271
+ "value" : "Contenu"
272
+ }
273
+ }
274
+ }
275
+ },
276
+ "Continuer" : {
277
+ "localizations" : {
278
+ "en" : {
279
+ "stringUnit" : {
280
+ "state" : "translated",
281
+ "value" : "Continue"
282
+ }
283
+ },
284
+ "fr" : {
285
+ "stringUnit" : {
286
+ "state" : "translated",
287
+ "value" : "Continuer"
288
+ }
289
+ }
290
+ }
291
+ },
292
+ "Copier" : {
293
+ "localizations" : {
294
+ "en" : {
295
+ "stringUnit" : {
296
+ "state" : "translated",
297
+ "value" : "Copy"
298
+ }
299
+ },
300
+ "fr" : {
301
+ "stringUnit" : {
302
+ "state" : "translated",
303
+ "value" : "Copier"
304
+ }
305
+ }
306
+ }
307
+ },
308
+ "Dites-nous ce qui manque ou ce qui gagnerait à changer." : {
309
+ "localizations" : {
310
+ "en" : {
311
+ "stringUnit" : {
312
+ "state" : "translated",
313
+ "value" : "Tell us what is missing or what would be better changed."
314
+ }
315
+ },
316
+ "fr" : {
317
+ "stringUnit" : {
318
+ "state" : "translated",
319
+ "value" : "Dites-nous ce qui manque ou ce qui gagnerait à changer."
320
+ }
321
+ }
322
+ }
323
+ },
324
+ "Décrivez ce que vous faisiez et ce qui s'est passé." : {
325
+ "localizations" : {
326
+ "en" : {
327
+ "stringUnit" : {
328
+ "state" : "translated",
329
+ "value" : "Describe what you were doing and what happened."
330
+ }
331
+ },
332
+ "fr" : {
333
+ "stringUnit" : {
334
+ "state" : "translated",
335
+ "value" : "Décrivez ce que vous faisiez et ce qui s'est passé."
336
+ }
337
+ }
338
+ }
339
+ },
340
+ "Email" : {
341
+ "localizations" : {
342
+ "en" : {
343
+ "stringUnit" : {
344
+ "state" : "translated",
345
+ "value" : "Email"
346
+ }
347
+ },
348
+ "fr" : {
349
+ "stringUnit" : {
350
+ "state" : "translated",
351
+ "value" : "Email"
352
+ }
353
+ }
354
+ }
355
+ },
356
+ "Enregistrer" : {
357
+ "localizations" : {
358
+ "en" : {
359
+ "stringUnit" : {
360
+ "state" : "translated",
361
+ "value" : "Save"
362
+ }
363
+ },
364
+ "fr" : {
365
+ "stringUnit" : {
366
+ "state" : "translated",
367
+ "value" : "Enregistrer"
368
+ }
369
+ }
370
+ }
371
+ },
372
+ "Envoyer" : {
373
+ "localizations" : {
374
+ "en" : {
375
+ "stringUnit" : {
376
+ "state" : "translated",
377
+ "value" : "Send"
378
+ }
379
+ },
380
+ "fr" : {
381
+ "stringUnit" : {
382
+ "state" : "translated",
383
+ "value" : "Envoyer"
384
+ }
385
+ }
386
+ }
387
+ },
388
+ "Fermer" : {
389
+ "localizations" : {
390
+ "en" : {
391
+ "stringUnit" : {
392
+ "state" : "translated",
393
+ "value" : "Close"
394
+ }
395
+ },
396
+ "fr" : {
397
+ "stringUnit" : {
398
+ "state" : "translated",
399
+ "value" : "Fermer"
400
+ }
401
+ }
402
+ }
403
+ },
404
+ "Identifiant" : {
405
+ "localizations" : {
406
+ "en" : {
407
+ "stringUnit" : {
408
+ "state" : "translated",
409
+ "value" : "Identifier"
410
+ }
411
+ },
412
+ "fr" : {
413
+ "stringUnit" : {
414
+ "state" : "translated",
415
+ "value" : "Identifiant"
416
+ }
417
+ }
418
+ }
419
+ },
420
+ "Impossible de terminer" : {
421
+ "localizations" : {
422
+ "en" : {
423
+ "stringUnit" : {
424
+ "state" : "translated",
425
+ "value" : "Could not finish"
426
+ }
427
+ },
428
+ "fr" : {
429
+ "stringUnit" : {
430
+ "state" : "translated",
431
+ "value" : "Impossible de terminer"
432
+ }
433
+ }
434
+ }
435
+ },
436
+ "Lyon" : {
437
+ "localizations" : {
438
+ "en" : {
439
+ "stringUnit" : {
440
+ "state" : "translated",
441
+ "value" : "Lyon"
442
+ }
443
+ },
444
+ "fr" : {
445
+ "stringUnit" : {
446
+ "state" : "translated",
447
+ "value" : "Lyon"
448
+ }
449
+ }
450
+ }
451
+ },
452
+ "Merci, votre message nous aide à améliorer l'application." : {
453
+ "localizations" : {
454
+ "en" : {
455
+ "stringUnit" : {
456
+ "state" : "translated",
457
+ "value" : "Thank you, your message helps us improve the app."
458
+ }
459
+ },
460
+ "fr" : {
461
+ "stringUnit" : {
462
+ "state" : "translated",
463
+ "value" : "Merci, votre message nous aide à améliorer l'application."
464
+ }
465
+ }
466
+ }
467
+ },
468
+ "Message envoyé" : {
469
+ "localizations" : {
470
+ "en" : {
471
+ "stringUnit" : {
472
+ "state" : "translated",
473
+ "value" : "Message sent"
474
+ }
475
+ },
476
+ "fr" : {
477
+ "stringUnit" : {
478
+ "state" : "translated",
479
+ "value" : "Message envoyé"
480
+ }
481
+ }
482
+ }
483
+ },
484
+ "Mettre à jour" : {
485
+ "localizations" : {
486
+ "en" : {
487
+ "stringUnit" : {
488
+ "state" : "translated",
489
+ "value" : "Update"
490
+ }
491
+ },
492
+ "fr" : {
493
+ "stringUnit" : {
494
+ "state" : "translated",
495
+ "value" : "Mettre à jour"
496
+ }
497
+ }
498
+ }
499
+ },
500
+ "Mis à jour hier" : {
501
+ "localizations" : {
502
+ "en" : {
503
+ "stringUnit" : {
504
+ "state" : "translated",
505
+ "value" : "Updated yesterday"
506
+ }
507
+ },
508
+ "fr" : {
509
+ "stringUnit" : {
510
+ "state" : "translated",
511
+ "value" : "Mis à jour hier"
512
+ }
513
+ }
514
+ }
515
+ },
516
+ "Mise à jour requise" : {
517
+ "localizations" : {
518
+ "en" : {
519
+ "stringUnit" : {
520
+ "state" : "translated",
521
+ "value" : "Update required"
522
+ }
523
+ },
524
+ "fr" : {
525
+ "stringUnit" : {
526
+ "state" : "translated",
527
+ "value" : "Mise à jour requise"
528
+ }
529
+ }
530
+ }
531
+ },
532
+ "Nom" : {
533
+ "localizations" : {
534
+ "en" : {
535
+ "stringUnit" : {
536
+ "state" : "translated",
537
+ "value" : "Name"
538
+ }
539
+ },
540
+ "fr" : {
541
+ "stringUnit" : {
542
+ "state" : "translated",
543
+ "value" : "Nom"
544
+ }
545
+ }
546
+ }
547
+ },
548
+ "Note" : {
549
+ "localizations" : {
550
+ "en" : {
551
+ "stringUnit" : {
552
+ "state" : "translated",
553
+ "value" : "Note"
554
+ }
555
+ },
556
+ "fr" : {
557
+ "stringUnit" : {
558
+ "state" : "translated",
559
+ "value" : "Note"
560
+ }
561
+ }
562
+ }
563
+ },
564
+ "Notes de version indisponibles" : {
565
+ "localizations" : {
566
+ "en" : {
567
+ "stringUnit" : {
568
+ "state" : "translated",
569
+ "value" : "Release notes unavailable"
570
+ }
571
+ },
572
+ "fr" : {
573
+ "stringUnit" : {
574
+ "state" : "translated",
575
+ "value" : "Notes de version indisponibles"
576
+ }
577
+ }
578
+ }
579
+ },
580
+ "Nous écrire" : {
581
+ "localizations" : {
582
+ "en" : {
583
+ "stringUnit" : {
584
+ "state" : "translated",
585
+ "value" : "Write to us"
586
+ }
587
+ },
588
+ "fr" : {
589
+ "stringUnit" : {
590
+ "state" : "translated",
591
+ "value" : "Nous écrire"
592
+ }
593
+ }
594
+ }
595
+ },
596
+ "Nouveautés" : {
597
+ "localizations" : {
598
+ "en" : {
599
+ "stringUnit" : {
600
+ "state" : "translated",
601
+ "value" : "What's new"
602
+ }
603
+ },
604
+ "fr" : {
605
+ "stringUnit" : {
606
+ "state" : "translated",
607
+ "value" : "Nouveautés"
608
+ }
609
+ }
610
+ }
611
+ },
612
+ "OK" : {
613
+ "localizations" : {
614
+ "en" : {
615
+ "stringUnit" : {
616
+ "state" : "translated",
617
+ "value" : "OK"
618
+ }
619
+ },
620
+ "fr" : {
621
+ "stringUnit" : {
622
+ "state" : "translated",
623
+ "value" : "OK"
624
+ }
625
+ }
626
+ }
627
+ },
628
+ "{{APP_TAGLINE}}" : {
629
+ "localizations" : {
630
+ "en" : {
631
+ "stringUnit" : {
632
+ "state" : "translated",
633
+ "value" : "{{APP_TAGLINE_EN}}"
634
+ }
635
+ },
636
+ "fr" : {
637
+ "stringUnit" : {
638
+ "state" : "translated",
639
+ "value" : "{{APP_TAGLINE}}"
640
+ }
641
+ }
642
+ }
643
+ },
644
+ "Problème" : {
645
+ "localizations" : {
646
+ "en" : {
647
+ "stringUnit" : {
648
+ "state" : "translated",
649
+ "value" : "Problem"
650
+ }
651
+ },
652
+ "fr" : {
653
+ "stringUnit" : {
654
+ "state" : "translated",
655
+ "value" : "Problème"
656
+ }
657
+ }
658
+ }
659
+ },
660
+ "Profil" : {
661
+ "localizations" : {
662
+ "en" : {
663
+ "stringUnit" : {
664
+ "state" : "translated",
665
+ "value" : "Profile"
666
+ }
667
+ },
668
+ "fr" : {
669
+ "stringUnit" : {
670
+ "state" : "translated",
671
+ "value" : "Profil"
672
+ }
673
+ }
674
+ }
675
+ },
676
+ "Prénom" : {
677
+ "localizations" : {
678
+ "en" : {
679
+ "stringUnit" : {
680
+ "state" : "translated",
681
+ "value" : "First name"
682
+ }
683
+ },
684
+ "fr" : {
685
+ "stringUnit" : {
686
+ "state" : "translated",
687
+ "value" : "Prénom"
688
+ }
689
+ }
690
+ }
691
+ },
692
+ "Retour" : {
693
+ "localizations" : {
694
+ "en" : {
695
+ "stringUnit" : {
696
+ "state" : "translated",
697
+ "value" : "Back"
698
+ }
699
+ },
700
+ "fr" : {
701
+ "stringUnit" : {
702
+ "state" : "translated",
703
+ "value" : "Retour"
704
+ }
705
+ }
706
+ }
707
+ },
708
+ "Rien pour l'instant" : {
709
+ "localizations" : {
710
+ "en" : {
711
+ "stringUnit" : {
712
+ "state" : "translated",
713
+ "value" : "Nothing yet"
714
+ }
715
+ },
716
+ "fr" : {
717
+ "stringUnit" : {
718
+ "state" : "translated",
719
+ "value" : "Rien pour l'instant"
720
+ }
721
+ }
722
+ }
723
+ },
724
+ "Réessayer" : {
725
+ "localizations" : {
726
+ "en" : {
727
+ "stringUnit" : {
728
+ "state" : "translated",
729
+ "value" : "Try again"
730
+ }
731
+ },
732
+ "fr" : {
733
+ "stringUnit" : {
734
+ "state" : "translated",
735
+ "value" : "Réessayer"
736
+ }
737
+ }
738
+ }
739
+ },
740
+ "Réglages" : {
741
+ "localizations" : {
742
+ "en" : {
743
+ "stringUnit" : {
744
+ "state" : "translated",
745
+ "value" : "Settings"
746
+ }
747
+ },
748
+ "fr" : {
749
+ "stringUnit" : {
750
+ "state" : "translated",
751
+ "value" : "Réglages"
752
+ }
753
+ }
754
+ }
755
+ },
756
+ "Réponse invalide du serveur" : {
757
+ "localizations" : {
758
+ "en" : {
759
+ "stringUnit" : {
760
+ "state" : "translated",
761
+ "value" : "Invalid answer from the server"
762
+ }
763
+ },
764
+ "fr" : {
765
+ "stringUnit" : {
766
+ "state" : "translated",
767
+ "value" : "Réponse invalide du serveur"
768
+ }
769
+ }
770
+ }
771
+ },
772
+ "Se déconnecter" : {
773
+ "localizations" : {
774
+ "en" : {
775
+ "stringUnit" : {
776
+ "state" : "translated",
777
+ "value" : "Sign out"
778
+ }
779
+ },
780
+ "fr" : {
781
+ "stringUnit" : {
782
+ "state" : "translated",
783
+ "value" : "Se déconnecter"
784
+ }
785
+ }
786
+ }
787
+ },
788
+ "Signaler un problème ou proposer une idée" : {
789
+ "localizations" : {
790
+ "en" : {
791
+ "stringUnit" : {
792
+ "state" : "translated",
793
+ "value" : "Report a problem or suggest an idea"
794
+ }
795
+ },
796
+ "fr" : {
797
+ "stringUnit" : {
798
+ "state" : "translated",
799
+ "value" : "Signaler un problème ou proposer une idée"
800
+ }
801
+ }
802
+ }
803
+ },
804
+ "Suggestion" : {
805
+ "localizations" : {
806
+ "en" : {
807
+ "stringUnit" : {
808
+ "state" : "translated",
809
+ "value" : "Suggestion"
810
+ }
811
+ },
812
+ "fr" : {
813
+ "stringUnit" : {
814
+ "state" : "translated",
815
+ "value" : "Suggestion"
816
+ }
817
+ }
818
+ }
819
+ },
820
+ "Sujet" : {
821
+ "localizations" : {
822
+ "en" : {
823
+ "stringUnit" : {
824
+ "state" : "translated",
825
+ "value" : "Subject"
826
+ }
827
+ },
828
+ "fr" : {
829
+ "stringUnit" : {
830
+ "state" : "translated",
831
+ "value" : "Sujet"
832
+ }
833
+ }
834
+ }
835
+ },
836
+ "Supprimer" : {
837
+ "localizations" : {
838
+ "en" : {
839
+ "stringUnit" : {
840
+ "state" : "translated",
841
+ "value" : "Delete"
842
+ }
843
+ },
844
+ "fr" : {
845
+ "stringUnit" : {
846
+ "state" : "translated",
847
+ "value" : "Supprimer"
848
+ }
849
+ }
850
+ }
851
+ },
852
+ "Supprimer définitivement le compte ?" : {
853
+ "localizations" : {
854
+ "en" : {
855
+ "stringUnit" : {
856
+ "state" : "translated",
857
+ "value" : "Delete the account for good?"
858
+ }
859
+ },
860
+ "fr" : {
861
+ "stringUnit" : {
862
+ "state" : "translated",
863
+ "value" : "Supprimer définitivement le compte ?"
864
+ }
865
+ }
866
+ }
867
+ },
868
+ "Supprimer mon compte" : {
869
+ "localizations" : {
870
+ "en" : {
871
+ "stringUnit" : {
872
+ "state" : "translated",
873
+ "value" : "Delete my account"
874
+ }
875
+ },
876
+ "fr" : {
877
+ "stringUnit" : {
878
+ "state" : "translated",
879
+ "value" : "Supprimer mon compte"
880
+ }
881
+ }
882
+ }
883
+ },
884
+ "Synchroniser" : {
885
+ "localizations" : {
886
+ "en" : {
887
+ "stringUnit" : {
888
+ "state" : "translated",
889
+ "value" : "Sync"
890
+ }
891
+ },
892
+ "fr" : {
893
+ "stringUnit" : {
894
+ "state" : "translated",
895
+ "value" : "Synchroniser"
896
+ }
897
+ }
898
+ }
899
+ },
900
+ "Terminé" : {
901
+ "localizations" : {
902
+ "en" : {
903
+ "stringUnit" : {
904
+ "state" : "translated",
905
+ "value" : "Done"
906
+ }
907
+ },
908
+ "fr" : {
909
+ "stringUnit" : {
910
+ "state" : "translated",
911
+ "value" : "Terminé"
912
+ }
913
+ }
914
+ }
915
+ },
916
+ "Toutes vos données seront effacées sans possibilité de récupération. Un abonnement éventuel n'est pas résilié et reste à annuler dans l'App Store." : {
917
+ "localizations" : {
918
+ "en" : {
919
+ "stringUnit" : {
920
+ "state" : "translated",
921
+ "value" : "All your data will be erased with no way to recover it. A subscription, if any, is not cancelled and must be cancelled in the App Store."
922
+ }
923
+ },
924
+ "fr" : {
925
+ "stringUnit" : {
926
+ "state" : "translated",
927
+ "value" : "Toutes vos données seront effacées sans possibilité de récupération. Un abonnement éventuel n'est pas résilié et reste à annuler dans l'App Store."
928
+ }
929
+ }
930
+ }
931
+ },
932
+ "Une erreur est survenue" : {
933
+ "localizations" : {
934
+ "en" : {
935
+ "stringUnit" : {
936
+ "state" : "translated",
937
+ "value" : "Something went wrong"
938
+ }
939
+ },
940
+ "fr" : {
941
+ "stringUnit" : {
942
+ "state" : "translated",
943
+ "value" : "Une erreur est survenue"
944
+ }
945
+ }
946
+ }
947
+ },
948
+ "Une note assez longue pour passer sur deux lignes et montrer où reste l'icône" : {
949
+ "localizations" : {
950
+ "en" : {
951
+ "stringUnit" : {
952
+ "state" : "translated",
953
+ "value" : "A note long enough to wrap onto two lines and show where the icon stays"
954
+ }
955
+ },
956
+ "fr" : {
957
+ "stringUnit" : {
958
+ "state" : "translated",
959
+ "value" : "Une note assez longue pour passer sur deux lignes et montrer où reste l'icône"
960
+ }
961
+ }
962
+ }
963
+ },
964
+ "Version et nouveautés" : {
965
+ "localizations" : {
966
+ "en" : {
967
+ "stringUnit" : {
968
+ "state" : "translated",
969
+ "value" : "Version and what's new"
970
+ }
971
+ },
972
+ "fr" : {
973
+ "stringUnit" : {
974
+ "state" : "translated",
975
+ "value" : "Version et nouveautés"
976
+ }
977
+ }
978
+ }
979
+ },
980
+ "Ville" : {
981
+ "localizations" : {
982
+ "en" : {
983
+ "stringUnit" : {
984
+ "state" : "translated",
985
+ "value" : "City"
986
+ }
987
+ },
988
+ "fr" : {
989
+ "stringUnit" : {
990
+ "state" : "translated",
991
+ "value" : "Ville"
992
+ }
993
+ }
994
+ }
995
+ },
996
+ "Votre prénom sert à personnaliser l'application." : {
997
+ "localizations" : {
998
+ "en" : {
999
+ "stringUnit" : {
1000
+ "state" : "translated",
1001
+ "value" : "Your first name is used to personalise the app."
1002
+ }
1003
+ },
1004
+ "fr" : {
1005
+ "stringUnit" : {
1006
+ "state" : "translated",
1007
+ "value" : "Votre prénom sert à personnaliser l'application."
1008
+ }
1009
+ }
1010
+ }
1011
+ },
1012
+ "À venir" : {
1013
+ "localizations" : {
1014
+ "en" : {
1015
+ "stringUnit" : {
1016
+ "state" : "translated",
1017
+ "value" : "Upcoming"
1018
+ }
1019
+ },
1020
+ "fr" : {
1021
+ "stringUnit" : {
1022
+ "state" : "translated",
1023
+ "value" : "À venir"
1024
+ }
1025
+ }
1026
+ }
1027
+ }
1028
+ },
1029
+ "version" : "1.0"
1030
+ }