diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..abe866de --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,60 @@ +## Contributing +The development of ScratchJr is an ongoing process, and we love to have people in the ScratchJr and open source communities help us along the way. + +### Ways to Help + +* **Documenting bugs** + * If you've identified a bug in ScratchJr you should first check to see if it's been filed as an issue, if not you can file one. Make sure you follow the issue template. + * It's important that we can consistently reproduce issues. When writing an issue, be sure to follow our [reproduction step guidelines](https://github.com/LLK/scratch-gui/wiki/Writing-good-repro-steps). The example is based on Scratch, but the same principles apply to ScratchJr. + * Some issues are marked "Needs Repro". Adding a comment with good reproduction steps to those issues is a great way to help. + +* **Fixing bugs** + * You can request to fix a bug in a comment on the issue if you at mention the repo coordinator, who for this repo is @chrisgarrity. + * If the issue is marked "Help Wanted" you can go ahead and start working on it! + * **We will only accept Pull Requests for bugs that have an issue filed that has a priority label** + * If you're interested in fixing a bug with no issue, file the issue first and wait for it to have a priority added to it. + + * We are not looking for Pull Requests ("PR") for every issue and may deny a PR if it doesn't fit our criteria. + * We are far more likely to accept a PR if it is for an issue marked with Help Wanted. + * We will not accept PRs for issues marked with "Needs Discussion" or "Needs Design." + +### Learning Git and Github + +If you want to work on fixing issues, you should be familiar with Git and Github. + +* [Learn Git branching](https://learngitbranching.js.org/) includes an introduction to basic git commands and useful branching features. +* Here's a general introduction to [contributing to an open source project](https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github). + +**Important:** we follow the [Github Flow process](https://guides.github.com/introduction/flow/) as our development process. + +### How to Fix Bugs +1. Identify which Github issue you are working on. Leave a comment on the issue to let us (and other contributors) know you're working on it. +2. Make sure you have a fork of this repo (see [Github's forking a repo](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) for details) +3. Switch to the `develop` branch, and pull down the latest changes from upstream +4. Run the code, and reproduce the problem +5. Create your branch from the `develop` branch +6. Make code changes to fix the problem +7. Run `npm test` to make sure that your changes pass our tests +8. Commit your changes +9. Push your branch to your fork +10. Create your pull request + 1. Make sure to follow the template in the PR description + 1. Remember to check the “[Allow edits from maintainers](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork)” box + +When submitting pull requests keep in mind: +* please be patient -- it can take a while to find time to review them +* try to change the least amount of code necessary to fix the bug +* the code can't be radically changed without significant coordination with the Scratch Team, so these types of changes should be avoided +* if you find yourself changing a substantial amount of code or considering radical changes, please ask for clarification -- we may have envisioned a different approach, or underestimated the amount of effort + +### Suggestions +![Block sketch](https://user-images.githubusercontent.com/3431616/77192550-1dcebe00-6ab3-11ea-9606-8ecd8500c958.png) + +Please note: **_we are unlikely to accept PRs with new features that haven't been thought through and discussed as a group_**. + +Why? Because we have a strong belief in the value of keeping things simple for new users. It's been said that the Scratch Team spends about one hour of design discussion for every pixel in Scratch or ScratchJr. To learn more about our design philosophy, see [the Scratch Developers page](https://scratch.mit.edu/developers), or [this paper](https://ase.tufts.edu/DevTech/publications/scratchjr_idc_2013.pdf). + +### Other resources +Beyond this repo, there are also some other resources that you might want to take a look at: +* [Community Guidelines](https://github.com/LLK/scratch-www/wiki/Community-Guidelines) (we find it important to maintain a constructive and welcoming community for ScratchJr, just like on Scratch) +* [Open Source forum](https://scratch.mit.edu/discuss/49/) on Scratch diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..9c073e4c --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,15 @@ +### Expected Behavior + +_Please describe what should happen_ + +### Actual Behavior + +_Describe what actually happens, screenshots are helpful._ + +### Steps to Reproduce + +_Explain what someone needs to do in order to see what's described in *Actual behavior* above_ + +### Device and Operating System + +_e.g. iPad mini, iOS 10.3 or Samsung Galaxy Tab S6, Android 10_ diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..fd46e941 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ +### Resolves + +_What Github issue does this resolve (please include link)? Please make sure that the PR title reflects what the PR will do, not what is changing. +Please do not submit PRs that are not associated with a Github issue, or that only partially implement an issue._ + +- Resolves # + +### Proposed Changes + +_Describe what this Pull Request does_ + +### Reason for Changes + +_Explain why these changes should be made_ + +### Test Coverage + +_Please show how you have added tests to cover your changes, or provide the testing steps to verify the change. Screenshots that show the change are also helpful._ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 09d55d03..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,10 +0,0 @@ -## Contributing -Here are some ways you can contribute to ScratchJr: -* Report bugs - * If you find any bugs in ScratchJr, please let us know! Please be as descriptive as possible and include screenshots if possible. -* Work on bugs and make pull requests - * If you have made a fix for a bug, please make a pull request! Fork the scratchjr repository, make the code changes. Please provide an explanation of what you have changed, a link to the relevant bug, and how your changes fix the bug. All code that's merged into ScratchJr must pass our linter (`npm run lint`). We'll review your changes and hopefully merge them into the project, benefiting all users of ScratchJr! - -* [README](https://github.com/LLK/scratchjr/blob/master/README.md) -* [Scratch Community Guidelines](https://github.com/LLK/scratch-www/wiki/Community-Guidelines) -* [Issues](https://github.com/LLK/scratchjr/issues) diff --git a/android/ScratchJr/.idea/codeStyles/Project.xml b/android/ScratchJr/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..681f41ae --- /dev/null +++ b/android/ScratchJr/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/android/ScratchJr/.idea/misc.xml b/android/ScratchJr/.idea/misc.xml index e8ee3d97..d5d4a5ca 100644 --- a/android/ScratchJr/.idea/misc.xml +++ b/android/ScratchJr/.idea/misc.xml @@ -5,7 +5,7 @@ diff --git a/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java b/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java index 856eaefa..f61f1f66 100644 --- a/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java +++ b/android/ScratchJr/app/src/main/java/org/scratchjr/android/JavaScriptDirectInterface.java @@ -629,4 +629,24 @@ public void setAnalyticsPlacePref(String place) { _activity.setAnalyticsPlacePref(place); } } + + /** + * Record a user property + * @param prefObjStr single key-value JSON string, like "{\"school\": \"Central High\"}" + */ + @JavascriptInterface + public void setAnalyticsPref(String prefObjStr) { + if (prefObjStr != null) { + try { + JSONObject jsonObject = new JSONObject(prefObjStr); + JSONArray jsonArray = jsonObject.names(); + String key = jsonArray.getString(0); + String value = jsonObject.getString(key); + _activity.setAnalyticsPref(key, value); + } catch (JSONException e) { + Log.e(LOG_TAG, "JSON error: " + e.getMessage(), e); + return; + } + } + } } diff --git a/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java b/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java index 6d4f9cab..e511efc9 100644 --- a/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java +++ b/android/ScratchJr/app/src/main/java/org/scratchjr/android/ScratchJrActivity.java @@ -337,7 +337,7 @@ private void receiveProject(Uri projectUri) { } // We send the project Base64-encoded to JavaScript where it's processed and unpacked String base64Project = Base64.encodeToString(projectData.toByteArray(), Base64.DEFAULT); - runJavaScript("iOS.loadProjectFromSjr('" + base64Project + "');"); + runJavaScript("OS.loadProjectFromSjr('" + base64Project + "');"); } public RelativeLayout getContainer() { @@ -507,10 +507,9 @@ public void run() { */ public void logAnalyticsEvent(String category, String action, String label) { Bundle params = new Bundle(); - params.putString(FirebaseAnalytics.Param.ITEM_ID, action); params.putString(FirebaseAnalytics.Param.ITEM_CATEGORY, category); params.putString(FirebaseAnalytics.Param.ITEM_NAME, label); - _FirebaseAnalytics.logEvent(FirebaseAnalytics.Event.VIEW_ITEM, params); + _FirebaseAnalytics.logEvent(action, params); } /** @@ -521,6 +520,15 @@ public void setAnalyticsPlacePref(String place) { _FirebaseAnalytics.setUserProperty("place_preference", place); } + /** + * Record a user property + * @param key like "school" + * @param value like "Central High" + */ + public void setAnalyticsPref(String key, String value) { + _FirebaseAnalytics.setUserProperty(key, value); + } + public void translateAndScaleRectToContainerCoords(RectF rect, float devicePixelRatio) { float wx = _webView.getX(); float wy = _webView.getY(); diff --git a/editions/free/ios-resources/Default-Landscape@2x~ipad.png b/editions/free/ios-resources/Default-Landscape@2x~ipad.png index ed492020..34d2de11 100644 Binary files a/editions/free/ios-resources/Default-Landscape@2x~ipad.png and b/editions/free/ios-resources/Default-Landscape@2x~ipad.png differ diff --git a/editions/free/ios-resources/Default-Landscape~ipad.png b/editions/free/ios-resources/Default-Landscape~ipad.png index f6ee5829..e946fe5b 100644 Binary files a/editions/free/ios-resources/Default-Landscape~ipad.png and b/editions/free/ios-resources/Default-Landscape~ipad.png differ diff --git a/editions/free/src/css/start.css b/editions/free/src/css/start.css index f8989f0d..ff64a1f2 100644 --- a/editions/free/src/css/start.css +++ b/editions/free/src/css/start.css @@ -344,3 +344,44 @@ div.frame { text-align: right; } +.optionsInstruction { + position: absolute; + width: 96%; + top: 0; + padding: 2%; + color: #ffdd44; + font-size: 2.75rem; + font-weight: 500; + text-align: center; + text-shadow: 1px 1px 4px #333333; + list-style-type: none; +} + +.optionsInstruction.hide {display: none;} +.optionsInstruction.show {display: block;} + +.optionsList { + position: absolute; + width: 92%; + height: 86%; + padding: 4%; + top: 6%; + column-count: 3; + column-fill: auto; /* use first column up first */ + color: white; + font-size: 2.25rem; + font-weight: 500; + text-align: left; + text-shadow: 1px 1px 4px #333333; + list-style-type: none; + z-index: 1000; +} + +.optionsList.hide {display: none;} +.optionsList.show {display: block;} + +.optionsList > div { + display: block; + padding: .25em; + break-inside: avoid-column; /* don't allow column to break inside item */ +} diff --git a/editions/free/src/index.html b/editions/free/src/index.html index d2ba3484..40b2dd10 100644 --- a/editions/free/src/index.html +++ b/editions/free/src/index.html @@ -55,6 +55,11 @@
+ +
+
+
+
diff --git a/editions/free/src/localizations/ca.json b/editions/free/src/localizations/ca.json index 4723562e..15c8584c 100644 --- a/editions/free/src/localizations/ca.json +++ b/editions/free/src/localizations/ca.json @@ -36,9 +36,9 @@ "BLOCKS_MOVE_DOWN": "Mou-te avall", "BLOCKS_MOVE_DOWN_DESCRIPTION": "Mou el personatge el nombre de quadrícules indicat cap a avall.", "BLOCKS_TURN_RIGHT": "Gira a la dreta", - "BLOCKS_TURN_RIGHT_DESCRIPTION": "Gira el personatge la quantitat indicada en el sentit de les agulles del rellotge. Per a fer una volta completa, cal especificar 12 en la quantitat. ", + "BLOCKS_TURN_RIGHT_DESCRIPTION": "Gira el personatge la quantitat indicada en el sentit de les agulles del rellotge. Per a fer una volta completa, cal especificar 12 en la quantitat.", "BLOCKS_TURN_LEFT": "Gira a l'esquerra", - "BLOCKS_TURN_LEFT_DESCRIPTION": "Gira el personatge la quantitat indicada en el sentit contrari al de les agulles del rellotge. Per a fer una volta completa, cal especificar 12 en la quantitat. ", + "BLOCKS_TURN_LEFT_DESCRIPTION": "Gira el personatge la quantitat indicada en el sentit contrari al de les agulles del rellotge. Per a fer una volta completa, cal especificar 12 en la quantitat.", "BLOCKS_HOP": "Salta", "BLOCKS_HOP_DESCRIPTION": "Mou el personatge el nombre de quadrícules indicat cap a amunt i després cap a avall.", "BLOCKS_GO_HOME": "Torna a l'inici", @@ -362,6 +362,7 @@ "SHARING_BY_AIRDROP": "Comparteix per Airdrop", "SHARING_EMAIL_SUBJECT": "Projecte ScratchJr: {PROJECT_NAME}", "SHARING_EMAIL_TEXT": "Fes clic a la icona per provar el meu projecte a la tauleta iPad o Android!

Si no tens l'app ScratchJr, pots descarregar-la a la botiga d'apps Apple o Google Play Store.

Amb ScratchJr, els infants poden crear les seves pròpies històries interactives i jocs. Per saber-ne més, visita scratchjr.org.", + "FOR_PARENTS": "Per als pares", "PARENTAL_GATE_EXPLANATION": "Per què us preguntem això? Un adult ha d'aprobar la compartició en línia.", "GRID_NUMBER": "{N, number}", "NEW_PROJECT_PREFIX": "Projecte", diff --git a/editions/free/src/localizations/cy.json b/editions/free/src/localizations/cy.json index ef9886b0..e92b9249 100644 --- a/editions/free/src/localizations/cy.json +++ b/editions/free/src/localizations/cy.json @@ -60,7 +60,7 @@ "BLOCKS_POP": "Pop", "BLOCKS_POP_DESCRIPTION": "Yn Chwarae Sain \"Pop\".", "BLOCKS_PLAY_RECORDED": "Yn Chwarae Sain Wedi ei Recordio", - "BLOCKS_PLAY_RECORDED_DESCRIPTION": "\nYn chwarae sain wedi ei recordio gan y defnyddiwr.", + "BLOCKS_PLAY_RECORDED_DESCRIPTION": "Yn chwarae sain wedi ei recordio gan y defnyddiwr.", "BLOCKS_CONTROL_BLOCKS": "Blociau Rheoli", "BLOCKS_WAIT": "Aros", "BLOCKS_WAIT_DESCRIPTION": "Yn oedi'r sgript am amser penodol (mewn degfed o eiliadau).", diff --git a/editions/free/src/localizations/el.json b/editions/free/src/localizations/el.json new file mode 100644 index 00000000..998c5d73 --- /dev/null +++ b/editions/free/src/localizations/el.json @@ -0,0 +1,380 @@ +{ + "MY_PROJECTS": "Τα Έργα μου", + "QUICK_INTRO": "Σύντομη Εισαγωγή στο ScratchJr", + "SAMPLE_PROJECTS": "Δείγματα Έργων", + "ABOUT_SCRATCHJR": "Σχετικά με το ScratchJr", + "INTERFACE_GUIDE": "Οδηγός Διεπαφής", + "PAINT_EDITOR_GUIDE": "Οδηγός Ζωγραφικής", + "BLOCKS_GUIDE": "Οδηγός Κομματιών Εντολών", + "ABOUT_WHAT_IS": "Τι είναι το ScratchJr;", + "ABOUT_DESCRIPTION": "Το ScratchJr είναι μία εισαγωγική γλώσσα στον προγραμματισμό, η οποία δίνει τη δυνατότητα σε μικρά παιδιά (ηλικίας 5-7) να δημιουργήσουν τις δικές τους διαδραστικές ιστορίες και παιχνίδια. Τα παιδιά συνδυάζουν προγραμματιστικά κομμάτια εντολών ώστε να κάνουν τους χαρακτήρες τους να κινούνται, να χοροπηδούν, να χορεύουν, και να τραγουδούν. Τα παιδιά μπορούν να τροποποιήσουν χαρακτήρες μέσω του εργαλείου της ζωγραφικής, να προσθέσουν τις δικές τους φωνές και ήχους, ακόμα και να εισάγουν δικές τους φωτογραφίες -- έπειτα να χρησιμοποιήσουν τα προγραμματιστικά κομμάτια εντολών για να κάνουν τους χαρακτήρες τους να ζωντανέψουν.", + "ABOUT_INSPIRED_BY": "Το ScratchJr εμπνεύστηκε από τη γνωστή γλώσσα προγραμματισμού Scratch (http://scratch.mit.edu), η οποία χρησιμοποιείται από εκατομμύρια νέους (ηλικίας 8 και άνω) σε όλον τον κόσμο. Κατά τη δημιουργία του ScratchJr, επανασχεδιάσαμε τη διεπαφή και τη γλώσσα προγραμματισμού, ώστε να γίνουν αναπτυξιακά καταλληλότερες για μικρότερα παιδιά, με προσεχτική σχεδίαση χαρακτηριστικών ώστε να συνάδουν με τη γνωστική, προσωπική, κοινωνική, και συναισθηματική ανάπτυξη των μικρών παιδιών.

Το ScratchJr είναι διαθέσιμο ως δωρεάν εφαρμογή τόσο για iPad, όσο και για Android tablets. Για περισσότερες πληροφορίες σχετικά με το ScratchJr, ανατρέξτε στην ιστοσελίδα http://scratchjr.org", + "ABOUT_WHY_CREATE": "Γιατί Δημιουργήσαμε το ScratchJr", + "ABOUT_WHY_CREATE_DESCRIPTION": "Η συγγραφή κώδικα (ή ο προγραμματισμός υπολογιστών) είναι μια νέα μορφή αλφαβητισμού. Όπως η γραφή σε βοηθά να οργανώσεις τις σκέψεις σου και να εκφράσεις τις ιδέες σου, το ίδιο ισχύει και για τον προγραμματισμό. Στο παρελθόν, η συγγραφή κώδικα θεωρούνταν πολύ δύσκολη για τους περισσότερους ανθρώπους. Όμως εμείς πιστεύουμε ότι η συγγραφή κώδικα θα έπρεπε να είναι για όλους, ακριβώς όπως η γραφή.

Καθώς τα μικρά παιδιά προγραμματίζουν με το ScratchJr, μαθαίνουν πώς να δημιουργούν και να εκφράζονται μέσω του υπολογιστή, και όχι μόνο να αλληλεπιδρούν με αυτόν. Κατά τη διαδικασία, τα παιδιά μαθαίνουν να επιλύουν προβλήματα και να σχεδιάζουν έργα, και αναπτύσσουν δεξιότητες ακολουθίας οι οποίες είναι θεμελιώδεις για μελλοντική ακαδημαϊκή επιτυχία. Επίσης χρησιμοποιούν μαθηματικά και γλώσσα σε ένα πλαίσιο με νόημα και κίνητρα, υποστηρίζοντας την ανάπτυξη αριθμητικής και αλφαβητισμού κατά την προσχολική ηλικία. Με το ScratchJr, τα παιδιά δε μαθαίνουν απλά να προγραμματίζουν, προγραμματίζουν για να μάθουν.", + "ABOUT_WHO_CREATED": "Ποιός Δημιούργησε το ScratchJr;", + "ABOUT_WHO_CREATED_DESCRIPTION": "Το ScratchJr αποτελεί μία συνεργασία της Ερευνητικής Ομάδας των Αναπτυξιακών Τεχνολογιών (DevTech) στο Eliot-Pearson Τμήμα Μελέτης Παιδιού και Ανθρώπινης Ανάπτυξης στο Πανεπιστήμιο Tufts (με επικεφαλής τη Marina Umaschi Bers, με συνεισφορές από Amanda Strawhacker, Claire Caine, Louise Flannery, Elizabeth Kazakoff, και Dylan Portelance), της ομάδας Δια Βίου Νηπιαγωγείο (Lifelong Kindergarten) στο MIT Media Lab (με επικεφαλής τον Mitchel Resnick, με συνεισφορές από Chris Garrity, Tim Mickel, Carl Bowman, Champika Fernando, Natalie Rusk, Sayamindu Dasgupta και Chris Graves) και της Εταιρείας Παιγνιώδους Εφεύρεσης (Playful Invention Company) (με επικεφαλής την Paula Bontá και τον Brian Silverman, με συνεισφορές από Jack Geddes και Adrian Gabriel). Η Android έκδοση του ScratchJr υλοποιήθηκε από την ομάδα Two Sigma (με επικεφαλής τον Mark Roth, με συνεισφορές από Kevin Hu), με συνεισφορά της Benesse Corp.

Τα γραφικά και οι εικονογραφήσεις για το ScratchJr δημιουργήθηκαν από την εταιρεία HvingtQuatre Company (με επικεφαλής την Julien Gelifier και την Adrien Valesa), τη Sarah Thomson, τον Peter Mueller και την Jillian Lombardi. Η Paula Aguilera από το MIT Media Lab παρήγαγε το ScratchJr βίντεο. Θα επιθυμούσαμε επίσης να ευχαριστήσουμε όλους όσους συμμετείχαν στις κοινότητες δοκιμής του λογισμικού για iPad και Android, και ιδιαίτερα τους Sergio Antolinez, Vandendaele Didier και Sjoerd Dirk Meijer.", + "ABOUT_WHO_SUPPORTED": "Ποιος Υποστήριξε το ScratchJr;", + "ABOUT_WHO_SUPPORTED_DESCRIPTION": "Το έργο ScratchJr έχει λάβει γενναιόδωρη οικονομική υποστήριξη από το Εθνικό Ίδρυμα Επιστημών των Η.Π.Α. (NSF DRL-1118664), το Ίδρυμα Scratch, το Ίδρυμα LEGO, και τις Βρετανικές Τηλεπικοινωνίες.

Εάν απολαμβάνετε τη χρήση αυτής της δωρεάν εφαρμογής, παρακαλούμε σκεφτείτε το ενδεχόμενο να πραγματοποιήσετε μια δωρεά στο Ίδρυμα Scratch (www.scratchfoundation.org), έναν μη κερδοσκοπικό οργανισμό που παρέχει συνεχή υποστήριξη για το ScratchJr. Εκτιμούμε δωρεές κάθε μεγέθους, μεγάλες και μικρές.

Πλατινένιοι υποστηρικτές της καμπάνιας του ScratchJr στο Kickstarter οι: Jeremy Deutsch, Kenneth Ehlert, Catherine Greenspon, Mark Loughridge, JoAnn Gantz Bendetson, και Shirley Resnick.

Άλλοι υποστηρικτές από την καμπάνια του ScratchJr στο Kickstarter:", + "BLOCKS_TRIGGERING_BLOCKS": "Κομμάτια Πυροδότησης", + "BLOCKS_GREEN_FLAG": "Ξεκίνα με την Πράσινη Σημαία", + "BLOCKS_GREEN_FLAG_DESCRIPTION": "Ξεκινάει το σενάριο όταν χτυπήσετε την Πράσινη Σημαία.", + "BLOCKS_ON_TAP": "Ξεκίνα με το Χτύπημα", + "BLOCKS_ON_TAP_DESCRIPTION": "Ξεκινάει το σενάριο όταν χτυπήσετε πάνω στον χαρακτήρα.", + "BLOCKS_ON_TOUCH": "Ξεκίνα με το Άγγιγμα", + "BLOCKS_ON_TOUCH_DESCRIPTION": "Ξεκινάει το σενάριο όταν ο χαρακτήρας αγγίζεται από έναν άλλον χαρακτήρα.", + "BLOCKS_ON_MESSAGE": "Ξεκίνα με το Μήνυμα", + "BLOCKS_ON_MESSAGE_DESCRIPTION": "Ξεκινάει το σενάριο όποτε στέλνεται ένα μήνυμα του καθορισμένου χρώματος.", + "BLOCKS_SEND_MESSAGE": "Στείλε Μήνυμα", + "BLOCKS_SEND_MESSAGE_DESCRIPTION": "Στέλνει ένα μήνυμα του καθορισμένου χρώματος.", + "BLOCKS_MOTION_BLOCKS": "Κομμάτια Κίνησης", + "BLOCKS_MOVE_RIGHT": "Κινήσου Δεξιά", + "BLOCKS_MOVE_RIGHT_DESCRIPTION": "Μετακινεί τον χαρακτήρα έναν προκαθορισμένο αριθμό τετραγώνων προς τα δεξιά.", + "BLOCKS_MOVE_LEFT": "Κινήσου Αριστερά", + "BLOCKS_MOVE_LEFT_DESCRIPTION": "Μετακινεί τον χαρακτήρα έναν προκαθορισμένο αριθμό τετραγώνων προς τα αριστερά.", + "BLOCKS_MOVE_UP": "Κινήσου Πάνω", + "BLOCKS_MOVE_UP_DESCRIPTION": "Μετακινεί τον χαρακτήρα έναν προκαθορισμένο αριθμό τετραγώνων προς τα πάνω.", + "BLOCKS_MOVE_DOWN": "Κινήσου Κάτω", + "BLOCKS_MOVE_DOWN_DESCRIPTION": "Μετακινεί τον χαρακτήρα έναν προκαθορισμένο αριθμό τετραγώνων προς τα κάτω.", + "BLOCKS_TURN_RIGHT": "Στρίψε Δεξιά", + "BLOCKS_TURN_RIGHT_DESCRIPTION": "Περιστρέφει τον χαρακτήρα δεξιόστροφα για έναν καθορισμένο αριθμό. Στρίψε 12 για μία πλήρη περιστροφή.", + "BLOCKS_TURN_LEFT": "Στρίψε Αριστερά", + "BLOCKS_TURN_LEFT_DESCRIPTION": "Περιστρέφει τον χαρακτήρα αριστερόστροφα για έναν καθορισμένο αριθμό. Στρίψε 12 για μία πλήρη περιστροφή.", + "BLOCKS_HOP": "Πήδα", + "BLOCKS_HOP_DESCRIPTION": "Μετακινεί τον χαρακτήρα έναν προκαθορισμένο αριθμό τετραγώνων προς τα πάνω και έπειτα προς τα κάτω ξανά.", + "BLOCKS_GO_HOME": "Πήγαινε στην Αρχή", + "BLOCKS_GO_HOME_DESCRIPTION": "Επαναφέρει τη θέση του χαρακτήρα στην αρχική θέση του. (Για να ορίσετε καινούργια αρχική θέση, σύρετε τον χαρακτήρα στη θέση).", + "BLOCKS_LOOKS_BLOCKS": "Κομμάτια Όψεων", + "BLOCKS_SAY": "Πες", + "BLOCKS_SAY_DESCRIPTION": "Εμφανίζει ένα καθορισμένο μήνυμα σε μία φούσκα ομιλίας πάνω από τον χαρακτήρα.", + "BLOCKS_GROW": "Μεγάλωσε", + "BLOCKS_GROW_DESCRIPTION": "Μεγαλώνει το μέγεθος του χαρακτήρα.", + "BLOCKS_SHRINK": "Μίκρυνε", + "BLOCKS_SHRINK_DESCRIPTION": "Μικραίνει το μέγεθος του χαρακτήρα.", + "BLOCKS_RESET_SIZE": "Επανάφερε Μέγεθος", + "BLOCKS_RESET_SIZE_DESCRIPTION": "Επαναφέρει τον χαρακτήρα στο προκαθορισμένο του μέγεθος.", + "BLOCKS_HIDE": "Εξαφανίσου", + "BLOCKS_HIDE_DESCRIPTION": "Εξαφανίζει σταδιακά τον χαρακτήρα μέχρι να γίνει αόρατος.", + "BLOCKS_SHOW": "Εμφανίσου", + "BLOCKS_SHOW_DESCRIPTION": "Εμφανίζει σταδιακά τον χαρακτήρα μέχρι να γίνει πλήρως ορατός.", + "BLOCKS_SOUND_BLOCKS": "Κομμάτια Ήχου", + "BLOCKS_POP": "Ποπ", + "BLOCKS_POP_DESCRIPTION": "Παίζει έναν Ήχο \"Ποπ\".", + "BLOCKS_PLAY_RECORDED": "Παίξε Ηχογραφημένο Ήχο", + "BLOCKS_PLAY_RECORDED_DESCRIPTION": "Παίζει έναν ηχογραφημένο ήχο από τον χρήστη.", + "BLOCKS_CONTROL_BLOCKS": "Κομμάτια Ελέγχου", + "BLOCKS_WAIT": "Περίμενε", + "BLOCKS_WAIT_DESCRIPTION": "Παύση του σεναρίου για ένα καθορισμένο χρονικό διάστημα (σε δέκατα του δευτερολέπτου).", + "BLOCKS_STOP": "Σταμάτα", + "BLOCKS_STOP_DESCRIPTION": "Σταματάει τα σενάρια όλων των χαρακτήρων.", + "BLOCKS_SET_SPEED": "Όρισε Ταχύτητα", + "BLOCKS_SET_SPEED_DESCRIPTION": "Αλλάζει τον ρυθμό με τον οποίο εκτελούνται ορισμένα κομμάτια. ", + "BLOCKS_REPEAT": "Επανάλαβε", + "BLOCKS_REPEAT_DESCRIPTION": "Εκτελεί τα κομμάτια που περιλαμβάνονται για καθορισμένο αριθμό φορών.", + "BLOCKS_END_BLOCKS": "Κομμάτια Τέλους", + "BLOCKS_END": "Τέλος", + "BLOCKS_END_DESCRIPTION": "Υποδεικνύει το τέλος του σεναρίου (αλλά δεν επηρεάζει τον κώδικα με κανένα τρόπο).", + "BLOCKS_REPEAT_FOREVER": "Επανάλαβε για Πάντα", + "BLOCKS_REPEAT_FOREVER_DESCRIPTION": "Εκτελεί το σενάριο ξανά και ξανά.", + "BLOCKS_GO_TO_PAGE": "Πήγαινε στη Σελίδα", + "BLOCKS_GO_TO_PAGE_DESCRIPTION": "Αλλάζει στην καθορισμένη σελίδα του έργου.", + "INTERFACE_GUIDE_NUMBER": "{N, number}", + "INTERFACE_GUIDE_SAVE": "{N, number} | Αποθήκευση", + "INTERFACE_GUIDE_STAGE": "{N, number} | Σκηνικό", + "INTERFACE_GUIDE_PRESENTATION_MODE": "{N, number} | Λειτουργία Παρουσίασης", + "INTERFACE_GUIDE_GRID": "{N, number} | Πλέγμα", + "INTERFACE_GUIDE_CHANGE_BG": "{N, number} | Αλλαγή Υπόβαθρου", + "INTERFACE_GUIDE_ADD_TEXT": "{N, number} | Προσθήκη Κειμένου", + "INTERFACE_GUIDE_RESET_CHAR": "{N, number} | Επαναφορά Χαρακτήρων", + "INTERFACE_GUIDE_GREEN_FLAG": "{N, number} | Πράσινη Σημαία", + "INTERFACE_GUIDE_PAGES": "{N, number} | Σελίδες", + "INTERFACE_GUIDE_PROJECT_INFO": "{N, number} | Πληροφορίες για το Έργο", + "INTERFACE_GUIDE_UNDO_REDO": "{N, number} | Αναίρεση και Επανάληψη", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT": "{N, number} | Προγραμματιστικό Σενάριο", + "INTERFACE_GUIDE_PROGRAMMING_AREA": "{N, number} | Προγραμματιστική Περιοχή", + "INTERFACE_GUIDE_BLOCKS_PALETTE": "{N, number} | Παλέτα Κομματιών", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES": "{N, number} | Κατηγορίες Κομματιών", + "INTERFACE_GUIDE_CHARACTERS": "{N, number} | Χαρακτήρες", + "INTERFACE_GUIDE_SAVE_DESCRIPTION": "Αποθήκευση του τρέχοντος έργου και έξοδος στην Αρχική Σελίδα.", + "INTERFACE_GUIDE_STAGE_DESCRIPTION": "Εδώ εκτυλίσσεται η δράση του έργου. Για να διαγράψετε έναν χαρακτήρα, πατήστε πάνω του παρατεταμένα.", + "INTERFACE_GUIDE_PRESENTATION_MODE_DESCRIPTION": "Επέκτεινε το σκηνικό σε πλήρη οθόνη.", + "INTERFACE_GUIDE_GRID_DESCRIPTION": "Ενεργοποίησε (και απενεργοποίησε) το πλέγμα συντεταγμένων x-y.", + "INTERFACE_GUIDE_CHANGE_BG_DESCRIPTION": "Επίλεξε ή δημιούργησε μια εικόνα υποβάθρου για το σκηνικό.", + "INTERFACE_GUIDE_ADD_TEXT_DESCRIPTION": "Γράψε τίτλους και ετικέτες στο σκηνικό.", + "INTERFACE_GUIDE_RESET_CHAR_DESCRIPTION": "Επανάφερε όλους τους χαρακτήρες στις αρχικές τους θέσεις στο σκηνικό. (Σύρε τους χαρακτήρες για να ορίσεις νέες αρχικές θέσεις.)", + "INTERFACE_GUIDE_GREEN_FLAG_DESCRIPTION": "Ξεκίνα όλα τα προγραμματιστικά σενάρια που αρχίζουν με το κομμάτι \"Ξεκίνα με την Πράσινη Σημαία\" χτυπώντας εδώ.", + "INTERFACE_GUIDE_PAGES_DESCRIPTION": "Επίλεξε ανάμεσα στις σελίδες του έργου σου - ή πάτησε το σύμβολο συν για να προσθέσεις μια νέα σελίδα. Κάθε σελίδα έχει το δικό της σύνολο χαρακτήρων και ένα υπόβαθρο. Για να διαγράψεις μια σελίδα, την πιέζεις παρατεταμένα. Για να αλλάξεις τη σειρά των σελίδων, τις σύρεις σε νέες θέσεις.", + "INTERFACE_GUIDE_PROJECT_INFO_DESCRIPTION": "Άλλαξε τον τίτλο του έργου, δες πότε δημιουργήθηκε το έργο, και μοιράσου το έργο (αν υποστηρίζεται από τη συσκευή σου).", + "INTERFACE_GUIDE_UNDO_REDO_DESCRIPTION": "Αν κάνεις ένα λάθος, πάτησε Αναίρεση για να πας πίσω στο χρόνο, αντιστρέφοντας την τελευταία ενέργεια. Πάτησε Επανάληψη για να αντιστρέψεις την τελευταία Αναίρεση.", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT_DESCRIPTION": "Ένωσε κομμάτια μαζί για να φτιάξεις ένα προγραμματιστικό σενάριο, που να λέει στον χαρακτήρα τι να κάνει. Χτύπα οπουδήποτε πάνω στο σενάριο για να το κάνεις να εκτελεστεί. Για να διαγράψεις ένα κομμάτι ή ένα σενάριο, το σύρεις εκτός της προγραμματιστικής περιοχής. Για να αντιγράψεις ένα κομμάτι ή ένα σενάριο από έναν χαρακτήρα σε έναν άλλον, το σύρεις πάνω στη μικρογραφία του χαρακτήρα.", + "INTERFACE_GUIDE_PROGRAMMING_AREA_DESCRIPTION": "Εδώ συνδέεις προγραμματιστικά κομμάτια για να δημιουργήσεις σενάρια, που να λένε στον χαρακτήρα τι να κάνει.", + "INTERFACE_GUIDE_BLOCKS_PALETTE_DESCRIPTION": "Αυτός είναι ο κατάλογος των προγραμματιστικών κομματιών. Σύρε ένα κομμάτι μέσα στην προγραμματιστική περιοχή, έπειτα χτύπα πάνω του για να δεις τι κάνει.", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES_DESCRIPTION": "Εδώ μπορείς να επιλέξεις μια κατηγορία προγραμματιστικών κομματιών: Κομμάτια Πυροδότησης (Κίτρινα), Κίνησης (Μπλε), Όψεων (Μωβ), Ήχων (Πράσινα), Ελέγχου (Πορτοκαλί), Κομμάτια Τέλους (Κόκκινα).", + "INTERFACE_GUIDE_CHARACTERS_DESCRIPTION": "Επίλεξε από τους χαρακτήρες στο έργο σου - ή χτύπα το σύμβολο συν για να προσθέσεις έναν νέο χαρακτήρα. Όταν ένας χαρακτήρας επιλεγεί, μπορείς να επεξεργαστείς τα σενάριά του, να χτυπήσεις το όνομά του για να του αλλάξεις όνομα, ή να χτυπήσεις το πινέλο για να επεξεργαστείς την εικόνα του. Για να διαγράψεις έναν χαρακτήρα, τον πιέζεις παρατεταμένα. Για να αντιγράψεις έναν χαρακτήρα σε μια άλλη σελίδα, σύρε τον πάνω στη μικρογραφία της σελίδας.", + "PAINT_GUIDE_UNDO": "{N, number} | Αναίρεση", + "PAINT_GUIDE_REDO": "{N, number} | Επανάληψη", + "PAINT_GUIDE_SHAPE": "{N, number} | Σχήμα", + "PAINT_GUIDE_CHARACTER_NAME": "{N, number} | Όνομα Χαρακτήρα", + "PAINT_GUIDE_CUT": "{N, number} | Αποκοπή", + "PAINT_GUIDE_DUPLICATE": "{N, number} | Διπλασιασμός", + "PAINT_GUIDE_ROTATE": "{N, number} | Περιστροφή", + "PAINT_GUIDE_DRAG": "{N, number} | Σύρε", + "PAINT_GUIDE_SAVE": "{N, number} | Αποθήκευση", + "PAINT_GUIDE_FILL": "{N, number} | Γέμισμα", + "PAINT_GUIDE_CAMERA": "{N, number} | Κάμερα", + "PAINT_GUIDE_COLOR": "{N, number} | Χρώμα", + "PAINT_GUIDE_LINE_WIDTH": "{N, number} | Πάχος Γραμμής", + "PAINT_GUIDE_UNDO_DESCRIPTION": "Αναιρεί την πιο πρόσφατη αλλαγή.", + "PAINT_GUIDE_REDO_DESCRIPTION": "Αναιρεί την πιο πρόσφατη Αναίρεση.", + "PAINT_GUIDE_SHAPE_DESCRIPTION": "Διάλεξε ένα σχήμα για να σχεδιάσεις: γραμμή, κύκλος/έλλειψη, ορθογώνιο, ή τρίγωνο.", + "PAINT_GUIDE_CHARACTER_NAME_DESCRIPTION": "Επεξεργάσου το όνομα του χαρακτήρα.", + "PAINT_GUIDE_CUT_DESCRIPTION": "Αφού επιλέξεις το εργαλείο Αποκοπή, μπορείς να χτυπήσεις πάνω σε έναν χαρακτήρα ή ένα σχήμα για να το αφαιρέσεις από τον καμβά.", + "PAINT_GUIDE_DUPLICATE_DESCRIPTION": "Αφού επιλέξεις το εργαλείο Διπλασιασμός, μπορείς να χτυπήσεις πάνω σε έναν χαρακτήρα ή ένα σχήμα για να δημιουργήσεις ένα αντίγραφό του.", + "PAINT_GUIDE_ROTATE_DESCRIPTION": "Αφού επιλέξεις το εργαλείο Περιστροφή, μπορείς να περιστρέψεις έναν χαρακτήρα ή ένα σχήμα γύρω από το κέντρο του.", + "PAINT_GUIDE_DRAG_DESCRIPTION": "Αφού επιλέξεις το εργαλείο Σύρε, μπορείς να σύρεις έναν χαρακτήρα ή ένα σχήμα πάνω στον καμβά. Αν χτυπήσεις πάνω σε ένα σχήμα, τότε μπορείς να επεξεργαστείς το σχήμα σύροντας τις τελείες που εμφανίζονται.", + "PAINT_GUIDE_SAVE_DESCRIPTION": "Αποθήκευσε τις αλλαγές και αποχώρησε από τη Ζωγραφική.", + "PAINT_GUIDE_FILL_DESCRIPTION": "Αφού επιλέξεις το εργαλείο Γέμισμα, μπορείς να χτυπήσεις οπουδήποτε πάνω σε έναν χαρακτήρα ή ένα σχήμα για να το(ν) γεμίσεις με το τρέχον επιλεγμένο χρώμα.", + "PAINT_GUIDE_CAMERA_DESCRIPTION": "Αφού επιλέξεις το εργαλείο Κάμερα, μπορείς να χτυπήσεις οπουδήποτε πάνω σε έναν χαρακτήρα ή ένα σχήμα, και έπειτα να χτυπήσεις το κουμπί της κάμερας για να γεμίσεις την περιοχή με μια νέα φωτογραφία που έβγαλες με την κάμερα.", + "PAINT_GUIDE_COLOR_DESCRIPTION": "Επίλεξε ένα νέο χρώμα να χρησιμοποιήσεις για σχεδίαση και γέμισμα σχημάτων.", + "PAINT_GUIDE_LINE_WIDTH_DESCRIPTION": "Άλλαξε το πάχος των γραμμών στα σχήματα που σχεδιάζεις.", + "SAMPLE_Under the sea": "Στον βυθό της θάλασσας", + "SAMPLE_Farm": "Αγρόκτημα", + "SAMPLE_Seasons": "Εποχές", + "SAMPLE_Friends": "Φίλοι", + "SAMPLE_Dance": "Χορός", + "SAMPLE_Animal Race": "Αγώνα Ταχύτητας με Ζώα", + "SAMPLE_Bump": "Σύγκρουση", + "SAMPLE_Quick Intro": "Γρήγορη Εισαγωγή", + "SAMPLE_Star": "Αστέρι", + "SAMPLE_TEXT_key_character_cat": "Γάτα", + "SAMPLE_TEXT_key_character_star": "Αστέρι", + "SAMPLE_TEXT_key_character_teen_girl": "Έφηβος", + "SAMPLE_TEXT_key_character_teen_boy": "Έφηβος", + "SAMPLE_TEXT_key_farm_tap_them": "Χτύπα τα", + "SAMPLE_TEXT_key_party_question": "Πάρτυ;", + "SAMPLE_TEXT_key_soccer_question": "Ή ποδόφαιρο;", + "SAMPLE_TEXT_key_goal": "Γκολ!!!", + "SAMPLE_TEXT_key_under_the_sea_fish": "Ψάρι", + "SAMPLE_TEXT_key_under_the_sea_seahorse": "Ιππόκαμπος", + "SAMPLE_TEXT_key_under_the_sea_starfish": "Αστερίας", + "SAMPLE_TEXT_key_farm_pig": "Γουρούνι", + "SAMPLE_TEXT_key_farm_horse": "Άλογο", + "SAMPLE_TEXT_key_farm_chicken": "Κοτόπουλο", + "SAMPLE_TEXT_key_farm_barn": "Αχυρώνας", + "SAMPLE_TEXT_key_seasons_summer": "Καλοκαίρι", + "SAMPLE_TEXT_key_seasons_fall": "Φθινόπωρο", + "SAMPLE_TEXT_key_seasons_winter": "Χειμώνας", + "SAMPLE_TEXT_key_seasons_spring": "Άνοιξη", + "SAMPLE_TEXT_key_friends_cake": "Τούρτα", + "SAMPLE_TEXT_key_friends_soccer_ball": "Μπάλα ποδοσφαίρου", + "SAMPLE_TEXT_key_friends_child": "Παιδί", + "SAMPLE_TEXT_key_friends_table": "Τραπέζι", + "SAMPLE_TEXT_key_friends_soccer_net": "Δίχτυ ποδοσφαίρου", + "SAMPLE_TEXT_key_animalrace_elephant": "Ελέφαντας", + "SAMPLE_TEXT_key_animalrace_giraffe": "Καμηλοπάρδαλη", + "SAMPLE_TEXT_key_animalrace_monkey": "Μαϊμού", + "SAMPLE_TEXT_key_dance_scubadiver": "Δύτης", + "SAMPLE_TEXT_key_dance_snake": "Φίδι", + "SAMPLE_TEXT_key_bump_yellow_duck": "Κίτρινη Πάπια", + "SAMPLE_TEXT_key_bump_blue_duck": "Μπλε Πάπια", + "SAMPLE_TEXT_key_bump_green_duck": "Πράσινη Πάπια", + "SAMPLE_TEXT_key_quickintro_fish": "Ψάρι", + "SAMPLE_TEXT_key_quickintro_toc": "Τοκ", + "CHARACTER_Cat.svg": "Γάτα", + "CHARACTER_Cat2.svg": "Γάτα που Περπατάει", + "CHARACTER_Blue.svg": "Τικ", + "CHARACTER_Purple.svg": "Τακ", + "CHARACTER_Red.svg": "Τοκ", + "CHARACTER_Dragon.svg": "Δράκος", + "CHARACTER_Fairy.svg": "Νεράιδα", + "CHARACTER_Wizard.svg": "Μάγος", + "CHARACTER_Dog.svg": "Σκύλος", + "CHARACTER_Rabbit.svg": "Κουνέλι", + "CHARACTER_Chicken.svg": "Κοτόπουλο", + "CHARACTER_Pig.svg": "Γουρούνι", + "CHARACTER_Horse.svg": "Άλογο", + "CHARACTER_Zebra.svg": "Ζέβρα", + "CHARACTER_Monkey.svg": "Μαϊμού", + "CHARACTER_Elephant.svg": "Ελέφαντας", + "CHARACTER_Giraffe.svg": "Καμηλοπάρδαλη", + "CHARACTER_Camel.svg": "Καμήλα", + "CHARACTER_Butterfly.svg": "Πεταλούδα", + "CHARACTER_Fly.svg": "Μύγα", + "CHARACTER_Bat.svg": "Νυχτερίδα", + "CHARACTER_Bird.svg": "Πουλί", + "CHARACTER_Snake.svg": "Φίδι", + "CHARACTER_Lizard.svg": "Σαύρα", + "CHARACTER_Frog.svg": "Βάτραχος", + "CHARACTER_Duck.svg": "Πάπια", + "CHARACTER_Crab.svg": "Καβούρι", + "CHARACTER_Seahorse.svg": "Ιππόκαμπος", + "CHARACTER_Starfish.svg": "Αστερίας", + "CHARACTER_Fish1.svg": "Ψάρι", + "CHARACTER_Fish2.svg": "Ψάρι", + "CHARACTER_Whale.svg": "Φάλαινα", + "CHARACTER_Penguin.svg": "Πιγκουίνος", + "CHARACTER_PolarBear.svg": "Πολική Αρκούδα", + "CHARACTER_Girl1.svg": "Παιδί", + "CHARACTER_Girl2.svg": "Παιδί", + "CHARACTER_Girl3.svg": "Παιδί", + "CHARACTER_Boy1.svg": "Παιδί", + "CHARACTER_Boy2.svg": "Παιδί", + "CHARACTER_Boy3.svg": "Παιδί", + "CHARACTER_TeenGirl1.svg": "Έφηβος", + "CHARACTER_TeenGirl2.svg": "Έφηβος", + "CHARACTER_TeenGirl3.svg": "Έφηβος", + "CHARACTER_TeenBoy1.svg": "Έφηβος", + "CHARACTER_TeenBoy2.svg": "Έφηβος", + "CHARACTER_TeenBoy3.svg": "Έφηβος", + "CHARACTER_Baby.svg": "Μωρό", + "CHARACTER_Mother.svg": "Μητέρα ", + "CHARACTER_Father.svg": "Πατέρας", + "CHARACTER_Grandmother.svg": "Γιαγιά", + "CHARACTER_Grandfather.svg": "Παππούς", + "CHARACTER_Girl.svg": "Παιδί", + "CHARACTER_Boy.svg": "Παιδί", + "CHARACTER_Teen2.svg": "Έφηβος", + "CHARACTER_Teen3.svg": "Έφηβος", + "CHARACTER_Farmer1.svg": "Ιδιοκτήτης αγροκτήματος", + "CHARACTER_Farmer.svg": "Ιδιοκτήτης αγροκτήματος", + "CHARACTER_Bike2.svg": "Ποδηλάτης", + "CHARACTER_Bike.svg": "Ποδηλάτης", + "CHARACTER_Car2.svg": "Οδηγός", + "CHARACTER_Car1.svg": "Οδηγός", + "CHARACTER_Aeroplane.svg": "Πιλότος", + "CHARACTER_Astronaut.svg": "Αστροναύτης", + "CHARACTER_Inuit.svg": "Βόρειος", + "CHARACTER_Scubadiver.svg": "Δύτης", + "CHARACTER_Rowboat.svg": "Κωπηλάτης", + "CHARACTER_Tree1.svg": "Δέντρο", + "CHARACTER_Tree3.svg": "Δέντρο", + "CHARACTER_Tree4.svg": "Δέντρο", + "CHARACTER_Evergreen.svg": "Δέντρο", + "CHARACTER_Weed.svg": "Φυτό", + "CHARACTER_Pasture.svg": "Ψηλό Χορτάρι", + "CHARACTER_Cactus.svg": "Κάκτος", + "CHARACTER_Daffodil.svg": "Νάρκισσοι", + "CHARACTER_Daisy1.svg": "Μαργαρίτα", + "CHARACTER_Daisy2.svg": "Μαργαρίτα", + "CHARACTER_Daisy3.svg": "Μαργαρίτα", + "CHARACTER_Tulip2.svg": "Τουλίπα", + "CHARACTER_Flowers.svg": "Λουλούδια", + "CHARACTER_Apple.svg": "Μήλο", + "CHARACTER_Peach.svg": "Ροδάκινο", + "CHARACTER_Mushroom.svg": "Μανιτάρι", + "CHARACTER_Star.svg": "Αστέρι", + "CHARACTER_Star2.svg": "Αστέρι", + "CHARACTER_Star3.svg": "Αστέρι", + "CHARACTER_ShootingStar.svg": "Πεφταστέρι", + "CHARACTER_Earth.svg": "Γη", + "CHARACTER_Planet.svg": "Πλανήτης", + "CHARACTER_Sun.svg": "Ήλιος", + "CHARACTER_Moon.svg": "Πανσέληνος", + "CHARACTER_CrescentMoon.svg": "Φεγγάρι", + "CHARACTER_Cloud1.svg": "Σύννεφο", + "CHARACTER_Thundercloud.svg": "Σύννεφο Καταιγίδας", + "CHARACTER_Tornado.svg": "Ανεμοστρόβιλος", + "CHARACTER_Barn.svg": "Αχυρώνας", + "CHARACTER_Fort.svg": "Φρούριο", + "CHARACTER_Castle.svg": "Κάστρο", + "CHARACTER_Igloo.svg": "Ιγκλού", + "CHARACTER_House1.svg": "Σπίτι", + "CHARACTER_House.svg": "Σπίτι", + "CHARACTER_House3.svg": "Σπίτι", + "CHARACTER_House4.svg": "Σπίτι", + "CHARACTER_Apartment.svg": "Διαμέρισμα", + "CHARACTER_School.svg": "Σχολείο", + "CHARACTER_Shop.svg": "Κατάστημα", + "CHARACTER_Fence.svg": "Φράχτης", + "CHARACTER_Mailbox.svg": "Γραμματοκιβώτιο", + "CHARACTER_Cake.svg": "Τούρτα", + "CHARACTER_Ball.svg": "Μπάλα", + "CHARACTER_Basketball.svg": "Μπάλα Μπάσκετ", + "CHARACTER_Soccerball.svg": "Μπάλα Ποδοσφαίρου", + "CHARACTER_SoccerNet.svg": "Δίχτυ Ποδοσφαίρου", + "CHARACTER_Bed.svg": "Κρεβάτι", + "CHARACTER_NightTable.svg": "Κομοδίνο", + "CHARACTER_Stool.svg": "Σκαμνί", + "CHARACTER_Table.svg": "Τραπέζι", + "CHARACTER_Car.svg": "Αυτοκίνητο", + "CHARACTER_Bus.svg": "Λεωφορείο", + "CHARACTER_SailBoat.svg": "Βάρκα", + "CHARACTER_Boat2.svg": "Βάρκα", + "CHARACTER_Rocket.svg": "Πύραυλος", + "BACKGROUND_Farm.svg": "Αγρόκτημα", + "BACKGROUND_Park.svg": "Πάρκο", + "BACKGROUND_Suburbs.svg": "Προάστεια", + "BACKGROUND_City.svg": "Πόλη", + "BACKGROUND_Library.svg": "Βιβλιοθήκη", + "BACKGROUND_Classroom.svg": "Σχολική Αίθουσα", + "BACKGROUND_Theatre.svg": "Θέατρο", + "BACKGROUND_Gym.svg": "Γυμναστήριο", + "BACKGROUND_Gym2.svg": "Γυμναστήριο", + "BACKGROUND_Bedroom.svg": "Υπνοδωμάτιο", + "BACKGROUND_EmptyRoom.svg": "Άδειο Δωμάτιο", + "BACKGROUND_Summer.svg": "Καλοκαίρι", + "BACKGROUND_Fall.svg": "Φθινόπωρο", + "BACKGROUND_Winter.svg": "Χειμώνας", + "BACKGROUND_Spring.svg": "Άνοιξη", + "BACKGROUND_Creek.svg": "Ποτάμι", + "BACKGROUND_Lake.svg": "Λίμνη", + "BACKGROUND_Woods.svg": "Δάσος", + "BACKGROUND_BeachDay.svg": "Ημέρα στην Παραλία", + "BACKGROUND_BeachSunrise.svg": "Ηλιοβασίλεμα στην Παραλία", + "BACKGROUND_BeachNight.svg": "Νύχτα στην Παραλία", + "BACKGROUND_Underwater.svg": "Βυθός", + "BACKGROUND_Jungle.svg": "Ζούγκλα", + "BACKGROUND_Savannah.svg": "Σαβάνα", + "BACKGROUND_Desert.svg": "Έρημος", + "BACKGROUND_Arctic.svg": "Αρκτική", + "BACKGROUND_Space.svg": "Διάστημα", + "BACKGROUND_MoonBkg.svg": "Φεγγάρι", + "BLOCK_DESC_GREEN_FLAG": "ΞΕΚΙΝΑ ΜΕ ΤΗΝ ΠΡΑΣΙΝΗ ΣΗΜΑΙΑ", + "BLOCK_DESC_ON_TAP": "ΞΕΚΙΝΑ ΜΕ ΤΟ ΧΤΥΠΗΜΑ {CHARACTER_NAME}", + "BLOCK_DESC_ON_BUMP": "ΞΕΚΙΝΑ ΜΕ ΤΗ ΣΥΓΚΡΟΥΣΗ {CHARACTER_NAME}", + "BLOCK_DESC_MESSAGE_COLOR_ORANGE": "Πορτοκαλί", + "BLOCK_DESC_ON_MESSAGE": "ΞΕΚΙΝΗΣΕ ΜΕ ΤΟ {COLOR} ΜΗΝΥΜΑ", + "BLOCK_DESC_SEND_MESSAGE": "ΣΤΕΙΛΕ {COLOR} ΜΗΝΥΜΑ ΕΚΚΙΝΗΣΗΣ", + "BLOCK_DESC_MOVE_RIGHT": "ΚΙΝΗΣΟΥ ΔΕΞΙΑ", + "BLOCK_DESC_MOVE_LEFT": "ΚΙΝΗΣΟΥ ΑΡΙΣΤΕΡΑ", + "BLOCK_DESC_MOVE_UP": "ΚΙΝΗΣΟΥ ΠΑΝΩ", + "BLOCK_DESC_MOVE_DOWN": "ΚΙΝΗΣΟΥ ΚΑΤΩ", + "BLOCK_DESC_TURN_RIGHT": "ΣΤΡΙΨΕ ΔΕΞΙΑ", + "BLOCK_DESC_TURN_LEFT": "ΣΤΡΙΨΕ ΑΡΙΣΤΕΡΑ", + "BLOCK_DESC_HOP": "ΠΗΔΑ", + "BLOCK_DESC_GO_HOME": "ΠΗΓΑΙΝΕ ΣΤΗΝ ΑΡΧΗ", + "BLOCK_DESC_SAY": "ΠΕΣ", + "BLOCK_DESC_GROW": "ΜΕΓΑΛΩΣΕ", + "BLOCK_DESC_SHRINK": "ΜΙΚΡΥΝΕ", + "BLOCK_DESC_RESET_SIZE": "ΕΠΑΝΑΦΕΡΕ ΜΕΓΕΘΟΣ", + "BLOCK_DESC_HIDE": "ΕΞΑΦΑΝΙΣΟΥ", + "BLOCK_DESC_SHOW": "ΕΜΦΑΝΙΣΟΥ", + "BLOCK_DESC_PLAY_SOUND": "ΠΑΙΞΕ {SOUND_NAME}", + "BLOCK_DESC_PLAY_SOUND_POP": "ποπ", + "BLOCK_DESC_PLAY_RECORDED_SOUND": "ΠΑΙΞΕ ΗΧΟΓΡΑΦΗΜΕΝΟ ΗΧΟ", + "BLOCK_DESC_WAIT": "ΠΕΡΙΜΕΝΕ", + "BLOCK_DESC_STOP": "ΣΤΑΜΑΤΗΣΕ ΤΟ {CHARACTER_NAME}", + "BLOCK_DESC_SET_SPEED": "ΟΡΙΣΕ ΤΑΧΥΤΗΤΑ", + "BLOCK_DESC_REPEAT": "ΕΠΑΝΑΛΑΒΕ", + "BLOCK_DESC_END": "ΤΕΛΟΣ", + "BLOCK_DESC_REPEAT_FOREVER": "ΕΠΑΝΑΛΑΒΕ ΓΙΑ ΠΑΝΤΑ", + "BLOCK_DESC_GO_TO_PAGE": "ΠΗΓΑΙΝΕ ΣΤΗ ΣΕΛΙΔΑ {PAGE}", + "SHARING_BY_EMAIL": "Μοιράσου μέσω Ηλεκτρονικού ταχυδρομείου", + "SHARING_BY_AIRDROP": "Μοιράσου μέσω Airdrop", + "SHARING_EMAIL_SUBJECT": "Εργασία ScratchJr: {PROJECT_NAME}", + "SHARING_EMAIL_TEXT": "Κάνε κλικ στο εικονίδιο για να δοκιμάσεις το ScratchJr Έργο μου στο iPad ή το Android tablet σου!

Αν δεν έχεις την εφαρμογή ScratchJr, μπορείς να την καταβέσεις από το Apple App Store ή το Google Play Store.

Με το ScratchJr, τα παιδιά μπορούν να δημιουργήσουν τις δικές τους διαδραστικές ιστορίες και παιχνίδια. Για να μάθεις περισσότερα, δες το scratchjr.org.", + "FOR_PARENTS": "Για Γονείς", + "PARENTAL_GATE_EXPLANATION": "Γιατί το ρωτάμε αυτό; Επειδή ένας ενήλικας πρέπει να εγκρίνει τον διαμοιρασμό στο διαδίκτυο. ", + "GRID_NUMBER": "{N, number}", + "NEW_PROJECT_PREFIX": "Έργο", + "LIBRARY_CHARACTER": "Χαρακτήρας", + "LIBRARY_BACKGROUND": "Υπόβαθρο", + "SAY_BLOCK_DEFAULT_ARGUMENT": "γεια", + "ALERT_BACK": "Πίσω", + "ALERT_SAVING": "Γίνεται αποθήκευση...", + "SELECT_LANGUAGE": "Επίλεξε γλώσσα", + "USAGE_QUESTION": "Πού χρησιμοποιείτε το ScratchJr;", + "USAGE_SCHOOL": "Σχολείο", + "USAGE_HOME": "Σπίτι", + "USAGE_OTHER": "Άλλο", + "USAGE_NONE": "Να μην ερωτηθώ ξανά" +} \ No newline at end of file diff --git a/editions/free/src/localizations/es.json b/editions/free/src/localizations/es.json index 6fb35f5e..87a3ce28 100644 --- a/editions/free/src/localizations/es.json +++ b/editions/free/src/localizations/es.json @@ -168,7 +168,7 @@ "SAMPLE_TEXT_key_friends_soccer_ball": "Pelota de fútbol", "SAMPLE_TEXT_key_friends_child": "Niño", "SAMPLE_TEXT_key_friends_table": "Mesa", - "SAMPLE_TEXT_key_friends_soccer_net": "Arco de fútbol ", + "SAMPLE_TEXT_key_friends_soccer_net": "Arco de fútbol", "SAMPLE_TEXT_key_animalrace_elephant": "Elefante", "SAMPLE_TEXT_key_animalrace_giraffe": "Jirafa", "SAMPLE_TEXT_key_animalrace_monkey": "Mono", diff --git a/editions/free/src/localizations/fr.json b/editions/free/src/localizations/fr.json index b026c2ae..3bccb03a 100644 --- a/editions/free/src/localizations/fr.json +++ b/editions/free/src/localizations/fr.json @@ -100,14 +100,14 @@ "INTERFACE_GUIDE_GRID_DESCRIPTION": "Active (et désactive) la grille avec les axes x et y.", "INTERFACE_GUIDE_CHANGE_BG_DESCRIPTION": "Sélectionne ou crée une image de fond pour la scène.", "INTERFACE_GUIDE_ADD_TEXT_DESCRIPTION": "Ajoute des titres et des textes sur la scène.", - "INTERFACE_GUIDE_RESET_CHAR_DESCRIPTION": "Remet tous les personnages à leur position initiale sur la scène. Pour attribuer une nouvelle position de départ à un personnage, fais-le glisser. ", + "INTERFACE_GUIDE_RESET_CHAR_DESCRIPTION": "Remet tous les personnages à leur position initiale sur la scène. Pour attribuer une nouvelle position de départ à un personnage, fais-le glisser.", "INTERFACE_GUIDE_GREEN_FLAG_DESCRIPTION": "En touchant ce bouton, tu démarres tous les scripts qui commencent par le bloc Démarrer avec le Drapeau vert.", "INTERFACE_GUIDE_PAGES_DESCRIPTION": "Sélectionne l'une des pages de ton projet. Touche le signe plus pour ajouter une nouvelle page. Chaque page a un ensemble de personnages et un fond propres. Pour supprimer une page, appuie longuement dessus. Pour réorganiser les pages, fais-les glisser vers leurs nouvelles positions.", - "INTERFACE_GUIDE_PROJECT_INFO_DESCRIPTION": "Change le titre de ton projet, consulte sa date de création et partage-le (si ton appareil le permet). ", - "INTERFACE_GUIDE_UNDO_REDO_DESCRIPTION": "Si tu fais une erreur, touche le bouton Annuler pour revenir en arrière, juste avant ta dernière action. Touche le bouton Rétablir pour refaire la dernière action que tu as annulée. ", + "INTERFACE_GUIDE_PROJECT_INFO_DESCRIPTION": "Change le titre de ton projet, consulte sa date de création et partage-le (si ton appareil le permet).", + "INTERFACE_GUIDE_UNDO_REDO_DESCRIPTION": "Si tu fais une erreur, touche le bouton Annuler pour revenir en arrière, juste avant ta dernière action. Touche le bouton Rétablir pour refaire la dernière action que tu as annulée.", "INTERFACE_GUIDE_PROGRAMMING_SCRIPT_DESCRIPTION": "Emboîte des blocs pour créer un script indiquant au personnage ce qu'il doit faire. Touche n'importe où sur le script pour le démarrer. Pour supprimer un bloc ou un script, fais-le glisser en dehors de la zone de programmation. Pour copier un bloc ou un script d'un personnage à un autre, fais-le glisser sur la miniature du personnage.", "INTERFACE_GUIDE_PROGRAMMING_AREA_DESCRIPTION": "C'est à cet endroit que tu associes des blocs de programmation pour créer des scripts indiquant au personnage ce qu'il doit faire.", - "INTERFACE_GUIDE_BLOCKS_PALETTE_DESCRIPTION": "C'est le menu des blocs de programmation. Fais glisser un bloc vers la zone de programmation, puis touche-le pour voir ce qu'il fait. ", + "INTERFACE_GUIDE_BLOCKS_PALETTE_DESCRIPTION": "C'est le menu des blocs de programmation. Fais glisser un bloc vers la zone de programmation, puis touche-le pour voir ce qu'il fait.", "INTERFACE_GUIDE_BLOCKS_CATEGORIES_DESCRIPTION": "À cet endroit, tu peux sélectionner une catégorie de blocs de programmation : les blocs de démarrage (en jaune), de mouvement (en bleu), d'apparence (en violet), de sons (en vert), de contrôle (en orange) et de fin (en rouge).", "INTERFACE_GUIDE_CHARACTERS_DESCRIPTION": "Sélectionne un personnage dans ton projet ou touche le signe plus pour en ajouter un nouveau. Une fois que tu as sélectionné un personnage, tu peux modifier ses scripts, toucher son nom pour le renommer ou toucher le pinceau pour modifier son image. Pour supprimer un personnage, appuie longuement dessus. Pour copier un personnage vers une autre page, fais-le glisser sur la miniature de celle-ci.", "PAINT_GUIDE_UNDO": "{N, number} | Annuler", @@ -127,10 +127,10 @@ "PAINT_GUIDE_REDO_DESCRIPTION": "Rétablit la dernière annulation.", "PAINT_GUIDE_SHAPE_DESCRIPTION": "Choisit la forme à dessiner : ligne, cercle, rectangle ou triangle.", "PAINT_GUIDE_CHARACTER_NAME_DESCRIPTION": "Modifie le nom du personnage.", - "PAINT_GUIDE_CUT_DESCRIPTION": "Si tu sélectionnes l'outil Couper, tu peux toucher un personnage ou une forme à supprimer de la grille. ", - "PAINT_GUIDE_DUPLICATE_DESCRIPTION": "Si tu sélectionnes l'outil Dupliquer, tu peux toucher un personnage ou une forme pour en faire une copie. ", + "PAINT_GUIDE_CUT_DESCRIPTION": "Si tu sélectionnes l'outil Couper, tu peux toucher un personnage ou une forme à supprimer de la grille.", + "PAINT_GUIDE_DUPLICATE_DESCRIPTION": "Si tu sélectionnes l'outil Dupliquer, tu peux toucher un personnage ou une forme pour en faire une copie.", "PAINT_GUIDE_ROTATE_DESCRIPTION": "Si tu sélectionnes l'outil Rotation, tu peux faire pivoter un personnage ou une forme sur lui-même.", - "PAINT_GUIDE_DRAG_DESCRIPTION": "Si tu sélectionnes l'outil Glisser, tu peux faire glisser un personnage ou une forme le long de la grille. Si tu touches une forme, tu peux la modifier en faisant glisser les points qui apparaissent. ", + "PAINT_GUIDE_DRAG_DESCRIPTION": "Si tu sélectionnes l'outil Glisser, tu peux faire glisser un personnage ou une forme le long de la grille. Si tu touches une forme, tu peux la modifier en faisant glisser les points qui apparaissent.", "PAINT_GUIDE_SAVE_DESCRIPTION": "Enregistrer les modifications et quitter l'éditeur graphique.", "PAINT_GUIDE_FILL_DESCRIPTION": "Une fois que tu as sélectionné l'outil Remplir, touche une zone d'un personnage ou d'une forme pour la remplir avec la couleur choisie.", "PAINT_GUIDE_CAMERA_DESCRIPTION": "Une fois que tu as sélectionné l'outil Appareil photo, touche une zone d'un personnage ou d'une forme, puis touche le bouton Appareil photo pour prendre une photo et remplir la zone sélectionnée.", @@ -215,13 +215,13 @@ "CHARACTER_PolarBear.svg": "Ours polaire", "CHARACTER_Girl1.svg": "Enfant", "CHARACTER_Girl2.svg": "Enfant", - "CHARACTER_Girl3.svg": "Enfant ", - "CHARACTER_Boy1.svg": "Enfant ", - "CHARACTER_Boy2.svg": "Enfant ", - "CHARACTER_Boy3.svg": "Enfant ", + "CHARACTER_Girl3.svg": "Enfant", + "CHARACTER_Boy1.svg": "Enfant", + "CHARACTER_Boy2.svg": "Enfant", + "CHARACTER_Boy3.svg": "Enfant", "CHARACTER_TeenGirl1.svg": "Adolescente", - "CHARACTER_TeenGirl2.svg": "Adolescente ", - "CHARACTER_TeenGirl3.svg": "Adolescente ", + "CHARACTER_TeenGirl2.svg": "Adolescente", + "CHARACTER_TeenGirl3.svg": "Adolescente", "CHARACTER_TeenBoy1.svg": "Adolescent", "CHARACTER_TeenBoy2.svg": "Adolescent", "CHARACTER_TeenBoy3.svg": "Adolescent", @@ -332,8 +332,8 @@ "BLOCK_DESC_ON_TAP": "DÉMARRER LORSQU'ON TOUCHE LE PERSONNAGE {CHARACTER_NAME}", "BLOCK_DESC_ON_BUMP": "DÉMARRER LORSQUE JE ({CHARACTER_NAME}) SUIS TOUCHÉ", "BLOCK_DESC_MESSAGE_COLOR_ORANGE": "Orange", - "BLOCK_DESC_ON_MESSAGE": "DÉMARRER LORSQUE JE REÇOIS LE MESSAGE {COLOR} ", - "BLOCK_DESC_SEND_MESSAGE": "ENVOYER UN MESSAGE {COLOR} ", + "BLOCK_DESC_ON_MESSAGE": "DÉMARRER LORSQUE JE REÇOIS LE MESSAGE {COLOR}", + "BLOCK_DESC_SEND_MESSAGE": "ENVOYER UN MESSAGE {COLOR}", "BLOCK_DESC_MOVE_RIGHT": "DÉPLACER VERS LA DROITE", "BLOCK_DESC_MOVE_LEFT": "DÉPLACER VERS LA GAUCHE", "BLOCK_DESC_MOVE_UP": "DÉPLACER VERS LE HAUT", @@ -357,7 +357,7 @@ "BLOCK_DESC_REPEAT": "RÉPÉTER", "BLOCK_DESC_END": "FIN", "BLOCK_DESC_REPEAT_FOREVER": "RÉPÉTER INDÉFINIMENT", - "BLOCK_DESC_GO_TO_PAGE": "ALLER À LA PAGE {PAGE} ", + "BLOCK_DESC_GO_TO_PAGE": "ALLER À LA PAGE {PAGE}", "SHARING_BY_EMAIL": "Partage par courriel", "SHARING_BY_AIRDROP": "Partage via Airdrop", "SHARING_EMAIL_SUBJECT": "Projet ScratchJr : {PROJECT_NAME}", diff --git a/editions/free/src/localizations/it.json b/editions/free/src/localizations/it.json index 7b6beb39..8b1e3b00 100644 --- a/editions/free/src/localizations/it.json +++ b/editions/free/src/localizations/it.json @@ -78,7 +78,7 @@ "BLOCKS_GO_TO_PAGE": "Vai alla Pagina", "BLOCKS_GO_TO_PAGE_DESCRIPTION": "Si sposta alla pagina specificata del progetto.", "INTERFACE_GUIDE_NUMBER": "{N, number}", - "INTERFACE_GUIDE_SAVE": "{N, number} | Salva ", + "INTERFACE_GUIDE_SAVE": "{N, number} | Salva", "INTERFACE_GUIDE_STAGE": "{N, number} | Stage", "INTERFACE_GUIDE_PRESENTATION_MODE": "{N, number} | Modalità Presentazione", "INTERFACE_GUIDE_GRID": "{N, number} | Griglia", @@ -362,6 +362,7 @@ "SHARING_BY_AIRDROP": "Condividi via Airdrop", "SHARING_EMAIL_SUBJECT": "Progetto ScratchJr: {PROJECT_NAME}", "SHARING_EMAIL_TEXT": "Clicca sull'icona per provare il mio progetto ScratchJr sul tuo iPad o sul tuo tablet Android!

Se non hai l'app ScratchJr puoi scaricarla dall'App store della Apple o dal Play Store di Google.

Con ScratchJr i bambini possono creare storie interattive e giochi. Per saperne di più vai alla pagina scratchjr.org.", + "FOR_PARENTS": "Per i Genitori", "PARENTAL_GATE_EXPLANATION": "Perché te lo chiediamo? Perché la condivisione online deve essere approvata da un adulto.", "GRID_NUMBER": "{N, number}", "NEW_PROJECT_PREFIX": "Progetto", diff --git a/editions/free/src/localizations/ja.json b/editions/free/src/localizations/ja.json index 74b08859..a7722a9f 100644 --- a/editions/free/src/localizations/ja.json +++ b/editions/free/src/localizations/ja.json @@ -4,7 +4,7 @@ "SAMPLE_PROJECTS": "ぷろじぇくとのれい", "ABOUT_SCRATCHJR": "ScratchJrについて", "INTERFACE_GUIDE": "がめんのせつめい", - "PAINT_EDITOR_GUIDE": "ぺいんとえでぃたーのせつめい ", + "PAINT_EDITOR_GUIDE": "ぺいんとえでぃたーのせつめい", "BLOCKS_GUIDE": "ぶろっくのせつめい", "ABOUT_WHAT_IS": "すくらっちじゅにあとは?", "ABOUT_DESCRIPTION": "スクラッチジュニアは小学校入学前後(5~7歳)の子供向けに開発された、自由に対話型の物語やゲームを創作するための入門用のプログラミング言語です。わかりやすい図形で表されたプログラミングブロックを組み合わせてキャラクターを動かし、ジャンプさせたり、ダンスさせたり、歌を歌わせたりすることができます。また、ペイントエディターでキャラクターを変えたり、声や音を追加したり、写真を挿入したりすることもできます。出来上がったキャラクターは、プログラミングブロックを使って生き生きと動かせます。", @@ -333,7 +333,7 @@ "BLOCK_DESC_ON_BUMP": "{CHARACTER_NAME}とぶつかったらすたーと", "BLOCK_DESC_MESSAGE_COLOR_ORANGE": "おれんじ", "BLOCK_DESC_ON_MESSAGE": "{COLOR} いろのめっせーじですたーと", - "BLOCK_DESC_SEND_MESSAGE": " {COLOR} いろのすたーとめっせーじをおくる", + "BLOCK_DESC_SEND_MESSAGE": "{COLOR} いろのすたーとめっせーじをおくる", "BLOCK_DESC_MOVE_RIGHT": "みぎにうごく", "BLOCK_DESC_MOVE_LEFT": "ひだりにうごく", "BLOCK_DESC_MOVE_UP": "うえにうごく", @@ -348,16 +348,16 @@ "BLOCK_DESC_RESET_SIZE": "おおきさをもとへもどす", "BLOCK_DESC_HIDE": "けす", "BLOCK_DESC_SHOW": "みせる", - "BLOCK_DESC_PLAY_SOUND": " {SOUND_NAME}をさいせい", + "BLOCK_DESC_PLAY_SOUND": "{SOUND_NAME}をさいせい", "BLOCK_DESC_PLAY_SOUND_POP": "ぽん", "BLOCK_DESC_PLAY_RECORDED_SOUND": "ろくおんしたおとをさいせい", "BLOCK_DESC_WAIT": "まつ", - "BLOCK_DESC_STOP": " {CHARACTER_NAME}をとめる", + "BLOCK_DESC_STOP": "{CHARACTER_NAME}をとめる", "BLOCK_DESC_SET_SPEED": "はやさをきめる", "BLOCK_DESC_REPEAT": "くりかえす", "BLOCK_DESC_END": "しゅうりょう", "BLOCK_DESC_REPEAT_FOREVER": "ずっとくりかえす", - "BLOCK_DESC_GO_TO_PAGE": " {PAGE}ぺーじへすすむ", + "BLOCK_DESC_GO_TO_PAGE": "{PAGE}ぺーじへすすむ", "SHARING_BY_EMAIL": "Eめーるで きょうゆうする", "SHARING_BY_AIRDROP": "えあどろっぷで きょうゆうする", "SHARING_EMAIL_SUBJECT": "すくらっちじゅにあ ぷろじぇくと: {PROJECT_NAME}", diff --git a/editions/free/src/localizations/no.json b/editions/free/src/localizations/no.json new file mode 100644 index 00000000..3e7ba0ac --- /dev/null +++ b/editions/free/src/localizations/no.json @@ -0,0 +1,380 @@ +{ + "MY_PROJECTS": "Mine Prosjekter", + "QUICK_INTRO": "Kjapp Introduksjon til ScratchJr", + "SAMPLE_PROJECTS": "Prosjekt Prøver", + "ABOUT_SCRATCHJR": "Om ScratchJr", + "INTERFACE_GUIDE": "Grensesnitt Guide", + "PAINT_EDITOR_GUIDE": "Maleprogram Guide", + "BLOCKS_GUIDE": "Kodeblokk Guide", + "ABOUT_WHAT_IS": "Hva er ScratchJr?", + "ABOUT_DESCRIPTION": "ScratchJr er ett introduksjons programmeringsspråk som gjør det mulig for barn (i alder 5-7) å lage sine egne interaktive historier og spill. Barna kobler sammen grafiske kodeblokker for å få figurene til å bevege seg, hoppe, danse og synge. Barna kan endre figurene i maleprogrammet, legge til deres egne stemmer og lyder, til og med legge inn bilder av seg selv -- og så bruke kodeblokkene til å få liv i figurene.", + "ABOUT_INSPIRED_BY": "ScratchJr er inspirert av det populære Scratch programmeringsspråket (http://scratch.mit.edu), brukt av millioner av unge (fra 8 og oppover) over hele verden. Da vi lagde ScratchJr, re-designet vi grensesnittet og programmeringsspråket for å gjøre de utviklingsmessigst riktig for yngre barn, ved nøye å designe funksjoner tilpasset unge barns kognitive, personlige, sosiale, og emosjonelle utvikling.

ScratchJr er tilgjengelig som en gratis app for både iPad og Android nettbrett. For mer informasjon om ScratchJr, se http://scratchjr.org", + "ABOUT_WHY_CREATE": "Hvorfor Lagde Vi ScratchJr?", + "ABOUT_WHY_CREATE_DESCRIPTION": "Koding (eller programmering) er en ny type leseferdighet. Akkurat som å skrive hjelper deg å tenke og uttrykke dine ideer, er det samme sant for koding. Før var koding sett på som for vanskelig for de aller fleste. Men vi mener koding burde være for alle, akkurat som skriving er for alle.

Når unge barn koder med ScratchJr lærer de hvordan å lage og uttrykke seg med en datamaskin, og ikke bare for å bruke den. Samtidig lærer barna å løse problemer og planlegge prosjekter, og de utvikler sekvensielle metoder som er grunnleggende for senere akademisk suksess. De bruker også matematikk og språk i en meningsfull og motiverende sammenheng, som støtter opp for utviklingen av tallforståelse og leseferdighet i en tidlig alder. Med ScratchJr vil barn ikke bare lære å kode, de vil også kode for å lære. ", + "ABOUT_WHO_CREATED": "Hvem Lagde ScratchJr?", + "ABOUT_WHO_CREATED_DESCRIPTION": "ScratchJr er ett samarbeid mellom Developmental Technologies (DevTech) Research Group ved Eliot-Pearson Department of Child Study and Human Development ved Tufts University (ledet av Marina Umaschi Bers, med bidrag fra Amanda Strawhacker, Claire Caine, Louise Flannery Elizabeth Kazakoff og Dylan Portelance), Lifelong Kindergarten gruppen ved MIT Media Lab (ledet av Mitchel Resnick, med bidrag fra Chris Garrity, Tim Mickel, Carl Bowman, Champika Fernando, Natalie Rusk, Sayamindu Dasgupta, og Chris Graves), og Playful Invention Company (ledet av Paula Bontá og Brian Silverman, med bidrag fra Jack Geddes og Adrian Gabriel). Android versjonen av ScratchJr ble laget av Two Sigma (ledet av Mark Roth, med bidrag fra Kevin Hu), med bidrag fra Benesse Corp.

Grafikk og illustrasjoner i ScratchJr er laget av HvingtQuatre Company (ledet av Julien Gelifier og Adrien Valesa), Sarah Thomson, Peter Mueller og Jillian Lombardi. Paula Aguilra fra MIT Media Lab produserte ScratchJr videoen. Vi ønsker også å takke alle som deltok i beta-test gruppen for iPad og Android, spesielt Sergio Antolinez, Vandendaele Didier og Sjoerd Dirk Meijer.", + "ABOUT_WHO_SUPPORTED": "Hvem Har Støttet ScratchJr?", + "ABOUT_WHO_SUPPORTED_DESCRIPTION": "ScratchJr prosjektet har mottatt generøst finansiell støtte fra National Science Foundation (NSF DRL-1118664), Scratch Foundation, LEGO Foundation, og British Telecommunications.

Hvis du liker å bruke denne gratis appen, vennligst vurder å gi ett bidrag til Scratch Foundation (www.scratchfoundation.org), en nonprofitt organisasjon som yter kontinuerlig støtte til ScratchJr. Vi verdsetter bidrag av alle størrelse, store som små.

Platinum støttespillere fra ScratchJr Kickstarter kampanjen: Jeremy Deutsch, Kenneth Ehlert, Catherine Greenspon, Mark Loughridge, JoAnn Gantz Bendetson, og Shirley Resnick.

Andre støttespillere fra ScratchJr Kickstarter kampanjen:", + "BLOCKS_TRIGGERING_BLOCKS": "Hendelser Blokker", + "BLOCKS_GREEN_FLAG": "Start på Grønt Flagg", + "BLOCKS_GREEN_FLAG_DESCRIPTION": "Starter koden når Grønt Flagg trykkes.", + "BLOCKS_ON_TAP": "Start på Trykk", + "BLOCKS_ON_TAP_DESCRIPTION": "Starter koden når du trykker på figuren.", + "BLOCKS_ON_TOUCH": "Start på Kontakt", + "BLOCKS_ON_TOUCH_DESCRIPTION": "Starter koden når figuren kommer i kontakt med en annen figur.", + "BLOCKS_ON_MESSAGE": "Start på Beskjed", + "BLOCKS_ON_MESSAGE_DESCRIPTION": "Starter koden når en beskjed med en bestemt farge er sendt.", + "BLOCKS_SEND_MESSAGE": "Send Melding", + "BLOCKS_SEND_MESSAGE_DESCRIPTION": "Send en melding med den bestemte fargen.", + "BLOCKS_MOTION_BLOCKS": "Bevegelses Blokker", + "BLOCKS_MOVE_RIGHT": "Gå til Høyre", + "BLOCKS_MOVE_RIGHT_DESCRIPTION": "Flytter figuren ett bestemt antall grid ruter til høyre.", + "BLOCKS_MOVE_LEFT": "Gå til Venstre", + "BLOCKS_MOVE_LEFT_DESCRIPTION": "Flytter figuren ett bestemt antall grid ruter til venstre.", + "BLOCKS_MOVE_UP": "Gå Opp", + "BLOCKS_MOVE_UP_DESCRIPTION": "Flytter figuren ett bestemt antall grid ruter opp.", + "BLOCKS_MOVE_DOWN": "Gå Ned", + "BLOCKS_MOVE_DOWN_DESCRIPTION": "Flytter figuren ett bestemt antall grid ruter ned.", + "BLOCKS_TURN_RIGHT": "Snu til Høyre", + "BLOCKS_TURN_RIGHT_DESCRIPTION": "Snur figuren med klokken ett bestemt antall ganger. Snu 12 ganger for en full runde.", + "BLOCKS_TURN_LEFT": "Snu til Venstre", + "BLOCKS_TURN_LEFT_DESCRIPTION": "Snur figuren mot klokken ett bestemt antall ganger. Snu 12 ganger for en full runde.", + "BLOCKS_HOP": "Hopp", + "BLOCKS_HOP_DESCRIPTION": "Flytter figuren opp ett bestemt antall grid ruter også ned igjen.", + "BLOCKS_GO_HOME": "Gå Hjem", + "BLOCKS_GO_HOME_DESCRIPTION": "Sett figuren tilbake til start posisjon igjen. (For å sette en ny start posisjon, flytt figuren til den posisjonen).", + "BLOCKS_LOOKS_BLOCKS": "Utseende Blokker", + "BLOCKS_SAY": "Snakk", + "BLOCKS_SAY_DESCRIPTION": "Vis en bestemt beskjed i en snakke boble over figuren.", + "BLOCKS_GROW": "Større", + "BLOCKS_GROW_DESCRIPTION": "Øker figurens størrelse.", + "BLOCKS_SHRINK": "Mindre", + "BLOCKS_SHRINK_DESCRIPTION": "Minsker figurens størrelse.", + "BLOCKS_RESET_SIZE": "Normal Størrelse", + "BLOCKS_RESET_SIZE_DESCRIPTION": "Gjenoppretter figuren til vanlig størrelse.", + "BLOCKS_HIDE": "Skjul", + "BLOCKS_HIDE_DESCRIPTION": "Visker ut figuren gradvis til den er usynlig.", + "BLOCKS_SHOW": "Vis", + "BLOCKS_SHOW_DESCRIPTION": "Viser figuren gradvis til den er fullt synlig.", + "BLOCKS_SOUND_BLOCKS": "Lyd Blokker", + "BLOCKS_POP": "Pop", + "BLOCKS_POP_DESCRIPTION": "Spiller en \"Pop\" Lyd", + "BLOCKS_PLAY_RECORDED": "Spill Lyd Opptak", + "BLOCKS_PLAY_RECORDED_DESCRIPTION": "Spiller ett lydopptak av brukeren.", + "BLOCKS_CONTROL_BLOCKS": "Kontroll Blokker", + "BLOCKS_WAIT": "Vent", + "BLOCKS_WAIT_DESCRIPTION": "Paus koden for en bestemt tidslengde (i tideler av ett sekund).", + "BLOCKS_STOP": "Stopp", + "BLOCKS_STOP_DESCRIPTION": "Stopper koden til alle figurene.", + "BLOCKS_SET_SPEED": "Sett Fart", + "BLOCKS_SET_SPEED_DESCRIPTION": "Endrer farten som visse kodeblokker kan kjøre.", + "BLOCKS_REPEAT": "Gjenta", + "BLOCKS_REPEAT_DESCRIPTION": "Kjører kodeblokkene inni ett bestemt antall ganger.", + "BLOCKS_END_BLOCKS": "Slutt Blokker", + "BLOCKS_END": "Slutt", + "BLOCKS_END_DESCRIPTION": "Viser slutten på koden (men påvirker ikke koden på noen som helst måte).", + "BLOCKS_REPEAT_FOREVER": "Gjenta For Alltid", + "BLOCKS_REPEAT_FOREVER_DESCRIPTION": "Kjører koden over og over igjen.", + "BLOCKS_GO_TO_PAGE": "Gå til Side", + "BLOCKS_GO_TO_PAGE_DESCRIPTION": "Flytter seg til den bestemte siden i prosjektet.", + "INTERFACE_GUIDE_NUMBER": "{N, number}", + "INTERFACE_GUIDE_SAVE": "{N, number} | Lagre", + "INTERFACE_GUIDE_STAGE": "{N, number} | Scene", + "INTERFACE_GUIDE_PRESENTATION_MODE": "{N, number} | Presentasjonsmodus", + "INTERFACE_GUIDE_GRID": "{N, number} | Rutenett", + "INTERFACE_GUIDE_CHANGE_BG": "{N, number} | Skift Bakgrunn", + "INTERFACE_GUIDE_ADD_TEXT": "{N, number} | Legg til Tekst", + "INTERFACE_GUIDE_RESET_CHAR": "{N, number} | Still opp Figurene på nytt", + "INTERFACE_GUIDE_GREEN_FLAG": "{N, number} | Grønt Flagg", + "INTERFACE_GUIDE_PAGES": "{N, number} | Sider", + "INTERFACE_GUIDE_PROJECT_INFO": "{N, number} | Prosjekt Informasjon", + "INTERFACE_GUIDE_UNDO_REDO": "{N, number} | Angre og Gjør om", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT": "{N, number} | Programkode", + "INTERFACE_GUIDE_PROGRAMMING_AREA": "{N, number} | Programmeringsområde", + "INTERFACE_GUIDE_BLOCKS_PALETTE": "{N, number} | Kodeblokk Palett", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES": "{N, number} | Kodeblokk Kategorier", + "INTERFACE_GUIDE_CHARACTERS": "{N, number} | Figurer", + "INTERFACE_GUIDE_SAVE_DESCRIPTION": "Lagre prosjektet og gå tilbake til Hjem siden.", + "INTERFACE_GUIDE_STAGE_DESCRIPTION": "Dette er hvor handlingen skjer i prosjektet. For å slette en figur, trykk og hold den.", + "INTERFACE_GUIDE_PRESENTATION_MODE_DESCRIPTION": "Utvid scenen til full skjerm.", + "INTERFACE_GUIDE_GRID_DESCRIPTION": "Skru på (og av) x-y koordinat rutenettet.", + "INTERFACE_GUIDE_CHANGE_BG_DESCRIPTION": "Velg eller lag ett bakgrunns bilde for scenen.", + "INTERFACE_GUIDE_ADD_TEXT_DESCRIPTION": "Skriv titler og tekst på scenen", + "INTERFACE_GUIDE_RESET_CHAR_DESCRIPTION": "Setter alle figurene tilbake til deres start posisjon på scenen. (Dra figurene for å sette opp nye start posisjoner).", + "INTERFACE_GUIDE_GREEN_FLAG_DESCRIPTION": "Start alle program koder som begynner med \"Start på Grønt Flagg\" blokken ved å trykke her.", + "INTERFACE_GUIDE_PAGES_DESCRIPTION": "Velg blant sidene i prosjektet ditt - eller trykk på pluss tegnet for å legge til en ny side. Hver side har sitt eget sett med figurer og bakgrunner. For å slette en side, trykk og hold på den. For å forandre rekkefølgen på sidene, dra dem til ønsket plass.", + "INTERFACE_GUIDE_PROJECT_INFO_DESCRIPTION": "Endrer tittelen på prosjektet, se når prosjektet ble laget, og del prosjektet (hvis din enhet støtter det).", + "INTERFACE_GUIDE_UNDO_REDO_DESCRIPTION": "Hvis du gjør en feil kan du trykke på Angre for å gå tilbake i tid og gjøre om den siste endringen. Trykk på Gjør om for å gjøre om den Angre igjen.", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT_DESCRIPTION": "Koble kodeblokkene sammen for å lage programkode som forteller figuren hva den skal gjøre. Trykk hvor som helst på ett programkode for å få det til å kjøre. For å slette en kodeblokk eller programkode, dra det utenfor programmeringsområdet. For å kopiere en kodeblokk eller programkode fra en figur til en annen, dra det og slipp det på den figurens miniatyrbilde.", + "INTERFACE_GUIDE_PROGRAMMING_AREA_DESCRIPTION": "Dette er hvor du kobler kodeblokker til å lage ett program som forteller figuren hva den skal gjøre.", + "INTERFACE_GUIDE_BLOCKS_PALETTE_DESCRIPTION": "Dette er en meny av kodeblokker. Dra en kodeblokk ned til programmeringsområdet, også trykk på den for å hva den gjør.", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES_DESCRIPTION": "Dette er hvor du kan velge en kategori av kodeblokker: Hendelser Blokker (Gul), Bevegelse (Blå), Utseende (Lilla), Lyder (Grønn), Kontroll (Oransje), Slutt Blokker (Rød).", + "INTERFACE_GUIDE_CHARACTERS_DESCRIPTION": "Velg mellom figurene i prosjektet ditt - eller trykk på pluss tegnet for å legge til en ny. Når en figur er valgt kan du redigere programmet til den, trykke på navnet for å gi den nytt navn, eller trykke på malebørsten for å redigere figurens bilde. For å slette en figur, trykk og hold den. For å kopiere en figur til en annen side, dra den til sidens miniatyrbilde.", + "PAINT_GUIDE_UNDO": "{N, number} | Angre", + "PAINT_GUIDE_REDO": "{N, number} | Gjør om", + "PAINT_GUIDE_SHAPE": "{N, number} | Form", + "PAINT_GUIDE_CHARACTER_NAME": "{N, number} | Navn på Figur", + "PAINT_GUIDE_CUT": "{N, number} | Klipp", + "PAINT_GUIDE_DUPLICATE": "{N, number} | Kopier", + "PAINT_GUIDE_ROTATE": "{N, number} | Snu", + "PAINT_GUIDE_DRAG": "{N, number} | Dra", + "PAINT_GUIDE_SAVE": "{N, number} | Lagre", + "PAINT_GUIDE_FILL": "{N, number} | Fyll inn", + "PAINT_GUIDE_CAMERA": "{N, number} | Kamera", + "PAINT_GUIDE_COLOR": "{N, number} | Farge", + "PAINT_GUIDE_LINE_WIDTH": "{N, number} | Linjebredde", + "PAINT_GUIDE_UNDO_DESCRIPTION": "Gjør om den siste endringen.", + "PAINT_GUIDE_REDO_DESCRIPTION": "Gjør om den siste Angre.", + "PAINT_GUIDE_SHAPE_DESCRIPTION": "Velg en form å tegne: linje, sirkel/ellipse, rektangel, eller triangel.", + "PAINT_GUIDE_CHARACTER_NAME_DESCRIPTION": "Endre navnet på figuren.", + "PAINT_GUIDE_CUT_DESCRIPTION": "Etter å ha valgt Klipp verktøyet kan du trykke på en figur eller form for å fjerne den fra lerretet.", + "PAINT_GUIDE_DUPLICATE_DESCRIPTION": "Etter å ha valgt Kopier verktøyet kan du trykke på en figur eller form for å lage en kopi av den.", + "PAINT_GUIDE_ROTATE_DESCRIPTION": "Etter å ha valgt Snu verktøyet kan du snu en figur eller form rundt dens midtpunkt.", + "PAINT_GUIDE_DRAG_DESCRIPTION": "Etter å ha valgt Dra verktøyet kan du dra en figur eller form på lerretet. Hvis du trykker på en figur kan du endre formen ved å dra på punktene som vises.", + "PAINT_GUIDE_SAVE_DESCRIPTION": "Lagre endringer og forlate Maleprogrammet.", + "PAINT_GUIDE_FILL_DESCRIPTION": "Etter å ha valgt Fyll inn verktøyet kan du trykke på hvilken som helst del av en figur eller form for å fylle den med den valgte fargen.", + "PAINT_GUIDE_CAMERA_DESCRIPTION": "Etter å ha valgt Kamera verktøyet kan du trykke på hvilken som helst del av en figur eller form også trykke på kamera knappen for å fylle inn delen med ett foto tatt med kameraet.", + "PAINT_GUIDE_COLOR_DESCRIPTION": "Velg en ny farge til bruk for tegning og fylle inn i former.", + "PAINT_GUIDE_LINE_WIDTH_DESCRIPTION": "Endre bredden på linjene i formene du tegner.", + "SAMPLE_Under the sea": "Under sjøen", + "SAMPLE_Farm": "Gård", + "SAMPLE_Seasons": "Sesonger", + "SAMPLE_Friends": "Venner", + "SAMPLE_Dance": "Dans", + "SAMPLE_Animal Race": "Dyre Løp", + "SAMPLE_Bump": "Nærkontakt", + "SAMPLE_Quick Intro": "Kjapp Introduksjon", + "SAMPLE_Star": "Stjerne", + "SAMPLE_TEXT_key_character_cat": "Katt", + "SAMPLE_TEXT_key_character_star": "Stjerne", + "SAMPLE_TEXT_key_character_teen_girl": "Tenåring", + "SAMPLE_TEXT_key_character_teen_boy": "Tenåring", + "SAMPLE_TEXT_key_farm_tap_them": "Trykk på dem", + "SAMPLE_TEXT_key_party_question": "Fest?", + "SAMPLE_TEXT_key_soccer_question": "Eller fotball?", + "SAMPLE_TEXT_key_goal": "Mål!!", + "SAMPLE_TEXT_key_under_the_sea_fish": "Fisk", + "SAMPLE_TEXT_key_under_the_sea_seahorse": "Sjøhest", + "SAMPLE_TEXT_key_under_the_sea_starfish": "Stjernefisk", + "SAMPLE_TEXT_key_farm_pig": "Gris", + "SAMPLE_TEXT_key_farm_horse": "Hest", + "SAMPLE_TEXT_key_farm_chicken": "Kylling", + "SAMPLE_TEXT_key_farm_barn": "Stall", + "SAMPLE_TEXT_key_seasons_summer": "Sommer", + "SAMPLE_TEXT_key_seasons_fall": "Høst", + "SAMPLE_TEXT_key_seasons_winter": "Vinter", + "SAMPLE_TEXT_key_seasons_spring": "Vår", + "SAMPLE_TEXT_key_friends_cake": "Kake", + "SAMPLE_TEXT_key_friends_soccer_ball": "Fotball", + "SAMPLE_TEXT_key_friends_child": "Barn", + "SAMPLE_TEXT_key_friends_table": "Bord", + "SAMPLE_TEXT_key_friends_soccer_net": "Fotball mål", + "SAMPLE_TEXT_key_animalrace_elephant": "Elefant", + "SAMPLE_TEXT_key_animalrace_giraffe": "Sjiraff", + "SAMPLE_TEXT_key_animalrace_monkey": "Apekatt", + "SAMPLE_TEXT_key_dance_scubadiver": "Dykker", + "SAMPLE_TEXT_key_dance_snake": "Slange", + "SAMPLE_TEXT_key_bump_yellow_duck": "Gul And", + "SAMPLE_TEXT_key_bump_blue_duck": "Blå And", + "SAMPLE_TEXT_key_bump_green_duck": "Grønn And", + "SAMPLE_TEXT_key_quickintro_fish": "Fisk", + "SAMPLE_TEXT_key_quickintro_toc": "Toc", + "CHARACTER_Cat.svg": "Katt", + "CHARACTER_Cat2.svg": "Gående Katt", + "CHARACTER_Blue.svg": "Tic", + "CHARACTER_Purple.svg": "Tac", + "CHARACTER_Red.svg": "Toc", + "CHARACTER_Dragon.svg": "Drage", + "CHARACTER_Fairy.svg": "Fe", + "CHARACTER_Wizard.svg": "Trollmann", + "CHARACTER_Dog.svg": "Hund", + "CHARACTER_Rabbit.svg": "Kanin", + "CHARACTER_Chicken.svg": "Kylling", + "CHARACTER_Pig.svg": "Gris", + "CHARACTER_Horse.svg": "Hest", + "CHARACTER_Zebra.svg": "Zebra", + "CHARACTER_Monkey.svg": "Apekatt", + "CHARACTER_Elephant.svg": "Elefant", + "CHARACTER_Giraffe.svg": "Sjiraff", + "CHARACTER_Camel.svg": "Kamel", + "CHARACTER_Butterfly.svg": "Sommerfugl", + "CHARACTER_Fly.svg": "Flue", + "CHARACTER_Bat.svg": "Flaggermus", + "CHARACTER_Bird.svg": "Fugl", + "CHARACTER_Snake.svg": "Slange", + "CHARACTER_Lizard.svg": "Øgle", + "CHARACTER_Frog.svg": "Frosk", + "CHARACTER_Duck.svg": "And", + "CHARACTER_Crab.svg": "Krabbe", + "CHARACTER_Seahorse.svg": "Sjøhest", + "CHARACTER_Starfish.svg": "Stjernefisk", + "CHARACTER_Fish1.svg": "Fisk", + "CHARACTER_Fish2.svg": "Fisk", + "CHARACTER_Whale.svg": "Hval", + "CHARACTER_Penguin.svg": "Pingvin", + "CHARACTER_PolarBear.svg": "Isbjørn", + "CHARACTER_Girl1.svg": "Barn", + "CHARACTER_Girl2.svg": "Barn", + "CHARACTER_Girl3.svg": "Barn", + "CHARACTER_Boy1.svg": "Barn", + "CHARACTER_Boy2.svg": "Barn", + "CHARACTER_Boy3.svg": "Barn", + "CHARACTER_TeenGirl1.svg": "Ungdom", + "CHARACTER_TeenGirl2.svg": "Ungdom", + "CHARACTER_TeenGirl3.svg": "Ungdom", + "CHARACTER_TeenBoy1.svg": "Ungdom", + "CHARACTER_TeenBoy2.svg": "Ungdom", + "CHARACTER_TeenBoy3.svg": "Ungdom", + "CHARACTER_Baby.svg": "Baby", + "CHARACTER_Mother.svg": "Mor", + "CHARACTER_Father.svg": "Far", + "CHARACTER_Grandmother.svg": "Bestemor", + "CHARACTER_Grandfather.svg": "Bestefar", + "CHARACTER_Girl.svg": "Barn", + "CHARACTER_Boy.svg": "Barn", + "CHARACTER_Teen2.svg": "Ungdom", + "CHARACTER_Teen3.svg": "Ungdom", + "CHARACTER_Farmer1.svg": "Cowboy", + "CHARACTER_Farmer.svg": "Cowboy", + "CHARACTER_Bike2.svg": "Syklist", + "CHARACTER_Bike.svg": "Syklist", + "CHARACTER_Car2.svg": "Sjåfør", + "CHARACTER_Car1.svg": "Sjåfør", + "CHARACTER_Aeroplane.svg": "Pilot", + "CHARACTER_Astronaut.svg": "Astronaut", + "CHARACTER_Inuit.svg": "Eskimo", + "CHARACTER_Scubadiver.svg": "Dykker", + "CHARACTER_Rowboat.svg": "Roer", + "CHARACTER_Tree1.svg": "Tre", + "CHARACTER_Tree3.svg": "Tre", + "CHARACTER_Tree4.svg": "Tre", + "CHARACTER_Evergreen.svg": "Tre", + "CHARACTER_Weed.svg": "Plante", + "CHARACTER_Pasture.svg": "Høyt Gress", + "CHARACTER_Cactus.svg": "Kaktus", + "CHARACTER_Daffodil.svg": "Påskeliljer", + "CHARACTER_Daisy1.svg": "Tusenfryd", + "CHARACTER_Daisy2.svg": "Tusenfryd", + "CHARACTER_Daisy3.svg": "Tusenfryd", + "CHARACTER_Tulip2.svg": "Tulipan", + "CHARACTER_Flowers.svg": "Blomster", + "CHARACTER_Apple.svg": "Eple", + "CHARACTER_Peach.svg": "Fersken", + "CHARACTER_Mushroom.svg": "Sopp", + "CHARACTER_Star.svg": "Stjerne", + "CHARACTER_Star2.svg": "Stjerne", + "CHARACTER_Star3.svg": "Stjerne", + "CHARACTER_ShootingStar.svg": "Stjerneskudd", + "CHARACTER_Earth.svg": "Jorden", + "CHARACTER_Planet.svg": "Planet", + "CHARACTER_Sun.svg": "Sol", + "CHARACTER_Moon.svg": "Fullmåne", + "CHARACTER_CrescentMoon.svg": "Måne", + "CHARACTER_Cloud1.svg": "Sky", + "CHARACTER_Thundercloud.svg": "Tordensky", + "CHARACTER_Tornado.svg": "Tornado", + "CHARACTER_Barn.svg": "Stall", + "CHARACTER_Fort.svg": "Fort", + "CHARACTER_Castle.svg": "Slott", + "CHARACTER_Igloo.svg": "Igloo", + "CHARACTER_House1.svg": "Hus", + "CHARACTER_House.svg": "Hus", + "CHARACTER_House3.svg": "Hus", + "CHARACTER_House4.svg": "Hus", + "CHARACTER_Apartment.svg": "Leilighet", + "CHARACTER_School.svg": "Skole", + "CHARACTER_Shop.svg": "Butikk", + "CHARACTER_Fence.svg": "Gjerde", + "CHARACTER_Mailbox.svg": "Postkasse", + "CHARACTER_Cake.svg": "Kake", + "CHARACTER_Ball.svg": "Ball", + "CHARACTER_Basketball.svg": "Basketball", + "CHARACTER_Soccerball.svg": "Fotball", + "CHARACTER_SoccerNet.svg": "Fotball mål", + "CHARACTER_Bed.svg": "Seng", + "CHARACTER_NightTable.svg": "Nattbord", + "CHARACTER_Stool.svg": "Stol", + "CHARACTER_Table.svg": "Bord", + "CHARACTER_Car.svg": "Bil", + "CHARACTER_Bus.svg": "Buss", + "CHARACTER_SailBoat.svg": "Båt", + "CHARACTER_Boat2.svg": "Båt", + "CHARACTER_Rocket.svg": "Rakett", + "BACKGROUND_Farm.svg": "Gård", + "BACKGROUND_Park.svg": "Park", + "BACKGROUND_Suburbs.svg": "Boligstrøk", + "BACKGROUND_City.svg": "By", + "BACKGROUND_Library.svg": "Bibliotek", + "BACKGROUND_Classroom.svg": "Klasserom", + "BACKGROUND_Theatre.svg": "Teater", + "BACKGROUND_Gym.svg": "Gym", + "BACKGROUND_Gym2.svg": "Gym", + "BACKGROUND_Bedroom.svg": "Soverom", + "BACKGROUND_EmptyRoom.svg": "Tomt Rom", + "BACKGROUND_Summer.svg": "Sommer", + "BACKGROUND_Fall.svg": "Høst", + "BACKGROUND_Winter.svg": "Vinter", + "BACKGROUND_Spring.svg": "Vår", + "BACKGROUND_Creek.svg": "Elv", + "BACKGROUND_Lake.svg": "Innsjø", + "BACKGROUND_Woods.svg": "Skog", + "BACKGROUND_BeachDay.svg": "Strand Dag", + "BACKGROUND_BeachSunrise.svg": "Strand Solnedgang", + "BACKGROUND_BeachNight.svg": "Strand Natt", + "BACKGROUND_Underwater.svg": "Under vann", + "BACKGROUND_Jungle.svg": "Jungelen", + "BACKGROUND_Savannah.svg": "Savannen", + "BACKGROUND_Desert.svg": "Ørken", + "BACKGROUND_Arctic.svg": "Arktis", + "BACKGROUND_Space.svg": "Verdensrommet", + "BACKGROUND_MoonBkg.svg": "Månen", + "BLOCK_DESC_GREEN_FLAG": "START PÅ GRØNT FLAGG", + "BLOCK_DESC_ON_TAP": "START PÅ TRYKK {CHARACTER_NAME}", + "BLOCK_DESC_ON_BUMP": "START PÅ KONTAKT {CHARACTER_NAME}", + "BLOCK_DESC_MESSAGE_COLOR_ORANGE": "Oransje", + "BLOCK_DESC_ON_MESSAGE": "START PÅ {COLOR} BESKJED", + "BLOCK_DESC_SEND_MESSAGE": "SEND {COLOR} START BESKJED", + "BLOCK_DESC_MOVE_RIGHT": "GÅ TIL HØYRE", + "BLOCK_DESC_MOVE_LEFT": "GÅ TIL VENSTRE", + "BLOCK_DESC_MOVE_UP": "GÅ OPP", + "BLOCK_DESC_MOVE_DOWN": "GÅ NED", + "BLOCK_DESC_TURN_RIGHT": "SNU TIL HØYRE", + "BLOCK_DESC_TURN_LEFT": "SNU TIL VENSTRE", + "BLOCK_DESC_HOP": "HOPP", + "BLOCK_DESC_GO_HOME": "GÅ HJEM", + "BLOCK_DESC_SAY": "SNAKK", + "BLOCK_DESC_GROW": "STØRRE", + "BLOCK_DESC_SHRINK": "MINDRE", + "BLOCK_DESC_RESET_SIZE": "VANLIG STØRRELSE", + "BLOCK_DESC_HIDE": "SKJUL", + "BLOCK_DESC_SHOW": "VIS", + "BLOCK_DESC_PLAY_SOUND": "SPILL {SOUND_NAME}", + "BLOCK_DESC_PLAY_SOUND_POP": "pop", + "BLOCK_DESC_PLAY_RECORDED_SOUND": "SPILL LYDOPPTAK", + "BLOCK_DESC_WAIT": "VENT", + "BLOCK_DESC_STOP": "STOP {CHARACTER_NAME}", + "BLOCK_DESC_SET_SPEED": "SETT FART", + "BLOCK_DESC_REPEAT": "GJENTA", + "BLOCK_DESC_END": "SLUTT", + "BLOCK_DESC_REPEAT_FOREVER": "GJENTA FOR ALLTID", + "BLOCK_DESC_GO_TO_PAGE": "GÅ TIL SIDE {PAGE}", + "SHARING_BY_EMAIL": "Del via Epost", + "SHARING_BY_AIRDROP": "Del via Airdrop", + "SHARING_EMAIL_SUBJECT": "ScratchJr Prosjekt: {PROJECT_NAME}", + "SHARING_EMAIL_TEXT": "Klikk på ikonet for å prøve mitt ScratchJr prosjekt på din iPad eller Android nettbrett!

Hvis du ikke har ScratchJr appen kan du laste den ned fra Apple App store eller fra Google Play Store.

Med ScratchJr kan barn lage deres egne interaktive historier og spill. For å lære mer se scratchjr.org.", + "FOR_PARENTS": "For Foreldre", + "PARENTAL_GATE_EXPLANATION": "Hvorfor spør vi om dette? En voksen må godta deling på nett.", + "GRID_NUMBER": "{N, number}", + "NEW_PROJECT_PREFIX": "Prosjekt", + "LIBRARY_CHARACTER": "Figur", + "LIBRARY_BACKGROUND": "Bakgrunn", + "SAY_BLOCK_DEFAULT_ARGUMENT": "hei", + "ALERT_BACK": "Tilbake", + "ALERT_SAVING": "Lagrer...", + "SELECT_LANGUAGE": "Velg språk", + "USAGE_QUESTION": "Hvor bruker du ScratchJr?", + "USAGE_SCHOOL": "Skole", + "USAGE_HOME": "Hjem", + "USAGE_OTHER": "Annet", + "USAGE_NONE": "Ikke spør igjen" +} \ No newline at end of file diff --git a/editions/free/src/localizations/pl.json b/editions/free/src/localizations/pl.json new file mode 100644 index 00000000..adb5f86d --- /dev/null +++ b/editions/free/src/localizations/pl.json @@ -0,0 +1,380 @@ +{ + "MY_PROJECTS": "Moje Projekty", + "QUICK_INTRO": "Szybkie wprowadzenie do ScratchJr", + "SAMPLE_PROJECTS": "Przykładowe Projekty", + "ABOUT_SCRATCHJR": "O ScratchJr", + "INTERFACE_GUIDE": "Przewodnik po Interfejsie", + "PAINT_EDITOR_GUIDE": "Przewodnik po Edytorze Rysunków", + "BLOCKS_GUIDE": "Przewodnik po Blokach", + "ABOUT_WHAT_IS": "Czym jest ScratchJr?", + "ABOUT_DESCRIPTION": "ScratchJr to język wprowadzający do programowania, który pozwala małym dzieciom (w wieku 5-7 lat) tworzyć własne interaktywne opowiadania i gry. Dzieci łączą ze sobą graficzne bloki kodu, aby postacie poruszały się, skakały, tańczyły i śpiewały. Dzieci mogą edytować postacie w edytorze rysunków, nagrywać własne dźwięki, a nawet wklejać swoje zdjęcia - a potem, korzystać z bloków kodu, aby ożywić swoich bohaterów.", + "ABOUT_INSPIRED_BY": "Inspiracją do powstania ScratchJr był popularny język Scratch (http://scratch.mit.edu), z którego korzystają miliony uczniów (od 8 roku życia) na całym świecie.\nPodczas tworzenia ScratchJr, zmieniliśmy interfejs i dostosowaliśmy język programowania do poziomu rozwoju młodszych dzieci. Starannie zaprojektowaliśmy funkcjonalności, tak aby odpowiadały emocjonalnym, społecznym i poznawczym możliwościom młodszych uczniów.

ScratchJr jest dostępny jako darmowa aplikacja na iPady i tablety z systemem Android.\nWięcej informacji o ScratchJr znajdziesz na stronie http://scratchjr.org", + "ABOUT_WHY_CREATE": "Dlaczego stworzyliśmy ScratchJr?", + "ABOUT_WHY_CREATE_DESCRIPTION": "Programowanie (czyli kodowanie) to współczesny odpowiednik umiejętności czytania i pisania. Kodowanie, tak samo jak pisanie, pozwala zorganizować tok myślenia i wyrazić swoje pomysły. W przeszłości programowanie uchodziło za coś trudnego, dostępnego tylko dla nielicznych. Jednak my uważamy, że kodowanie powinno być dostępne dla każdego - tak jak pisanie.

Gdy małe dzieci kodują w ScratchJr, uczą się jak kreatywnie wyrażać swoje pomysły i z użyciem komputera tworzyć, a nie tylko biernie korzystać z komputera. Podczas pracy, dzieci uczą się jak rozwiązywać problemy i projektować rozwiązania oraz rozwijają umiejętność analitycznego myślenia, która jest podstawą sukcesu w dalszej edukacji. Ponadto, korzystają z matematyki i języka w ciekawym, motywującym kontekście, co dodatkowo wspiera rozwój umiejętności liczenia, czytania i pisania. W ScratchJr dzieci nie tylko uczą się kodować, ale kodują by się uczyć.", + "ABOUT_WHO_CREATED": "Kto stworzył ScratchJr?", + "ABOUT_WHO_CREATED_DESCRIPTION": "ScratchJr jest efektem współpracy między the Developmental Technologies (DevTech) Research Group przy the Eliot-Pearson Department of Child Study i Human Development na Tufts University (pod kierunkiem Marina Umaschi Bers przy współpracy z Amanda Strawhacker, Claire Caine, Louise Flannery, Elizabeth Kazakoff i Dylan Portelance), the Lifelong Kindergarten group na the MIT Media Lab (pod kierunkiem Mitchel Resnick przy współpracy z Chris Garrity, Tim Mickel, Carl Bowman, Champika Fernando, Natalie Rusk, Sayamindu Dasgupta i Chris Graves) i the Playful Invention Company (pod kierunkiem Paula Bontá i Brian Silverman przy współpracy z Jack Geddes and Adrian Gabriel). Wersja ScratchJr na Androida została zaimplementowana przez Two Sigma (pod kierunkiem Mark Roth przy współpracy z Kevin Hu) z udziałem Benesse Corp.

Grafika i ilustracje do ScratchJr zostały stworzone przez HvingtQuatre Company (pod kierunkiem Julien Gelifier and Adrien Valesa), Sarah Thomson, Peter Mueller i Jillian Lombardi. Paula Aguilera z MIT Media Lab jest producentem ScratchJr wideo. Pragniemy również podziękować wszystkim, którzy uczestniczyli w społecznościowych beta-testach na iPada i Androida, szczególnie Sergio Antolinez, Vandendaele Didier i Sjoerd Dirk Meijer.", + "ABOUT_WHO_SUPPORTED": "Kto Wspiera ScratchJr?", + "ABOUT_WHO_SUPPORTED_DESCRIPTION": "Projekt ScratchJr otrzymał hojne finansowe wsparcie od National Science Foundation (NSF DRL-1118664), Scratch Foundation, Fundacji LEGO oraz British Telecommunications.

Jeśli chcesz wspomóc dalszy rozwój aplikacji ScratchJr, możesz dokonać wpłaty na konto organizacji non-profit Scratch Foundation (www.scratchfoundation.org). Będziemy wdzięczni za każdą pomoc, dużą i małą.

Platynowi darczyńcy w kampanii ScratchJr na Kickstarter: Jeremy Deutsch, Kenneth Ehlert, Catherine Greenspon, Mark Loughridge, JoAnn Gantz Bendetson, and Shirley Resnick.

Pozostali darczyńcy w kampanii ScratchJr na Kickstarter: ", + "BLOCKS_TRIGGERING_BLOCKS": "Bloki Uruchamiania", + "BLOCKS_GREEN_FLAG": "Start od Zielonej Flagi.", + "BLOCKS_GREEN_FLAG_DESCRIPTION": "Uruchamia skrypt, gdy dotkniemy zielonej flagi.", + "BLOCKS_ON_TAP": "Start po Stuknięciu", + "BLOCKS_ON_TAP_DESCRIPTION": "Uruchamia skrypt, gdy dotkniemy postaci.", + "BLOCKS_ON_TOUCH": "Start po Dotknięciu", + "BLOCKS_ON_TOUCH_DESCRIPTION": "Uruchamia skrypt, gdy postać zostanie dotknięta przez inną postać.", + "BLOCKS_ON_MESSAGE": "Start po otrzymaniu Wiadomości", + "BLOCKS_ON_MESSAGE_DESCRIPTION": "Uruchamia skrypt, gdy zostanie wysłana wiadomość określonego koloru.", + "BLOCKS_SEND_MESSAGE": "Wyślij Wiadomość", + "BLOCKS_SEND_MESSAGE_DESCRIPTION": "Wysyła wiadomość określonego koloru.", + "BLOCKS_MOTION_BLOCKS": "Bloki Ruchu", + "BLOCKS_MOVE_RIGHT": "Przesuń w Prawo", + "BLOCKS_MOVE_RIGHT_DESCRIPTION": "Przesuwa postać w prawo o określoną liczbę kwadratów siatki.", + "BLOCKS_MOVE_LEFT": "Przesuń w Lewo", + "BLOCKS_MOVE_LEFT_DESCRIPTION": "Przesuwa postać w lewo o określoną liczbę kwadratów siatki.", + "BLOCKS_MOVE_UP": "Przesuń w Górę", + "BLOCKS_MOVE_UP_DESCRIPTION": "Przesuwa postać w górę o określoną liczbę kwadratów siatki.", + "BLOCKS_MOVE_DOWN": "Przesuń w Dół", + "BLOCKS_MOVE_DOWN_DESCRIPTION": "Przesuwa postać w dół o określoną liczbę kwadratów siatki.", + "BLOCKS_TURN_RIGHT": "Obróć w Prawo", + "BLOCKS_TURN_RIGHT_DESCRIPTION": "Obraca postać o określoną wartość zgodnie z ruchem wskazówek zegara. Obrót o 12 to pełen obrót.", + "BLOCKS_TURN_LEFT": "Obróć w Lewo", + "BLOCKS_TURN_LEFT_DESCRIPTION": "Obraca postać o określoną wartość przeciwnie do ruchu wskazówek zegara. Obrót o 12 to pełen obrót.", + "BLOCKS_HOP": "Skok", + "BLOCKS_HOP_DESCRIPTION": "Przesuwa postać w górę o określoną liczbę kwadratów siatki, a potem z powrotem w dół.", + "BLOCKS_GO_HOME": "Wróć do pozycji Początkowej", + "BLOCKS_GO_HOME_DESCRIPTION": "Ustawia postać w jej pozycji początkowej. (Aby ustawić nową pozycję początkową, przeciągnij postać).", + "BLOCKS_LOOKS_BLOCKS": "Bloki Wyglądu", + "BLOCKS_SAY": "Powiedz", + "BLOCKS_SAY_DESCRIPTION": "Pokazuje określoną wiadomość zapisaną w dymku nad postacią.", + "BLOCKS_GROW": "Powiększ", + "BLOCKS_GROW_DESCRIPTION": "Zwiększa rozmiar postaci.", + "BLOCKS_SHRINK": "Zmniejsz", + "BLOCKS_SHRINK_DESCRIPTION": "Zmniejsza rozmiar postaci.", + "BLOCKS_RESET_SIZE": "Resetuj Rozmiar", + "BLOCKS_RESET_SIZE_DESCRIPTION": "Przywraca domyślny rozmiar postaci.", + "BLOCKS_HIDE": "Ukryj", + "BLOCKS_HIDE_DESCRIPTION": "Postać stopniowo znika, aż stanie się niewidoczna.", + "BLOCKS_SHOW": "Pokaż", + "BLOCKS_SHOW_DESCRIPTION": "Postać stopniowo pojawia się, aż stanie się w pełni widoczna.", + "BLOCKS_SOUND_BLOCKS": "Bloki Dźwięku", + "BLOCKS_POP": "Pop", + "BLOCKS_POP_DESCRIPTION": "Odtwarza domyślny dźwięk \"Pop\".", + "BLOCKS_PLAY_RECORDED": "Odtwórz Nagrany Dźwięk", + "BLOCKS_PLAY_RECORDED_DESCRIPTION": "Odtwarza dźwięk nagrany przez użytkownika.", + "BLOCKS_CONTROL_BLOCKS": "Bloki Sterowania", + "BLOCKS_WAIT": "Czekaj", + "BLOCKS_WAIT_DESCRIPTION": "Zatrzymuje działanie skryptu na określony czas (wartość 10 to jedna sekunda).", + "BLOCKS_STOP": "Zatrzymaj", + "BLOCKS_STOP_DESCRIPTION": "Zatrzymuje wszystkie skrypty postaci.", + "BLOCKS_SET_SPEED": "Ustaw Prędkość", + "BLOCKS_SET_SPEED_DESCRIPTION": "Zmienia tempo wykonywania bloków.", + "BLOCKS_REPEAT": "Powtórz", + "BLOCKS_REPEAT_DESCRIPTION": "Wykonuje bloki w pętli, określoną liczbę razy.", + "BLOCKS_END_BLOCKS": "Bloki Zakończenia", + "BLOCKS_END": "Koniec", + "BLOCKS_END_DESCRIPTION": "Wskazuje koniec skryptu (ale nie wpływa w żaden sposób na skrypt).", + "BLOCKS_REPEAT_FOREVER": "Powtarzaj Zawsze", + "BLOCKS_REPEAT_FOREVER_DESCRIPTION": "Powtarza wykonanie skryptu w nieskończonej pętli.", + "BLOCKS_GO_TO_PAGE": "Idź do Strony", + "BLOCKS_GO_TO_PAGE_DESCRIPTION": "Przechodzi na określoną stronę projektu.", + "INTERFACE_GUIDE_NUMBER": "{N, number}", + "INTERFACE_GUIDE_SAVE": "{N, number} | Zapisz", + "INTERFACE_GUIDE_STAGE": "{N, number} | Scena", + "INTERFACE_GUIDE_PRESENTATION_MODE": "{N, number} | Tryb prezentacji", + "INTERFACE_GUIDE_GRID": "{N, number} | Siatka", + "INTERFACE_GUIDE_CHANGE_BG": "{N, number} | Zmień Tło", + "INTERFACE_GUIDE_ADD_TEXT": "{N, number} | Dodaj Tekst", + "INTERFACE_GUIDE_RESET_CHAR": "{N, number} | Reset Postaci", + "INTERFACE_GUIDE_GREEN_FLAG": "{N, number} | Zielona Flaga", + "INTERFACE_GUIDE_PAGES": "{N, number} | Strony", + "INTERFACE_GUIDE_PROJECT_INFO": "{N, number} | Informacje o Projekcie", + "INTERFACE_GUIDE_UNDO_REDO": "{N, number} | Cofnij i Przywróć", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT": "{N, number} | Skrypt", + "INTERFACE_GUIDE_PROGRAMMING_AREA": "{N, number} | Obszar Programowania", + "INTERFACE_GUIDE_BLOCKS_PALETTE": "{N, number} | Paleta Bloków", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES": "{N, number} | Kategorie bloków", + "INTERFACE_GUIDE_CHARACTERS": "{N, number} | Postacie", + "INTERFACE_GUIDE_SAVE_DESCRIPTION": "Zapisuje projekt i wychodzi na stronę główną.", + "INTERFACE_GUIDE_STAGE_DESCRIPTION": "Na scenie rozgrywa się cała akcja projektu. Aby usunąć postać, dotknij i przytrzymaj ją.", + "INTERFACE_GUIDE_PRESENTATION_MODE_DESCRIPTION": "Rozszerza scenę na pełen ekran.", + "INTERFACE_GUIDE_GRID_DESCRIPTION": "Włącz (i wyłącz) siatkę współrzędnych.", + "INTERFACE_GUIDE_CHANGE_BG_DESCRIPTION": "Wybierz tło sceny, albo stwórz własne tło.", + "INTERFACE_GUIDE_ADD_TEXT_DESCRIPTION": "Dodaj tytuły i napisy do sceny.", + "INTERFACE_GUIDE_RESET_CHAR_DESCRIPTION": "Reset wszystkich postaci przenosi je na pozycje początkowe. (Przeciągnij postać, aby zmienić jej pozycję początkową).", + "INTERFACE_GUIDE_GREEN_FLAG_DESCRIPTION": "Uruchamia wszystkie skrypty, które rozpoczynają się od bloku \"Start od Zielonej Flagi\".", + "INTERFACE_GUIDE_PAGES_DESCRIPTION": "Wybierz spośród stron w projekcie - lub dotknij znak plusa, aby dodać nową stronę. Aby usunąć stronę, naciśnij ją i przytrzymaj. Aby zmienić kolejność stron, przeciągnij je do nowych pozycji. ", + "INTERFACE_GUIDE_PROJECT_INFO_DESCRIPTION": "Zmień nazwę projektu, sprawdź datę powstania projektu i wyślij projekt (opcja wysyłania projektu jest dostępna tylko na niektórych urządzeniach).", + "INTERFACE_GUIDE_UNDO_REDO_DESCRIPTION": "Jeśli się pomylisz, dotknij przycisk Cofnij, aby anulować ostatnią akcję. Dotknij Przywróć, aby przywrócić zmiany.", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT_DESCRIPTION": "Przeciągnij i połącz bloki kodu, aby stworzyć skrypt. Dotknij dowolnego miejsca skryptu, aby go uruchomić. Aby usunąć pojedynczy blok albo cały skrypt, wyciągnij go poza obszar programowania. Aby skopiować skrypt z jednej postaci do innej, przeciągnij go i upuść na miniaturę postaci.", + "INTERFACE_GUIDE_PROGRAMMING_AREA_DESCRIPTION": "W tym obszarze łączysz bloki kodu w skrypty, aby powiedzieć swoim postaciom co powinny robić.", + "INTERFACE_GUIDE_BLOCKS_PALETTE_DESCRIPTION": "To jest lista dostępnych bloków kodu. Przeciągnij blok do obszaru programowania, a następnie dotknij go i sprawdź jego działanie.", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES_DESCRIPTION": "W tym miejscu można wybrać kategorię bloków programowania: Bloki Uruchamiania (Żółty), Ruchu (Niebieski), Wyglądu (Fioletowy), Dźwięków (Zielony), Sterowania (Pomarańczowy), Bloki Kończenia (Czerwone). ", + "INTERFACE_GUIDE_CHARACTERS_DESCRIPTION": "Wybierz spośród postaci w swoim projekcie - lub dotknij plusa aby dodać nową. Po wybraniu postaci możesz edytować jej skrypty, dotknij jej nazwę, aby zmienić nazwę lub dotknij pędzla, aby ją edytować. Aby usunąć postać, dotknij ją i przytrzymaj. Aby skopiować postać na inną stronę, przeciągnij ją na miniaturę strony.", + "PAINT_GUIDE_UNDO": "{N, number} | Cofnij", + "PAINT_GUIDE_REDO": "{N, number} | Przywróć", + "PAINT_GUIDE_SHAPE": "{N, number} | Kształt", + "PAINT_GUIDE_CHARACTER_NAME": "{N, number} | Nazwa Postaci", + "PAINT_GUIDE_CUT": "{N, number} | Wytnij", + "PAINT_GUIDE_DUPLICATE": "{N, number} | Kopiuj", + "PAINT_GUIDE_ROTATE": "{N, number} | Obróć", + "PAINT_GUIDE_DRAG": "{N, number} | Przeciągnij", + "PAINT_GUIDE_SAVE": "{N, number} | Zapisz", + "PAINT_GUIDE_FILL": "{N, number} | Wypełnij", + "PAINT_GUIDE_CAMERA": "{N, number} | Aparat", + "PAINT_GUIDE_COLOR": "{N, number} | Kolor", + "PAINT_GUIDE_LINE_WIDTH": "{N, number} | Szerokość linii", + "PAINT_GUIDE_UNDO_DESCRIPTION": "Cofa ostatnią zmianę.", + "PAINT_GUIDE_REDO_DESCRIPTION": "Przywraca cofnięte zmiany.", + "PAINT_GUIDE_SHAPE_DESCRIPTION": "Wybierz kształt do rysowania: linię, koło/elipsę, prostokąt lub trójkąt.", + "PAINT_GUIDE_CHARACTER_NAME_DESCRIPTION": "Edytuj nazwę postaci.", + "PAINT_GUIDE_CUT_DESCRIPTION": "Wybierz narzędzie wycinania, a następnie dotknij postać lub kształt, aby go usunąć z obszaru roboczego.", + "PAINT_GUIDE_DUPLICATE_DESCRIPTION": "Wybierz narzędzie Kopiuj, a następnie dotknij wybranej postaci lub kształtu, aby je skopiować.", + "PAINT_GUIDE_ROTATE_DESCRIPTION": "Po wybraniu narzędzia Obróć, możesz obrócić postać lub kształt wokół jego środka.", + "PAINT_GUIDE_DRAG_DESCRIPTION": "Po wybraniu narzędzia Przeciągnij, można przeciągnąć postać lub kształt na ekranie. Jeśli klikniesz na kształt, możesz edytować kształt, przeciągając pojawiające się punkty.", + "PAINT_GUIDE_SAVE_DESCRIPTION": "Zapisz zmiany i zamknij Edytor Rysunków.", + "PAINT_GUIDE_FILL_DESCRIPTION": "Po wybraniu narzędzia Wypełnij, dotknij wybrany fragment postaci lub kształtu, aby wypełnić je aktualnym kolorem.", + "PAINT_GUIDE_CAMERA_DESCRIPTION": "Po wybraniu narzędzia Aparat, możesz wybrać dowolną część postaci lub kształtu, a następnie dotknąć przycisk aparatu by wypełnić tę sekcję nowym zdjęciem z aparatu.", + "PAINT_GUIDE_COLOR_DESCRIPTION": "Wybierz nowy kolor rysowania i wypełniania kształtów.", + "PAINT_GUIDE_LINE_WIDTH_DESCRIPTION": "Zmień szerokość linii kształtów, które rysujesz.", + "SAMPLE_Under the sea": "Podwodne życie", + "SAMPLE_Farm": "Farma", + "SAMPLE_Seasons": "Pory roku", + "SAMPLE_Friends": "Przyjaciele", + "SAMPLE_Dance": "Taniec", + "SAMPLE_Animal Race": "Wyścig zwierząt", + "SAMPLE_Bump": "Kaczki", + "SAMPLE_Quick Intro": "Szybkie wprowadzenie", + "SAMPLE_Star": "Gwiazda", + "SAMPLE_TEXT_key_character_cat": "Kot", + "SAMPLE_TEXT_key_character_star": "Gwiazda", + "SAMPLE_TEXT_key_character_teen_girl": "Nastolatka", + "SAMPLE_TEXT_key_character_teen_boy": "Nastolatek", + "SAMPLE_TEXT_key_farm_tap_them": "Dotknij ich", + "SAMPLE_TEXT_key_party_question": "Przyjęcie?", + "SAMPLE_TEXT_key_soccer_question": "A może mecz?", + "SAMPLE_TEXT_key_goal": "Gol!!!", + "SAMPLE_TEXT_key_under_the_sea_fish": "Ryba", + "SAMPLE_TEXT_key_under_the_sea_seahorse": "Konik morski", + "SAMPLE_TEXT_key_under_the_sea_starfish": "Rozgwiazda", + "SAMPLE_TEXT_key_farm_pig": "Świnia", + "SAMPLE_TEXT_key_farm_horse": "Koń", + "SAMPLE_TEXT_key_farm_chicken": "Kurczak", + "SAMPLE_TEXT_key_farm_barn": "Stodoła", + "SAMPLE_TEXT_key_seasons_summer": "Lato", + "SAMPLE_TEXT_key_seasons_fall": "Jesień", + "SAMPLE_TEXT_key_seasons_winter": "Zima", + "SAMPLE_TEXT_key_seasons_spring": "Wiosna", + "SAMPLE_TEXT_key_friends_cake": "Ciasto", + "SAMPLE_TEXT_key_friends_soccer_ball": "Piłka", + "SAMPLE_TEXT_key_friends_child": "Dziecko", + "SAMPLE_TEXT_key_friends_table": "Stół", + "SAMPLE_TEXT_key_friends_soccer_net": "Bramka", + "SAMPLE_TEXT_key_animalrace_elephant": "Słoń", + "SAMPLE_TEXT_key_animalrace_giraffe": "Żyrafa", + "SAMPLE_TEXT_key_animalrace_monkey": "Małpa", + "SAMPLE_TEXT_key_dance_scubadiver": "Płetwonurek", + "SAMPLE_TEXT_key_dance_snake": "Wąż", + "SAMPLE_TEXT_key_bump_yellow_duck": "Żółta Kaczka", + "SAMPLE_TEXT_key_bump_blue_duck": "Niebieska Kaczka", + "SAMPLE_TEXT_key_bump_green_duck": "Zielona Kaczka", + "SAMPLE_TEXT_key_quickintro_fish": "Ryba", + "SAMPLE_TEXT_key_quickintro_toc": "Toc", + "CHARACTER_Cat.svg": "Kot", + "CHARACTER_Cat2.svg": "Spacerujący Kot", + "CHARACTER_Blue.svg": "Tic", + "CHARACTER_Purple.svg": "Tac", + "CHARACTER_Red.svg": "Toc", + "CHARACTER_Dragon.svg": "Smok", + "CHARACTER_Fairy.svg": "Wróżka", + "CHARACTER_Wizard.svg": "Czarodziej", + "CHARACTER_Dog.svg": "Pies", + "CHARACTER_Rabbit.svg": "Królik", + "CHARACTER_Chicken.svg": "Kurczak", + "CHARACTER_Pig.svg": "Świnka", + "CHARACTER_Horse.svg": "Koń", + "CHARACTER_Zebra.svg": "Zebra", + "CHARACTER_Monkey.svg": "Małpa", + "CHARACTER_Elephant.svg": "Słoń", + "CHARACTER_Giraffe.svg": "Żyrafa", + "CHARACTER_Camel.svg": "Wielbłąd", + "CHARACTER_Butterfly.svg": "Motyl", + "CHARACTER_Fly.svg": "Mucha", + "CHARACTER_Bat.svg": "Nietoperz", + "CHARACTER_Bird.svg": "Ptak", + "CHARACTER_Snake.svg": "Wąż", + "CHARACTER_Lizard.svg": "Jaszczurka", + "CHARACTER_Frog.svg": "Żaba", + "CHARACTER_Duck.svg": "Kaczka", + "CHARACTER_Crab.svg": "Krab", + "CHARACTER_Seahorse.svg": "Konik Morski", + "CHARACTER_Starfish.svg": "Rozgwiazda", + "CHARACTER_Fish1.svg": "Ryba", + "CHARACTER_Fish2.svg": "Ryba", + "CHARACTER_Whale.svg": "Wieloryb", + "CHARACTER_Penguin.svg": "Pingwin", + "CHARACTER_PolarBear.svg": "Niedźwiedź Polarny", + "CHARACTER_Girl1.svg": "Dziecko", + "CHARACTER_Girl2.svg": "Dziecko", + "CHARACTER_Girl3.svg": "Dziecko", + "CHARACTER_Boy1.svg": "Dziecko", + "CHARACTER_Boy2.svg": "Dziecko", + "CHARACTER_Boy3.svg": "Dziecko", + "CHARACTER_TeenGirl1.svg": "Nastolatka", + "CHARACTER_TeenGirl2.svg": "Nastolatka", + "CHARACTER_TeenGirl3.svg": "Nastolatka", + "CHARACTER_TeenBoy1.svg": "Nastolatek", + "CHARACTER_TeenBoy2.svg": "Nastolatek", + "CHARACTER_TeenBoy3.svg": "Nastolatek", + "CHARACTER_Baby.svg": "Małe Dziecko", + "CHARACTER_Mother.svg": "Mama", + "CHARACTER_Father.svg": "Tata", + "CHARACTER_Grandmother.svg": "Babcia", + "CHARACTER_Grandfather.svg": "Dziadek", + "CHARACTER_Girl.svg": "Dziecko", + "CHARACTER_Boy.svg": "Dziecko", + "CHARACTER_Teen2.svg": "Nastolatka", + "CHARACTER_Teen3.svg": "Nastolatek", + "CHARACTER_Farmer1.svg": "Farmerka", + "CHARACTER_Farmer.svg": "Farmer", + "CHARACTER_Bike2.svg": "Rowerzystka", + "CHARACTER_Bike.svg": "Rowerzysta", + "CHARACTER_Car2.svg": "Kierowca", + "CHARACTER_Car1.svg": "Kierowca", + "CHARACTER_Aeroplane.svg": "Pilot", + "CHARACTER_Astronaut.svg": "Astronauta", + "CHARACTER_Inuit.svg": "Eskimos", + "CHARACTER_Scubadiver.svg": "Płetwonurek", + "CHARACTER_Rowboat.svg": "Wioślarz", + "CHARACTER_Tree1.svg": "Drzewo", + "CHARACTER_Tree3.svg": "Drzewo", + "CHARACTER_Tree4.svg": "Drzewo", + "CHARACTER_Evergreen.svg": "Drzewo", + "CHARACTER_Weed.svg": "Roślina", + "CHARACTER_Pasture.svg": "Wysoka Trawa", + "CHARACTER_Cactus.svg": "Kaktus", + "CHARACTER_Daffodil.svg": "Żonkile", + "CHARACTER_Daisy1.svg": "Stokrotka", + "CHARACTER_Daisy2.svg": "Stokrotka", + "CHARACTER_Daisy3.svg": "Stokrotka", + "CHARACTER_Tulip2.svg": "Tulipan", + "CHARACTER_Flowers.svg": "Kwiaty", + "CHARACTER_Apple.svg": "Jabłko", + "CHARACTER_Peach.svg": "Brzoskwinia", + "CHARACTER_Mushroom.svg": "Muchomor", + "CHARACTER_Star.svg": "Gwiazda", + "CHARACTER_Star2.svg": "Gwiazda", + "CHARACTER_Star3.svg": "Gwiazda", + "CHARACTER_ShootingStar.svg": "Spadająca Gwiazda", + "CHARACTER_Earth.svg": "Ziemia", + "CHARACTER_Planet.svg": "Planeta", + "CHARACTER_Sun.svg": "Słońce", + "CHARACTER_Moon.svg": "Księżyc w Pełni", + "CHARACTER_CrescentMoon.svg": "Księżyc", + "CHARACTER_Cloud1.svg": "Chmura", + "CHARACTER_Thundercloud.svg": "Chmura Burzowa", + "CHARACTER_Tornado.svg": "Tornado", + "CHARACTER_Barn.svg": "Stodoła", + "CHARACTER_Fort.svg": "Fort", + "CHARACTER_Castle.svg": "Zamek", + "CHARACTER_Igloo.svg": "Igloo", + "CHARACTER_House1.svg": "Dom", + "CHARACTER_House.svg": "Dom", + "CHARACTER_House3.svg": "Dom", + "CHARACTER_House4.svg": "Dom", + "CHARACTER_Apartment.svg": "Blok Mieszkalny", + "CHARACTER_School.svg": "Szkoła", + "CHARACTER_Shop.svg": "Sklep", + "CHARACTER_Fence.svg": "Płot", + "CHARACTER_Mailbox.svg": "Skrzynka Pocztowa", + "CHARACTER_Cake.svg": "Ciasto", + "CHARACTER_Ball.svg": "Piłka", + "CHARACTER_Basketball.svg": "Piłka do Kosza", + "CHARACTER_Soccerball.svg": "Piłka Nożna", + "CHARACTER_SoccerNet.svg": "Bramka", + "CHARACTER_Bed.svg": "Łóżko", + "CHARACTER_NightTable.svg": "Szafka Nocna", + "CHARACTER_Stool.svg": "Taboret", + "CHARACTER_Table.svg": "Stół", + "CHARACTER_Car.svg": "Samochód", + "CHARACTER_Bus.svg": "Autobus", + "CHARACTER_SailBoat.svg": "Żaglówka", + "CHARACTER_Boat2.svg": "Statek", + "CHARACTER_Rocket.svg": "Rakieta", + "BACKGROUND_Farm.svg": "Farma", + "BACKGROUND_Park.svg": "Park", + "BACKGROUND_Suburbs.svg": "Przedmieścia", + "BACKGROUND_City.svg": "Miasto", + "BACKGROUND_Library.svg": "Biblioteka", + "BACKGROUND_Classroom.svg": "Klasa", + "BACKGROUND_Theatre.svg": "Teatr", + "BACKGROUND_Gym.svg": "Sala Gimnastyczna", + "BACKGROUND_Gym2.svg": "Sala Gimnastyczna", + "BACKGROUND_Bedroom.svg": "Sypialnia", + "BACKGROUND_EmptyRoom.svg": "Pusty Pokój", + "BACKGROUND_Summer.svg": "Lato", + "BACKGROUND_Fall.svg": "Jesień", + "BACKGROUND_Winter.svg": "Zima", + "BACKGROUND_Spring.svg": "Wiosna", + "BACKGROUND_Creek.svg": "Rzeka", + "BACKGROUND_Lake.svg": "Jezioro", + "BACKGROUND_Woods.svg": "Las", + "BACKGROUND_BeachDay.svg": "Dzień na Plaży", + "BACKGROUND_BeachSunrise.svg": "Zachód Słońca na Plaży", + "BACKGROUND_BeachNight.svg": "Noc na Plaży", + "BACKGROUND_Underwater.svg": "Pod Wodą", + "BACKGROUND_Jungle.svg": "Dżungla", + "BACKGROUND_Savannah.svg": "Sawanna", + "BACKGROUND_Desert.svg": "Pustynia", + "BACKGROUND_Arctic.svg": "Antarktyda", + "BACKGROUND_Space.svg": "Kosmos", + "BACKGROUND_MoonBkg.svg": "Księżyc", + "BLOCK_DESC_GREEN_FLAG": "START OD ZIELONEJ FLAGI", + "BLOCK_DESC_ON_TAP": "START PO DOTKNIĘCIU {CHARACTER_NAME}", + "BLOCK_DESC_ON_BUMP": "START PO ZDERZENIU Z {CHARACTER_NAME}", + "BLOCK_DESC_MESSAGE_COLOR_ORANGE": "pomarańczowej", + "BLOCK_DESC_ON_MESSAGE": "START PO OTRZYMANIU {COLOR} WIADOMOŚCI", + "BLOCK_DESC_SEND_MESSAGE": "WYSŁANIE {COLOR} WIADOMOŚĆ STARTU", + "BLOCK_DESC_MOVE_RIGHT": "PRZESUŃ W PRAWO", + "BLOCK_DESC_MOVE_LEFT": "PRZESUŃ W LEWO", + "BLOCK_DESC_MOVE_UP": "PRZESUŃ W GÓRĘ", + "BLOCK_DESC_MOVE_DOWN": "PRZESUŃ W DÓŁ", + "BLOCK_DESC_TURN_RIGHT": "OBRÓĆ W PRAWO", + "BLOCK_DESC_TURN_LEFT": "OBRÓĆ W LEWO", + "BLOCK_DESC_HOP": "SKOK", + "BLOCK_DESC_GO_HOME": "WRÓĆ DO POZYCJI POCZĄTKOWEJ", + "BLOCK_DESC_SAY": "POWIEDZ", + "BLOCK_DESC_GROW": "POWIĘKSZ", + "BLOCK_DESC_SHRINK": "ZMNIEJSZ", + "BLOCK_DESC_RESET_SIZE": "RESETUJ ROZMIAR", + "BLOCK_DESC_HIDE": "UKRYJ", + "BLOCK_DESC_SHOW": "POKAŻ", + "BLOCK_DESC_PLAY_SOUND": "ODTWÓRZ {SOUND_NAME}", + "BLOCK_DESC_PLAY_SOUND_POP": "pop", + "BLOCK_DESC_PLAY_RECORDED_SOUND": "ODTWÓRZ NAGRANY DŹWIĘK", + "BLOCK_DESC_WAIT": "CZEKAJ", + "BLOCK_DESC_STOP": "ZATRZYMAJ {CHARACTER_NAME}", + "BLOCK_DESC_SET_SPEED": "USTAW PRĘDKOŚĆ", + "BLOCK_DESC_REPEAT": "POWTÓRZ", + "BLOCK_DESC_END": "KONIEC", + "BLOCK_DESC_REPEAT_FOREVER": "POWTARZAJ ZAWSZE", + "BLOCK_DESC_GO_TO_PAGE": "IDŹ DO STRONY {PAGE}", + "SHARING_BY_EMAIL": "Udostępnij przez e-mail", + "SHARING_BY_AIRDROP": "Udostępnij przez Airdrop", + "SHARING_EMAIL_SUBJECT": "Projekt ScratchJr: {PROJECT_NAME}", + "SHARING_EMAIL_TEXT": "Kliknij ikonę, aby wypróbować mój projekt ScratchJr na iPadzie lub tablecie Android!

Jeśli nie masz aplikacji ScratchJr, możesz ją pobrać ze sklepu Apple App lub sklepu Google Play.

Za pomocą ScratchJr, dzieci mogą tworzyć własne interaktywne opowiadania i gry. Aby dowiedzieć się więcej, zobacz scratchjr.org.", + "FOR_PARENTS": "Dla rodziców", + "PARENTAL_GATE_EXPLANATION": "Dlaczego o to pytamy? Osoba dorosła musi wyrazić zgodę na wysłanie projektu.", + "GRID_NUMBER": "{N, number}", + "NEW_PROJECT_PREFIX": "Projekt", + "LIBRARY_CHARACTER": "Postać", + "LIBRARY_BACKGROUND": "Tło", + "SAY_BLOCK_DEFAULT_ARGUMENT": "cześć", + "ALERT_BACK": "Wróć", + "ALERT_SAVING": "Zapisywanie...", + "SELECT_LANGUAGE": "Wybierz język", + "USAGE_QUESTION": "Gdzie używasz ScratchJr?", + "USAGE_SCHOOL": "Szkoła", + "USAGE_HOME": "Dom", + "USAGE_OTHER": "Inne", + "USAGE_NONE": "Nie pytaj ponownie" +} \ No newline at end of file diff --git a/editions/free/src/localizations/pt-br.json b/editions/free/src/localizations/pt-br.json new file mode 100644 index 00000000..638f1d4e --- /dev/null +++ b/editions/free/src/localizations/pt-br.json @@ -0,0 +1,380 @@ +{ + "MY_PROJECTS": "Meus Projetos", + "QUICK_INTRO": "Introdução rápida ao ScratchJr", + "SAMPLE_PROJECTS": "Projetos de Exemplo", + "ABOUT_SCRATCHJR": "Sobre o ScratchJr", + "INTERFACE_GUIDE": "Guia da Interface", + "PAINT_EDITOR_GUIDE": "Guia do Editor de Pintura", + "BLOCKS_GUIDE": "Guia dos Blocos", + "ABOUT_WHAT_IS": "O que é ScratchJr?", + "ABOUT_DESCRIPTION": "ScratchJr é uma linguagem de programação introdutória que permite às crianças pequenas (entre 5-7 anos) criar seus próprios jogos e histórias interativas. As crianças encaixam blocos visuais de programação para fazer com que os personagens se movam, pulem, dancem e cantem. As crianças podem modificar os personagens no editor de pintura, adicionar sua própria voz ou outros sons e até incluir fotos delas mesmas para então usar os blocos de programação a fim de fazer seus personagens ganharem vida. ", + "ABOUT_INSPIRED_BY": "ScratchJr foi inspirado na popular linguagem de programação Scratch (http://scratch.mit.edu) que é usada por milhões de jovens (acima de 8 anos de idade) em todo o mundo. Ao criar ScratchJr nós redesenhamos a interface e a linguagem de programação para torná-las apropriadas para crianças pequenas e cuidadosamente desenvolvemos recursos que correspondem ao nível de desenvolvimento cognitivo, pessoal, social e emocional de crianças nesta fase.

ScratchJr está disponível como um aplicativo gratuito tanto para iPad quanto para tablets Android. Para maiores informações sobre ScratchJr acesse http://scratchjr.org", + "ABOUT_WHY_CREATE": "Por Que Nós Criamos ScratchJr?", + "ABOUT_WHY_CREATE_DESCRIPTION": "Programação (ou programação de computadores) é um novo tipo de alfabetização. Assim como escrever nos ajuda a organizar nosso pensamento e a expressar nossas ideias, o mesmo é verdade para a programação. No passado, programação era visto como algo muito complicado para a maioria das pessoas. Mas nós acreditamos que, assim como o ato de escrever, todos podem programar.

Quando crianças pequenas programam com ScratchJr, elas aprendem como criar e se expressar por meio do computador e não apenas como interagir com ele. Durante este processo as crianças aprendem como resolver problemas e como desenvolver projetos, e assim desenvolvem progressivamente habilidades que serão mais tarde vitais para seu processo acadêmico. Elas também empregam linguagem matemática em um contexto motivador e significativo, que apoia o desenvolvimento na primeira infância da alfabetização matemática. Com ScratchJr as crianças não estão apenas aprendendo a programar, elas estão programando para aprender.", + "ABOUT_WHO_CREATED": "Quem criou o ScratchJr?", + "ABOUT_WHO_CREATED_DESCRIPTION": "O ScratchJr é uma colaboração entre a Developmental Technologies (DevTech) Research Group na Eliot-Pearson Department of Child Study e a Human Development na Tufts University (liderado por Marina Umaschi Bers, com contribuições de Amanda Strawhacker, Claire Caine, Louise Flannery, Elizabeth Kazakoff, e Dylan Portelance), o grupo Lifelong Kindergarten no MIT Media Lab (liderado por Mitchel Resnick, com contribuições de Chris Garrity, Tim Mickel, Carl Bowman, Champika Fernando, Natalie Rusk, Sayamindu Dasgupta, e Chris Graves), e a Playful Invention Company (liderado por Paula Bontá e Brian Silverman, com contribuições de Jack Geddes e Adrian Gabriel). A versão Android do ScratchJr foi implementada por Two Sigma (liderada por Mark Roth, com contribuições de Kevin Hu), com ajuda de Benesse Corp.

Os gráficos e ilustrações para o ScratchJr foram criadas por HvingtQuatre Company (liderado por Julien Gelifier e Adrien Valesa), Sarah Thomson, Peter Mueller, e Jillian Lombardi. Paula Aguilera do MIT Media Lab produziu o vídeo do ScratchJr. Também gostaríamos de agradecer todo mundo que participou nas comunidades de beta-test para iPad e Android, particularmente Sergio Antolinez, Vandendaele Didier, e Sjoerd Dirk Meijer.", + "ABOUT_WHO_SUPPORTED": "Quem apoia o ScrathJr?", + "ABOUT_WHO_SUPPORTED_DESCRIPTION": "O projeto ScratchJr recebeu generoso apoio financeiro da National Science Foundation (NSF DRL-1118664), Scratch Foundation, LEGO Foundation e British Telecommunications.

Se você usufrui deste aplicativo gratuitamente, considere fazer uma doação à Scratch Foundation (www.scratchfoundation.org), uma organização sem fins lucrativos que provê apoio permanente ao ScratchJr. Nós apreciamos doações de qualquer valor, grande ou pequeno.

Apoiadores Platinum da campanha no Kickstarter do ScratchJr: Jeremy Deutsch, Kenneth Ehlert, Catherine Greenspon, Mark Loughridge, JoAnn Gantz Bendetson e Shirley Resnick.

Outros apoiadores da campanha no Kickstarter do ScratchJr.", + "BLOCKS_TRIGGERING_BLOCKS": "Blocos de Acionamento", + "BLOCKS_GREEN_FLAG": "Iniciar na Bandeira Verde", + "BLOCKS_GREEN_FLAG_DESCRIPTION": "Iniciar o script ao tocar na Bandeira Verde.", + "BLOCKS_ON_TAP": "Tocar para iniciar", + "BLOCKS_ON_TAP_DESCRIPTION": "Iniciar o script ao tocar no personagem.", + "BLOCKS_ON_TOUCH": "Iniciar ao tocar", + "BLOCKS_ON_TOUCH_DESCRIPTION": "Iniciar o script quando o personagem toca em outro personagem", + "BLOCKS_ON_MESSAGE": "Iniciar na Mensagem.", + "BLOCKS_ON_MESSAGE_DESCRIPTION": "Iniciar o script sempre que uma mensagem de certa cor é enviada.", + "BLOCKS_SEND_MESSAGE": "Enviar Mensagem", + "BLOCKS_SEND_MESSAGE_DESCRIPTION": "Envia uma mensagem da cor especificada.", + "BLOCKS_MOTION_BLOCKS": "Blocos de Movimento", + "BLOCKS_MOVE_RIGHT": "Mover para direita", + "BLOCKS_MOVE_RIGHT_DESCRIPTION": "Mover o personagem para a direita de acordo com o número de quadrados especificado.", + "BLOCKS_MOVE_LEFT": "Mover para esquerda", + "BLOCKS_MOVE_LEFT_DESCRIPTION": "Mover o personagem para a esquerda de acordo com o número de quadrados especificado.", + "BLOCKS_MOVE_UP": "Mover para cima.", + "BLOCKS_MOVE_UP_DESCRIPTION": "Mover o personagem para cima de acordo com o número de quadrados especificado.", + "BLOCKS_MOVE_DOWN": "Mover para baixo", + "BLOCKS_MOVE_DOWN_DESCRIPTION": "Mover o personagem para baixo de acordo com o número de quadrados especificado.", + "BLOCKS_TURN_RIGHT": "Girar para direita", + "BLOCKS_TURN_RIGHT_DESCRIPTION": "Rotaciona o personagem no sentido horário em uma quantidade especificada. Girar 12 vezes equivale a uma rotação completa.", + "BLOCKS_TURN_LEFT": "Girar para esquerda", + "BLOCKS_TURN_LEFT_DESCRIPTION": "Rotaciona o personagem no sentido anti-horário em uma quantidade especificada. Girar 12 vezes equivale a uma rotação completa.", + "BLOCKS_HOP": "Pular", + "BLOCKS_HOP_DESCRIPTION": "Mover o personagem por um número específico de quadrados unitários para cima e então movê-lo para baixo novamente.", + "BLOCKS_GO_HOME": "Ir para Casa", + "BLOCKS_GO_HOME_DESCRIPTION": "Retorna o personagem para a sua posição inicial. (Para criar uma nova posição inicial, arraste o personagem para a nova posição).", + "BLOCKS_LOOKS_BLOCKS": "Blocos de Aparência", + "BLOCKS_SAY": "Falar", + "BLOCKS_SAY_DESCRIPTION": "Mostra uma mensagem específica em um balão acima do personagem.", + "BLOCKS_GROW": "Crescer", + "BLOCKS_GROW_DESCRIPTION": "Aumenta o tamanho do personagem.", + "BLOCKS_SHRINK": "Encolher", + "BLOCKS_SHRINK_DESCRIPTION": "Reduz o tamanho do personagem.", + "BLOCKS_RESET_SIZE": "Redefinir tamanho", + "BLOCKS_RESET_SIZE_DESCRIPTION": "Retorna o personagem ao seu tamanho padrão.", + "BLOCKS_HIDE": "Ocultar", + "BLOCKS_HIDE_DESCRIPTION": "Desvanece o personagem até ele ficar invisível.", + "BLOCKS_SHOW": "Mostrar", + "BLOCKS_SHOW_DESCRIPTION": "Intensifica a imagem do personagem até ficar completamente visível.", + "BLOCKS_SOUND_BLOCKS": "Blocos Sonoros", + "BLOCKS_POP": "Pop", + "BLOCKS_POP_DESCRIPTION": "Tocar um som de \"Pop\".", + "BLOCKS_PLAY_RECORDED": "Tocar som gravado", + "BLOCKS_PLAY_RECORDED_DESCRIPTION": "Tocar um som gravado pelo usuário.", + "BLOCKS_CONTROL_BLOCKS": "Blocos de Controle", + "BLOCKS_WAIT": "Aguardar", + "BLOCKS_WAIT_DESCRIPTION": "Pausa o script por um período de tempo especificado (em décimos de segundo).", + "BLOCKS_STOP": "Parar", + "BLOCKS_STOP_DESCRIPTION": "Parar os scripts de todos os personagens.", + "BLOCKS_SET_SPEED": "Definir a velocidade", + "BLOCKS_SET_SPEED_DESCRIPTION": "Alterar a taxa com que certos blocos são executados.", + "BLOCKS_REPEAT": "Repetir", + "BLOCKS_REPEAT_DESCRIPTION": "Executar os blocos por um número específico de vezes.", + "BLOCKS_END_BLOCKS": "Blocos de Encerramento", + "BLOCKS_END": "Finalizar", + "BLOCKS_END_DESCRIPTION": "Indicar o fim do script (mas não afeta o script de qualquer forma).", + "BLOCKS_REPEAT_FOREVER": "Repetir eternamente", + "BLOCKS_REPEAT_FOREVER_DESCRIPTION": "Executar o script infinitas vezes.", + "BLOCKS_GO_TO_PAGE": "Ir para página", + "BLOCKS_GO_TO_PAGE_DESCRIPTION": "Mudar para uma página específica do projeto.", + "INTERFACE_GUIDE_NUMBER": "{N, number}", + "INTERFACE_GUIDE_SAVE": "{N, number} | Salvar", + "INTERFACE_GUIDE_STAGE": "{N, number} | Palco", + "INTERFACE_GUIDE_PRESENTATION_MODE": "{N, number} | Modo de Apresentação", + "INTERFACE_GUIDE_GRID": "{N, number} | Grade", + "INTERFACE_GUIDE_CHANGE_BG": "{N, number} | Mudar fundo", + "INTERFACE_GUIDE_ADD_TEXT": "{N, number} | Adicionar texto", + "INTERFACE_GUIDE_RESET_CHAR": "{N, number} | Redefinir personagens", + "INTERFACE_GUIDE_GREEN_FLAG": "{N, number} | Bandeira Verde", + "INTERFACE_GUIDE_PAGES": "{N, number} | Páginas", + "INTERFACE_GUIDE_PROJECT_INFO": "{N, number} | Informações do Projeto", + "INTERFACE_GUIDE_UNDO_REDO": "{N, number} | Desfazer e Refazer", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT": "{N, number} | Programacão de Script", + "INTERFACE_GUIDE_PROGRAMMING_AREA": "{N, number} | Área de Programação", + "INTERFACE_GUIDE_BLOCKS_PALETTE": "{N, number} | Paleta de Blocos", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES": "{N, number} | Categorias de Blocos", + "INTERFACE_GUIDE_CHARACTERS": "{N, number} | Personagens", + "INTERFACE_GUIDE_SAVE_DESCRIPTION": "Salvar o projeto atual e retornar à página inicial.", + "INTERFACE_GUIDE_STAGE_DESCRIPTION": "É onde a ação ocorre no projeto. Para excluir um personagem, mantenha o toque.", + "INTERFACE_GUIDE_PRESENTATION_MODE_DESCRIPTION": "Expandir o palco para tela cheia.", + "INTERFACE_GUIDE_GRID_DESCRIPTION": "Ativar (e desativar) a grade de coordenadas x-y.", + "INTERFACE_GUIDE_CHANGE_BG_DESCRIPTION": "Selecionar ou criar uma imagem de fundo para o palco.", + "INTERFACE_GUIDE_ADD_TEXT_DESCRIPTION": "Escrever títulos ou rótulos no palco.", + "INTERFACE_GUIDE_RESET_CHAR_DESCRIPTION": "Redefine todos os personagens para a posição inicial no palco. (Arraste os personagens para definir novas posições iniciais).", + "INTERFACE_GUIDE_GREEN_FLAG_DESCRIPTION": "Iniciar todos os scripts que começam com o bloco \"Iniciar com a Bandeira Verde\".", + "INTERFACE_GUIDE_PAGES_DESCRIPTION": "Selecionar entre as páginas no seu projeto — ou tocar no símbolo de adição para adicionar uma nova página. Cada página tem seu próprio conjunto de personagens e plano d fundo. Para excluir uma página, pressione e segure-a. Para reordenar as páginas, arraste-as para novas posições.", + "INTERFACE_GUIDE_PROJECT_INFO_DESCRIPTION": "Alterar o título do projeto, ver quando o projeto foi criado e compartilhar o projeto (se seu dispositivo permitir).", + "INTERFACE_GUIDE_UNDO_REDO_DESCRIPTION": "Se você errar, toque Desfazer e volte no tempo, revertendo a última ação. Toque em Refazer para reverter o último Desfazer.", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT_DESCRIPTION": "Junte blocos para fazer um script de programação, dizendo ao personagem o que fazer. Toque em qualquer lugar em um script para executá-lo. Para excluir um bloco ou script, arraste-o para fora da área de programação. Para copiar um bloco ou script de um personagem para outro, arraste-o para a miniatura do personagem.", + "INTERFACE_GUIDE_PROGRAMMING_AREA_DESCRIPTION": "Aqui é onde você conecta blocos de programação para criar scripts, que dizem ao personagem o que fazer.", + "INTERFACE_GUIDE_BLOCKS_PALETTE_DESCRIPTION": "Este é o menu dos blocos de programação. Arraste os blocos para a área de programação, então toque neles para ver o que eles fazem.", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES_DESCRIPTION": "Aqui é onde você pode selecionar uma categoria de blocos de programação: Blocos de Gatilho (amarelos), Movimento (Azul), Visual (Roxo), Sons (Verde), Controle (Laranja) e Blocos de Encerramento (Vermelho).", + "INTERFACE_GUIDE_CHARACTERS_DESCRIPTION": "Selecione entre os personagens no seu projeto — ou toque no sinal de adição para adicionar um novo. Uma vez que um personagem é selecionado, você pode editar os scripts dele, toque no seu nome para renomeá-lo, ou toque no pincel para alterar sua imagem. Para excluir um personagem, pressione e segure-o. Para copiar um personagem para uma outra página, arraste-o para a miniatura da página.", + "PAINT_GUIDE_UNDO": "{N, number} | Desfazer", + "PAINT_GUIDE_REDO": "{N, number} | Refazer", + "PAINT_GUIDE_SHAPE": "{N, number} | Forma", + "PAINT_GUIDE_CHARACTER_NAME": "{N, number} | Nome do Personagem", + "PAINT_GUIDE_CUT": "{N, number} | Cortar", + "PAINT_GUIDE_DUPLICATE": "{N, number} | Duplicar", + "PAINT_GUIDE_ROTATE": "{N, number} | Rotacionar", + "PAINT_GUIDE_DRAG": "{N, number} | Arrastar", + "PAINT_GUIDE_SAVE": "{N, number} | Salvar", + "PAINT_GUIDE_FILL": "{N, number} | Preencher", + "PAINT_GUIDE_CAMERA": "{N, number} | Câmera", + "PAINT_GUIDE_COLOR": "{N, number} | Cor", + "PAINT_GUIDE_LINE_WIDTH": "{N, number} | Largura da linha", + "PAINT_GUIDE_UNDO_DESCRIPTION": "Reverte a alteração mais recente.", + "PAINT_GUIDE_REDO_DESCRIPTION": "Reverte o desfazer mais recente.", + "PAINT_GUIDE_SHAPE_DESCRIPTION": "Escolher uma forma para desenhar: linha, círculo/elipse, retângulo ou triângulo.", + "PAINT_GUIDE_CHARACTER_NAME_DESCRIPTION": "Editar o nome do personagem.", + "PAINT_GUIDE_CUT_DESCRIPTION": "Após selecionar a ferramenta de recortar, você pode tocar num personagem ou forma para removê-lo da tela.", + "PAINT_GUIDE_DUPLICATE_DESCRIPTION": "Após selecionar a ferramenta Duplicar, você pode tocar em um personagem ou forma para criar uma cópia.", + "PAINT_GUIDE_ROTATE_DESCRIPTION": "Após selecionar a ferramenta de rotacionar, você pode rotacionar uma personagem ou forma ao redor de seu centro.", + "PAINT_GUIDE_DRAG_DESCRIPTION": "Após selecionar a ferramenta de arrastar, você pode arrastar um personagem ou forma na tela. Se você tocar numa forma, você pode então alterar a forma arrastando para os pontos que aparecem.", + "PAINT_GUIDE_SAVE_DESCRIPTION": "Salvar as mudanças e sair do Editor de Pintura.", + "PAINT_GUIDE_FILL_DESCRIPTION": "Após selecionar a ferramenta Preenchimento, você pode tocar qualquer seção de um personagem ou forma e preenchê-la com a cor selecionada.", + "PAINT_GUIDE_CAMERA_DESCRIPTION": "Após selecionar a ferramenta de câmera, você pode tocar em qualquer seção de um personagem ou forma e então tocar no botão de câmera para preencher a seção com uma nova foto tirada com a câmera.", + "PAINT_GUIDE_COLOR_DESCRIPTION": "Selecionar uma nova cor para desenhar ou preencher formas.", + "PAINT_GUIDE_LINE_WIDTH_DESCRIPTION": "Mudar a largura das linhas nas formas que você está desenhando.", + "SAMPLE_Under the sea": "Abaixo da superfície do mar", + "SAMPLE_Farm": "Propriedade rural", + "SAMPLE_Seasons": "Estações", + "SAMPLE_Friends": "Amigos", + "SAMPLE_Dance": "Dançar", + "SAMPLE_Animal Race": "Corrida de animais", + "SAMPLE_Bump": "Colidir", + "SAMPLE_Quick Intro": "Introdução rápida", + "SAMPLE_Star": "Estrela", + "SAMPLE_TEXT_key_character_cat": "Gato", + "SAMPLE_TEXT_key_character_star": "Estrela", + "SAMPLE_TEXT_key_character_teen_girl": "Adolescente", + "SAMPLE_TEXT_key_character_teen_boy": "Adolescente", + "SAMPLE_TEXT_key_farm_tap_them": "Toque neles", + "SAMPLE_TEXT_key_party_question": "Festa?", + "SAMPLE_TEXT_key_soccer_question": "Ou futebol?", + "SAMPLE_TEXT_key_goal": "Gol!!", + "SAMPLE_TEXT_key_under_the_sea_fish": "Peixe", + "SAMPLE_TEXT_key_under_the_sea_seahorse": "Cavalo Marinho", + "SAMPLE_TEXT_key_under_the_sea_starfish": "Estrela do Mar", + "SAMPLE_TEXT_key_farm_pig": "Porco", + "SAMPLE_TEXT_key_farm_horse": "Cavalo", + "SAMPLE_TEXT_key_farm_chicken": "Galinha", + "SAMPLE_TEXT_key_farm_barn": "Celeiro", + "SAMPLE_TEXT_key_seasons_summer": "Verão", + "SAMPLE_TEXT_key_seasons_fall": "Outono", + "SAMPLE_TEXT_key_seasons_winter": "Inverno", + "SAMPLE_TEXT_key_seasons_spring": "Primavera", + "SAMPLE_TEXT_key_friends_cake": "Bolo", + "SAMPLE_TEXT_key_friends_soccer_ball": "Bola de futebol", + "SAMPLE_TEXT_key_friends_child": "Criança", + "SAMPLE_TEXT_key_friends_table": "Mesa", + "SAMPLE_TEXT_key_friends_soccer_net": "Rede da goleira", + "SAMPLE_TEXT_key_animalrace_elephant": "Elefante", + "SAMPLE_TEXT_key_animalrace_giraffe": "Girafa", + "SAMPLE_TEXT_key_animalrace_monkey": "Macaco", + "SAMPLE_TEXT_key_dance_scubadiver": "Mergulhador", + "SAMPLE_TEXT_key_dance_snake": "Cobra", + "SAMPLE_TEXT_key_bump_yellow_duck": "Pato Amarelo", + "SAMPLE_TEXT_key_bump_blue_duck": "Pato Azul", + "SAMPLE_TEXT_key_bump_green_duck": "Pato Verde", + "SAMPLE_TEXT_key_quickintro_fish": "Peixe", + "SAMPLE_TEXT_key_quickintro_toc": "Toc", + "CHARACTER_Cat.svg": "Gato", + "CHARACTER_Cat2.svg": "Gato andando", + "CHARACTER_Blue.svg": "Tic", + "CHARACTER_Purple.svg": "Tac", + "CHARACTER_Red.svg": "Toc", + "CHARACTER_Dragon.svg": "Dragão", + "CHARACTER_Fairy.svg": "Fada", + "CHARACTER_Wizard.svg": "Mágico", + "CHARACTER_Dog.svg": "Cachorro", + "CHARACTER_Rabbit.svg": "Coelho", + "CHARACTER_Chicken.svg": "Galinha", + "CHARACTER_Pig.svg": "Porco", + "CHARACTER_Horse.svg": "Cavalo", + "CHARACTER_Zebra.svg": "Zebra", + "CHARACTER_Monkey.svg": "Macaco", + "CHARACTER_Elephant.svg": "Elefante", + "CHARACTER_Giraffe.svg": "Girafa", + "CHARACTER_Camel.svg": "Camelo", + "CHARACTER_Butterfly.svg": "Borboleta", + "CHARACTER_Fly.svg": "Mosca", + "CHARACTER_Bat.svg": "Morcego", + "CHARACTER_Bird.svg": "Pássaro", + "CHARACTER_Snake.svg": "Cobra", + "CHARACTER_Lizard.svg": "Lagarto", + "CHARACTER_Frog.svg": "Sapo", + "CHARACTER_Duck.svg": "Pato", + "CHARACTER_Crab.svg": "Caranguejo", + "CHARACTER_Seahorse.svg": "Cavalo marinho", + "CHARACTER_Starfish.svg": "Estrela do mar", + "CHARACTER_Fish1.svg": "Peixe", + "CHARACTER_Fish2.svg": "Peixe", + "CHARACTER_Whale.svg": "Baleia", + "CHARACTER_Penguin.svg": "Pinguim", + "CHARACTER_PolarBear.svg": "Urso polar", + "CHARACTER_Girl1.svg": "Criança", + "CHARACTER_Girl2.svg": "Criança", + "CHARACTER_Girl3.svg": "Criança", + "CHARACTER_Boy1.svg": "Criança", + "CHARACTER_Boy2.svg": "Criança", + "CHARACTER_Boy3.svg": "Criança", + "CHARACTER_TeenGirl1.svg": "Adolescente", + "CHARACTER_TeenGirl2.svg": "Adolescente", + "CHARACTER_TeenGirl3.svg": "Adolescente", + "CHARACTER_TeenBoy1.svg": "Adolescente", + "CHARACTER_TeenBoy2.svg": "Adolescente", + "CHARACTER_TeenBoy3.svg": "Adolescente", + "CHARACTER_Baby.svg": "Bebê", + "CHARACTER_Mother.svg": "Mãe", + "CHARACTER_Father.svg": "Pai", + "CHARACTER_Grandmother.svg": "Avó", + "CHARACTER_Grandfather.svg": "Avô", + "CHARACTER_Girl.svg": "Criança", + "CHARACTER_Boy.svg": "Criança", + "CHARACTER_Teen2.svg": "Adolescente", + "CHARACTER_Teen3.svg": "Adolescente", + "CHARACTER_Farmer1.svg": "Agricultor", + "CHARACTER_Farmer.svg": "Agricultor", + "CHARACTER_Bike2.svg": "Ciclista", + "CHARACTER_Bike.svg": "Ciclista", + "CHARACTER_Car2.svg": "Motorista", + "CHARACTER_Car1.svg": "Motorista", + "CHARACTER_Aeroplane.svg": "Piloto", + "CHARACTER_Astronaut.svg": "Astronauta", + "CHARACTER_Inuit.svg": "Nortista", + "CHARACTER_Scubadiver.svg": "Mergulhador", + "CHARACTER_Rowboat.svg": "Remador", + "CHARACTER_Tree1.svg": "Árvore", + "CHARACTER_Tree3.svg": "Árvore", + "CHARACTER_Tree4.svg": "Árvore", + "CHARACTER_Evergreen.svg": "Árvore", + "CHARACTER_Weed.svg": "Planta", + "CHARACTER_Pasture.svg": "Grama alta", + "CHARACTER_Cactus.svg": "Cacto", + "CHARACTER_Daffodil.svg": "Narcisos", + "CHARACTER_Daisy1.svg": "Margarida", + "CHARACTER_Daisy2.svg": "Margarida", + "CHARACTER_Daisy3.svg": "Margarida", + "CHARACTER_Tulip2.svg": "Tulipa", + "CHARACTER_Flowers.svg": "Flores", + "CHARACTER_Apple.svg": "Maça", + "CHARACTER_Peach.svg": "Pêssego", + "CHARACTER_Mushroom.svg": "Cogumelo", + "CHARACTER_Star.svg": "Estrela", + "CHARACTER_Star2.svg": "Estrela", + "CHARACTER_Star3.svg": "Estrela", + "CHARACTER_ShootingStar.svg": "Estrela cadente", + "CHARACTER_Earth.svg": "Terra", + "CHARACTER_Planet.svg": "Planeta", + "CHARACTER_Sun.svg": "Sol", + "CHARACTER_Moon.svg": "Lua Cheia", + "CHARACTER_CrescentMoon.svg": "Lua", + "CHARACTER_Cloud1.svg": "Nuvem", + "CHARACTER_Thundercloud.svg": "Nuvem de tempestade", + "CHARACTER_Tornado.svg": "Tornado", + "CHARACTER_Barn.svg": "Celeiro", + "CHARACTER_Fort.svg": "Forte", + "CHARACTER_Castle.svg": "Castelo", + "CHARACTER_Igloo.svg": "Iglu", + "CHARACTER_House1.svg": "Casa", + "CHARACTER_House.svg": "Casa", + "CHARACTER_House3.svg": "Casa", + "CHARACTER_House4.svg": "Casa", + "CHARACTER_Apartment.svg": "Apartamento", + "CHARACTER_School.svg": "Escola", + "CHARACTER_Shop.svg": "Loja", + "CHARACTER_Fence.svg": "Cerca", + "CHARACTER_Mailbox.svg": "Caixa de Correio", + "CHARACTER_Cake.svg": "Bolo", + "CHARACTER_Ball.svg": "Bola", + "CHARACTER_Basketball.svg": "Basquete", + "CHARACTER_Soccerball.svg": "Bola de futebol", + "CHARACTER_SoccerNet.svg": "Rede da goleira", + "CHARACTER_Bed.svg": "Cama", + "CHARACTER_NightTable.svg": "Mesa Noturna", + "CHARACTER_Stool.svg": "Tamborete", + "CHARACTER_Table.svg": "Mesa", + "CHARACTER_Car.svg": "Carro", + "CHARACTER_Bus.svg": "Ônibus", + "CHARACTER_SailBoat.svg": "Barco", + "CHARACTER_Boat2.svg": "Barco", + "CHARACTER_Rocket.svg": "Foguete", + "BACKGROUND_Farm.svg": "Propriedade rural", + "BACKGROUND_Park.svg": "Parque", + "BACKGROUND_Suburbs.svg": "Subúrbios", + "BACKGROUND_City.svg": "Cidade", + "BACKGROUND_Library.svg": "Biblioteca", + "BACKGROUND_Classroom.svg": "Sala de aula", + "BACKGROUND_Theatre.svg": "Teatro", + "BACKGROUND_Gym.svg": "Ginásio", + "BACKGROUND_Gym2.svg": "Ginásio", + "BACKGROUND_Bedroom.svg": "Dormitório", + "BACKGROUND_EmptyRoom.svg": "Sala vazia", + "BACKGROUND_Summer.svg": "Verão", + "BACKGROUND_Fall.svg": "Outono", + "BACKGROUND_Winter.svg": "Inverno", + "BACKGROUND_Spring.svg": "Primavera", + "BACKGROUND_Creek.svg": "Rio", + "BACKGROUND_Lake.svg": "Lago", + "BACKGROUND_Woods.svg": "Bosque", + "BACKGROUND_BeachDay.svg": "Dia de praia", + "BACKGROUND_BeachSunrise.svg": "Pôr do sol na praia", + "BACKGROUND_BeachNight.svg": "Praia à noite", + "BACKGROUND_Underwater.svg": "Embaixo d'agua", + "BACKGROUND_Jungle.svg": "Selva", + "BACKGROUND_Savannah.svg": "Savana", + "BACKGROUND_Desert.svg": "Deserto", + "BACKGROUND_Arctic.svg": "Ártico", + "BACKGROUND_Space.svg": "Espaço", + "BACKGROUND_MoonBkg.svg": "Lua", + "BLOCK_DESC_GREEN_FLAG": "INICIAR NA BANDEIRA VERDE", + "BLOCK_DESC_ON_TAP": "INICIAR AO TOCAR {CHARACTER_NAME}", + "BLOCK_DESC_ON_BUMP": "INICIAR AO COLIDIR {CHARACTER_NAME}", + "BLOCK_DESC_MESSAGE_COLOR_ORANGE": "Laranja", + "BLOCK_DESC_ON_MESSAGE": "INICIAR COM {COLOR} MENSAGEM", + "BLOCK_DESC_SEND_MESSAGE": "ENVIAR {COLOR} MENSAGEM INICIAL", + "BLOCK_DESC_MOVE_RIGHT": "MOVER PARA DIREITA", + "BLOCK_DESC_MOVE_LEFT": "MOVER PARA ESQUERDA", + "BLOCK_DESC_MOVE_UP": "MOVER PARA CIMA", + "BLOCK_DESC_MOVE_DOWN": "MOVER PARA BAIXO", + "BLOCK_DESC_TURN_RIGHT": "VIRAR PARA DIREITA", + "BLOCK_DESC_TURN_LEFT": "VIRAR PARA ESQUERDA", + "BLOCK_DESC_HOP": "PULAR", + "BLOCK_DESC_GO_HOME": "IR PARA CASA", + "BLOCK_DESC_SAY": "FALAR", + "BLOCK_DESC_GROW": "CRESCER", + "BLOCK_DESC_SHRINK": "ENCOLHER", + "BLOCK_DESC_RESET_SIZE": "REDEFINIR TAMANHO", + "BLOCK_DESC_HIDE": "ESCONDER", + "BLOCK_DESC_SHOW": "MOSTRAR", + "BLOCK_DESC_PLAY_SOUND": "EXECUTAR {SOUND_NAME}", + "BLOCK_DESC_PLAY_SOUND_POP": "pop", + "BLOCK_DESC_PLAY_RECORDED_SOUND": "TOCAR ÁUDIO GRAVADO", + "BLOCK_DESC_WAIT": "ESPERAR", + "BLOCK_DESC_STOP": "PARAR {CHARACTER_NAME}", + "BLOCK_DESC_SET_SPEED": "DEFINIR VELOCIDADE", + "BLOCK_DESC_REPEAT": "REPETIR", + "BLOCK_DESC_END": "FIM", + "BLOCK_DESC_REPEAT_FOREVER": "REPETIR ETERNAMENTE", + "BLOCK_DESC_GO_TO_PAGE": "IR PARA A PÁGINA {PAGE}", + "SHARING_BY_EMAIL": "Compartilhar via E-mail", + "SHARING_BY_AIRDROP": "Compartilhar via Android", + "SHARING_EMAIL_SUBJECT": "Projeto ScratchJr: {PROJECT_NAME}", + "SHARING_EMAIL_TEXT": "Clique no ícone para experimentar o Meu Projeto ScratchJr em seu tablet!

Se você não possui o aplicativo ScratchJr, você pode baixá-lo da Apple App Store ou da Google Play Store.

Com ScratchJr, as crianças podem criar suas próprias histórias interativas e jogos. Para saber mais, veja scratchjr.org.", + "FOR_PARENTS": "Para os Pais", + "PARENTAL_GATE_EXPLANATION": "Por que estamos perguntando isso? Um adulto deve aprovar o compartilhamento online.", + "GRID_NUMBER": "{N, number}", + "NEW_PROJECT_PREFIX": "Projeto", + "LIBRARY_CHARACTER": "Personagem", + "LIBRARY_BACKGROUND": "Fundo", + "SAY_BLOCK_DEFAULT_ARGUMENT": "oi", + "ALERT_BACK": "Retornar", + "ALERT_SAVING": "Salvando...", + "SELECT_LANGUAGE": "Selecionar idioma", + "USAGE_QUESTION": "Onde você está usando ScratchJr?", + "USAGE_SCHOOL": "Escola", + "USAGE_HOME": "Início", + "USAGE_OTHER": "Outra", + "USAGE_NONE": "Não perguntar novamente" +} \ No newline at end of file diff --git a/editions/free/src/localizations/pt.json b/editions/free/src/localizations/pt.json index da398611..07b441bc 100644 --- a/editions/free/src/localizations/pt.json +++ b/editions/free/src/localizations/pt.json @@ -332,7 +332,7 @@ "BLOCK_DESC_ON_TAP": "INICIA COM TOQUE {CHARACTER_NAME}", "BLOCK_DESC_ON_BUMP": "INICIA COM CHOQUE {CHARACTER_NAME}", "BLOCK_DESC_MESSAGE_COLOR_ORANGE": "Laranja", - "BLOCK_DESC_ON_MESSAGE": "INICIA COM MENSAGEM {COLOR} ", + "BLOCK_DESC_ON_MESSAGE": "INICIA COM MENSAGEM {COLOR}", "BLOCK_DESC_SEND_MESSAGE": "ENVIAR MENSAGEM DE INÍCIO {COLOR}", "BLOCK_DESC_MOVE_RIGHT": "MOVER PARA A DIREITA", "BLOCK_DESC_MOVE_LEFT": "MOVER PARA A ESQUERDA", diff --git a/editions/free/src/localizations/th.json b/editions/free/src/localizations/th.json index 75e3420c..bf222bf8 100644 --- a/editions/free/src/localizations/th.json +++ b/editions/free/src/localizations/th.json @@ -38,7 +38,7 @@ "BLOCKS_TURN_RIGHT": "เลี้ยวขวา", "BLOCKS_TURN_RIGHT_DESCRIPTION": "หมุนตัวละครตามเข็มนาฬิกาตามจำนวนที่ระบุไว้ ถ้าต้องการหมุนครบรอบวงให้ตั้งค่าเป็น 12", "BLOCKS_TURN_LEFT": "เลี้ยวซ้าย", - "BLOCKS_TURN_LEFT_DESCRIPTION": "หมุนตัวละครทวนเข็มนาฬิกาตามจำนวนที่ระบุไว้ ถ้าต้องการหมุนครบรอบวงให้ตั้งค่าเป็น 12 ", + "BLOCKS_TURN_LEFT_DESCRIPTION": "หมุนตัวละครทวนเข็มนาฬิกาตามจำนวนที่ระบุไว้ ถ้าต้องการหมุนครบรอบวงให้ตั้งค่าเป็น 12", "BLOCKS_HOP": "กระโดด", "BLOCKS_HOP_DESCRIPTION": "เลื่อนตัวละครขึ้นข้างบนและกลับมาที่จุดเดิมตามจำนวนที่ระบุไว้", "BLOCKS_GO_HOME": "กลับที่เดิม", @@ -172,7 +172,7 @@ "SAMPLE_TEXT_key_animalrace_elephant": "ช้าง", "SAMPLE_TEXT_key_animalrace_giraffe": "ยีราฟ", "SAMPLE_TEXT_key_animalrace_monkey": "ลิง", - "SAMPLE_TEXT_key_dance_scubadiver": " นักดำนำ้", + "SAMPLE_TEXT_key_dance_scubadiver": "นักดำนำ้", "SAMPLE_TEXT_key_dance_snake": "งู", "SAMPLE_TEXT_key_bump_yellow_duck": "เป็ดสีเหลือง", "SAMPLE_TEXT_key_bump_blue_duck": "เป็ดสีฟ้า", @@ -297,8 +297,8 @@ "CHARACTER_Table.svg": "โต๊ะ", "CHARACTER_Car.svg": "รถ", "CHARACTER_Bus.svg": "รถโดยสาร", - "CHARACTER_SailBoat.svg": " เรือ", - "CHARACTER_Boat2.svg": " เรือ", + "CHARACTER_SailBoat.svg": "เรือ", + "CHARACTER_Boat2.svg": "เรือ", "CHARACTER_Rocket.svg": "จรวด", "BACKGROUND_Farm.svg": "ทุ่งปศุสัตว์", "BACKGROUND_Park.svg": "อุทยาน", @@ -333,7 +333,7 @@ "BLOCK_DESC_ON_BUMP": "เริ่มต้นเมื่อชน {CHARACTER_NAME}", "BLOCK_DESC_MESSAGE_COLOR_ORANGE": "สีส้ม", "BLOCK_DESC_ON_MESSAGE": "เริ่มต้นตามข้อความ {COLOR}", - "BLOCK_DESC_SEND_MESSAGE": "ส่งข้อความ {COLOR} ", + "BLOCK_DESC_SEND_MESSAGE": "ส่งข้อความ {COLOR}", "BLOCK_DESC_MOVE_RIGHT": "เลื่อนขวา", "BLOCK_DESC_MOVE_LEFT": "เลื่อนซ้าย", "BLOCK_DESC_MOVE_UP": "เลื่อนขึ้น", diff --git a/editions/free/src/localizations/tr.json b/editions/free/src/localizations/tr.json new file mode 100644 index 00000000..abb8a7db --- /dev/null +++ b/editions/free/src/localizations/tr.json @@ -0,0 +1,380 @@ +{ + "MY_PROJECTS": "Projelerim", + "QUICK_INTRO": "ScratchJr Hızlı Tanıtım", + "SAMPLE_PROJECTS": "Örnek Projeler", + "ABOUT_SCRATCHJR": "ScratchJr Hakkında", + "INTERFACE_GUIDE": "Arayüz Rehberi", + "PAINT_EDITOR_GUIDE": "Resim Düzenleyici Rehberi", + "BLOCKS_GUIDE": "Blok Rehberi", + "ABOUT_WHAT_IS": "ScratchJr Nedir?", + "ABOUT_DESCRIPTION": "ScratchJr, küçük çocukların (5-7 yaş) kendi etkileşimli öykü ve oyunlarını yaratmalarına olanak tanıyan giriş niteliğinde bir programlama dilidir. Çocuklar grafiksel programlama bloklarını birbirine bağlayarak, karakterlerin hareket etmelerini, sıçramalarını, dans edip şarkı söylemelerini sağlarlar. Çocuklar resim düzenleyici ile karakterlerde değişiklikler yapabilir, kendilerine ait sesleri ekleyebilir, hattâ kendi fotoğraflarını dahi yerleştirebilir -- ve daha sonra programlama bloklarını da kullanarak kendi karakterlerinin hayat bulmasını sağlayabilirler.", + "ABOUT_INSPIRED_BY": "ScratchJr, dünya çapında milyonlarca genç insan (8 yaş ve üzeri) tarafından sevilerek kullanılan programlama dili olan Scratch'ten (http://scratch.mit.edu) esinlenilmiştir. ScratchJr'un yaratılması sürecinde, küçük yaştaki çocukların gelişimine uygun olacak şekilde, dikkatle tasarlanan özellikler sayesinde çocukların zihinsel, kişisel, sosyal, ve duygusal gelişimlerini karşılayabilmek için arayüzü ve programlama dilini yeniden tasarladık.

ScratchJr gerek iPad ve gerekse Android tabletler için ücretsiz olarak sunulmaktadır. ScratchJr hakkında daha fazla bilgi almak için, lütfen http://scratchjr.org adresine bakınız.", + "ABOUT_WHY_CREATE": "ScratchJr'u Niçin Yarattık?", + "ABOUT_WHY_CREATE_DESCRIPTION": "Kodlama (veya bilgisayar programlama) yeni bir tür okur yazarlıktır. Nasıl ki yazmak, düşüncelerinizi organize etmeye ve fikirlerinizi ifade etmeye yardımcı oluyorsa, aynısı kodlama için de geçerlidir. Geçmişte, kodlama pek çok insan için aşırı zor olarak görülürdü. Ama biz kodlamanın da, tıpkı yazmak gibi, herkes için olması gerektiğini düşünüyoruz.

Küçük çocuklar ScratchJr ile kodlama yaptıkça, bilgisayarla sadece etkileşimde olmayı değil, aynı zamanda onu kullanarak nasıl yaratacaklarını ve kendilerini nasıl ifade edeceklerini öğrenirler. Bu süreçte, çocuklar problem çözmeyi ve proje tasarlamayı öğrenir, ve daha sonraki akademik başarılarına temel olacak zamansal sıralama becerilerini geliştirirler. Aynı zamanda matematik ve dil becerilerini de anlamlı ve motive edici bir içerik içinde kullanarak erken çocukluk dönemindeki sayısal ve yazımsal gelişimleri desteklemiş olurlar. ScratchJr ile, çocuklar sadece kodlamayı öğrenmiyorlar, öğrenmek için de kodluyorlar.", + "ABOUT_WHO_CREATED": "ScratchJr'u Kim Yarattı?", + "ABOUT_WHO_CREATED_DESCRIPTION": "ScratchJr, Tufts Üniversitesi'nde Çocuk Araştırmaları ve İnsan Gelişimi'nde Eliot-Pearson Bölümü'nün Gelişimsel Teknolojiler (DevTech) Araştırma Grubu (Marina Umaschi Bers liderliğinde, Amanda Strawhacker, Claire Caine, Louise Flannery, Elizabeth Kazakoff, ve Dylan Portelance katkıları ile), MIT Media Lab'da Lifelong Kindergarten grubu (Mitchel Resnick liderliğinde, Chris Garrity, Tim Mickel, Carl Bowman, Champika Fernando, Natalie Rusk, Sayamindu Dasgupta, ve Chris Graves katkıları ile), ve Playful Invention Şirketi (Paula Bontá ve Brian Silverman liderliğinde, Jack Geddes ve Adrian Gabriel katkıları ile) arasında gerçekleştirilmiş olan bir işbirliğidir. ScratchJr'un Android sürümü Two Sigma (Mark Roth liderliğinde, Kevin Hu katkıları ile) tarafından gerçekleştirildi, giriş Benesse Corp. tarafındandır.

ScratchJr için grafikler ve çizimler HvingtQuatre Şirketi (Julien Gelifier ve Adrien Valesa liderliğinde), Sarah Thomson, Peter Mueller, ve Jillian Lombardi tarafından yaratıldı. ScratchJr videosunu MIT Media Lab'ın Paula Aguilera'sı üretti. Ayıca, iPad ve Android için beta-test topluluğuna katılan herkese, özellikle de Sergio Antolinez, Vandendaele Didier, ve Sjoerd Dirk Meijer'e teşekkür etmek istiyoruz", + "ABOUT_WHO_SUPPORTED": "ScratchJr'u Kim Destekledi?", + "ABOUT_WHO_SUPPORTED_DESCRIPTION": "ScratchJr projesi, Ulusal Bilim Kurumu (NSF DRL-1118664), Scratch Kurumu, LEGO Kurumu, ve British Telekomünikasyon'dan cömert finansal destekler almıştır.

Bu ücretsiz uygulamayı kullanmaktan memnun iseniz, lütfen ScratchJr için sürekli destek sağlayan, kâr amacı gütmeyen bir kurum olan Scratch Kurumu'na (www.scratchfoundation.org) bağış yapmayı düşününüz. Büyük ve küçük, her boyuttaki bağışlarınız için minnettar oluruz.

ScratchJr Kickstarter kampanyasından Platin destekçiler: Jeremy Deutsch, Kenneth Ehlert, Catherine Greenspon, Mark Loughridge, JoAnn Gantz Bendetson, ve Shirley Resnick.

ScratchJr Kickstarter kampanyasından diğer destekçiler:", + "BLOCKS_TRIGGERING_BLOCKS": "Tetikleyici Bloklar", + "BLOCKS_GREEN_FLAG": "Yeşil Bayrak ile Başlat", + "BLOCKS_GREEN_FLAG_DESCRIPTION": "Yeşil Bayrak'a tıklatılınca komut dizisini başlatır.", + "BLOCKS_ON_TAP": "Tıklandığında Başlat", + "BLOCKS_ON_TAP_DESCRIPTION": "Karakter üzerine tıklattığınızda komut dizisini çalıştırır.", + "BLOCKS_ON_TOUCH": "Dokunduğunda Çalıştır", + "BLOCKS_ON_TOUCH_DESCRIPTION": "Bir karakter diğer bir karaktere dokunduğunda komut dizisini çalıştırır.", + "BLOCKS_ON_MESSAGE": "İleti Geldiğinde Çalıştır.", + "BLOCKS_ON_MESSAGE_DESCRIPTION": "Belirlenmiş renkli bir ileti alındığında komut dizisini çalıştırır.", + "BLOCKS_SEND_MESSAGE": "İleti Gönder", + "BLOCKS_SEND_MESSAGE_DESCRIPTION": "Belirlenmiş renkteki bir iletiyi gönderir.", + "BLOCKS_MOTION_BLOCKS": "Hareket Blokları", + "BLOCKS_MOVE_RIGHT": "Sağa Git", + "BLOCKS_MOVE_RIGHT_DESCRIPTION": "Karakteri belirtilen sayıda kare kadar sağa doğru hareket ettirir.", + "BLOCKS_MOVE_LEFT": "Sola Git", + "BLOCKS_MOVE_LEFT_DESCRIPTION": "Karakteri belirtilen sayıda kare kadar sola doğru hareket ettirir.", + "BLOCKS_MOVE_UP": "Yukarı Git", + "BLOCKS_MOVE_UP_DESCRIPTION": "Karakteri belirtilen sayıda kare kadar yukarı doğru hareket ettirir.\n", + "BLOCKS_MOVE_DOWN": "Aşağı Git", + "BLOCKS_MOVE_DOWN_DESCRIPTION": "Karakteri belirtilen sayıda kare kadar aşağı doğru hareket ettirir.", + "BLOCKS_TURN_RIGHT": "Sağa Dön", + "BLOCKS_TURN_RIGHT_DESCRIPTION": "Karakteri, belirlenmiş miktar kadar saat yönünde döndürür. Tam bir dönüş için 12 Dön.", + "BLOCKS_TURN_LEFT": "Sola Dön", + "BLOCKS_TURN_LEFT_DESCRIPTION": "Karakteri, belirlenmiş miktar kadar saat yönünün tersinde döndürür. Tam bir dönüş için 12 Dön.", + "BLOCKS_HOP": "Sıçra", + "BLOCKS_HOP_DESCRIPTION": "Karakteri, belirlenmiş kılavuzlu kare sayısı kadar yukarıya hareket ettirir ve daha sonra yeniden aşağıya getirir.", + "BLOCKS_GO_HOME": "Başlangıça git", + "BLOCKS_GO_HOME_DESCRIPTION": "Karakterin konumunu sıfırlayarak, o karaktere ait başlangıç konumuna getirir. (Yeni bir başlangıç konumu ayarlamak için, karakteri o konuma sürükleyin).", + "BLOCKS_LOOKS_BLOCKS": "Görünüşler Bloğu", + "BLOCKS_SAY": "Söyle", + "BLOCKS_SAY_DESCRIPTION": "Karakterin üstündeki bir konuşma balonu içinde, belirlenmiş iletiyi gösterir.", + "BLOCKS_GROW": "Büyüt", + "BLOCKS_GROW_DESCRIPTION": "Karakterin boyutunu büyütür.", + "BLOCKS_SHRINK": "Küçült", + "BLOCKS_SHRINK_DESCRIPTION": "Karakterin boyutunu küçültür", + "BLOCKS_RESET_SIZE": "Boyutu Sıfırla", + "BLOCKS_RESET_SIZE_DESCRIPTION": "Karakterin boyutunu varsayılan boyuta döndürür.", + "BLOCKS_HIDE": "Gizle", + "BLOCKS_HIDE_DESCRIPTION": "Görünmez oluncaya kadar karakterin görüntüsünü silikleştirir.", + "BLOCKS_SHOW": "Göster", + "BLOCKS_SHOW_DESCRIPTION": "Tamamen görünür oluncaya kadar karakterin görüntüsünü belirginleştirir.", + "BLOCKS_SOUND_BLOCKS": "Ses Blokları", + "BLOCKS_POP": "Pap", + "BLOCKS_POP_DESCRIPTION": "Bir \"Pap\" Sesi Çıkartır", + "BLOCKS_PLAY_RECORDED": "Kayıtlı Sesi Çal", + "BLOCKS_PLAY_RECORDED_DESCRIPTION": "Kullanıcı tarafından kaydedilmiş bir sesi çalar.", + "BLOCKS_CONTROL_BLOCKS": "Kontrol Blokları", + "BLOCKS_WAIT": "Bekle", + "BLOCKS_WAIT_DESCRIPTION": "Komut dosyasını belirli bir süre için duraklatır (saniyenin onda biri olarak).", + "BLOCKS_STOP": "Dur", + "BLOCKS_STOP_DESCRIPTION": "Tüm karakterlere ait komut dizilerini durdurur.", + "BLOCKS_SET_SPEED": "Hızı Ayarla", + "BLOCKS_SET_SPEED_DESCRIPTION": "Belirli blokların çalıştırılma hızını değiştirir.", + "BLOCKS_REPEAT": "Tekrarla", + "BLOCKS_REPEAT_DESCRIPTION": "Blokları belirlenmiş sayı kadar tekrarda çalıştırır.", + "BLOCKS_END_BLOCKS": "Sonlandırma Blokları", + "BLOCKS_END": "Son", + "BLOCKS_END_DESCRIPTION": "Komut dizisinin sonunu işaret eder (ancak komut dizisini hiçbir şekilde etkilemez).", + "BLOCKS_REPEAT_FOREVER": "Sürekli Tekrarla", + "BLOCKS_REPEAT_FOREVER_DESCRIPTION": "Komut dizisini tekrar tekrar çalıştırmaya devam eder.", + "BLOCKS_GO_TO_PAGE": "Sayfaya Git", + "BLOCKS_GO_TO_PAGE_DESCRIPTION": "Projenin belirlenmiş sayfasına götürür.", + "INTERFACE_GUIDE_NUMBER": "{N, number}", + "INTERFACE_GUIDE_SAVE": "{N, number} | Kaydet", + "INTERFACE_GUIDE_STAGE": " {N, number} | Sahne", + "INTERFACE_GUIDE_PRESENTATION_MODE": " {N, number} | Sunum Modu", + "INTERFACE_GUIDE_GRID": " {N, number} | Kılavuz", + "INTERFACE_GUIDE_CHANGE_BG": "{N, number} | Arkaplanı Değiştir", + "INTERFACE_GUIDE_ADD_TEXT": "{N, number} | Metin Ekle", + "INTERFACE_GUIDE_RESET_CHAR": "{N, number} | Karakterleri Sıfırla", + "INTERFACE_GUIDE_GREEN_FLAG": "{N, number} | Yeşil Bayrak", + "INTERFACE_GUIDE_PAGES": "{N, number} | Sayfalar", + "INTERFACE_GUIDE_PROJECT_INFO": "{N, number} | Proje Bilgisi", + "INTERFACE_GUIDE_UNDO_REDO": "{N, number} | Geri Al ve Yeniden Yap", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT": "{N, number} | Programlama Betiği", + "INTERFACE_GUIDE_PROGRAMMING_AREA": "{N, number} | Programlama Alanı", + "INTERFACE_GUIDE_BLOCKS_PALETTE": " {N, number} | Bloklar Paleti", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES": " {N, number} | Blok Sınıfları", + "INTERFACE_GUIDE_CHARACTERS": "{N, number} | Karakterler ", + "INTERFACE_GUIDE_SAVE_DESCRIPTION": "Geçerli projeyi kaydedin ve Ana sayfaya dönün. ", + "INTERFACE_GUIDE_STAGE_DESCRIPTION": "Projenin gerçekleştirildiği yer burasıdır. Bir karakteri silmek için üzerine basılı tutun.", + "INTERFACE_GUIDE_PRESENTATION_MODE_DESCRIPTION": "Sahneyi tam ekrana genişlet.", + "INTERFACE_GUIDE_GRID_DESCRIPTION": "x-y koordinat kılavuzunun durumunu açık (ve kapalı) olarak değiştir.", + "INTERFACE_GUIDE_CHANGE_BG_DESCRIPTION": "Sahnenin arkaplanı için bir resim seç veya yarat.", + "INTERFACE_GUIDE_ADD_TEXT_DESCRIPTION": "Sahne üzerine başlıklar ve etiketler yaz.", + "INTERFACE_GUIDE_RESET_CHAR_DESCRIPTION": "Tüm karakterleri sahnedeki kendi başlangıç konumlarına geri getirir. (Yeni başlangıç konumlarını ayarlamak için karakterleri sürükleyin.)", + "INTERFACE_GUIDE_GREEN_FLAG_DESCRIPTION": "Buraya dokunarak \"Yeşil Bayrakta Başlat\" bloğuyla başlayan tüm programlama komut dosyalarını başlatın.", + "INTERFACE_GUIDE_PAGES_DESCRIPTION": "Projenizdeki sayfalardan birini seçin - veya yeni bir sayfa eklemek için artı işaretine dokunun. Her sayfanın kendine ait karakter dizisi ve arka planı vardır. Bir sayfayı silmek için basılı tutun. Sayfaları yeniden sıralamak için, onları yeni konumlara sürükleyin.", + "INTERFACE_GUIDE_PROJECT_INFO_DESCRIPTION": "Proje başlığını değiştir, projenin ne zaman yaratıldığını gör, ve projeyi paylaş (eğer cihazınız destekliyorsa).", + "INTERFACE_GUIDE_UNDO_REDO_DESCRIPTION": "Bir hata yaparsanız, son işlemi tersine çevirmek için Geri Al öğesine dokunun. Son geri almayı tersine çevirmek için Yinele'ye dokunun.", + "INTERFACE_GUIDE_PROGRAMMING_SCRIPT_DESCRIPTION": "Karaktere ne yapacağını söyleyen bir programlama betiği oluşturmak için blokları birbiri ile birleştirin. Çalıştırmak için bir komut dosyasında herhangi bir yere dokunun. Bir blok veya betiği silmek için, programlama alanının dışına sürükleyin. Bir bloğu veya komut dosyasını bir karakterden diğerine kopyalamak için karakterin küçük resmine sürükleyin.", + "INTERFACE_GUIDE_PROGRAMMING_AREA_DESCRIPTION": "Burası, karakterlere ne yapacaklarını söyleyen komut dosyaları oluşturmak için programlama bloklarını sıraladığınız yerdir.", + "INTERFACE_GUIDE_BLOCKS_PALETTE_DESCRIPTION": "Burası programlama blokları menüsü. Bir bloğu programlama alanına sürükleyin, sonra da üzerine tıklatarak ne yaptığını görün.", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES_DESCRIPTION": "Burası programlama bloklarının türlerini seçebileceğiniz yer: Tetikleyici Bloklar (Yeşil), Hareket (Mavi), Görünüşler (Mor), Sesler (Yeşil), Kontrol (Turuncu), Sonlandırma Blokları (Kırmızı)", + "INTERFACE_GUIDE_CHARACTERS_DESCRIPTION": "Projenizdeki karakterler arasından seçin -- veya yeni bir tane eklemek için artı işaretine tıklatın. Karakteri seçtiğinizde, ona ait komut dizisini düzenleyebilirsiniz, yeniden adlandırmak için adına tıklatın, veya görünüşünü düzenlemek için boya fırçasına tıklatın. Karakteri silmek için, üzerine basılı tutun. Bir karakteri diğer bir sayfaya kopyalamak için, o sayfanın küçük resmi üzerine sürükleyin.", + "PAINT_GUIDE_UNDO": "{N, number} | Geri Al", + "PAINT_GUIDE_REDO": " {N, number} | Yeniden Yap", + "PAINT_GUIDE_SHAPE": " {N, number} | Şekil", + "PAINT_GUIDE_CHARACTER_NAME": " {N, number} | Karakterin Adı", + "PAINT_GUIDE_CUT": " {N, number} | Kes", + "PAINT_GUIDE_DUPLICATE": " {N, number} | İkiye Çokla", + "PAINT_GUIDE_ROTATE": " {N, number} | Döndür", + "PAINT_GUIDE_DRAG": " {N, number} | Sürükle", + "PAINT_GUIDE_SAVE": " {N, number} | Kaydet", + "PAINT_GUIDE_FILL": " {N, number} | Doldur", + "PAINT_GUIDE_CAMERA": " {N, number} | Kamera", + "PAINT_GUIDE_COLOR": " {N, number} | Renk", + "PAINT_GUIDE_LINE_WIDTH": " {N, number} | Çizgi Kalınlığı", + "PAINT_GUIDE_UNDO_DESCRIPTION": "En son yapılan değişikliği tersine çevirir.", + "PAINT_GUIDE_REDO_DESCRIPTION": "En son yapılan Geri Alma'yı tersine çevirir.", + "PAINT_GUIDE_SHAPE_DESCRIPTION": "Çizmek için bir şekil seçin: çizgi, daire/elips, dikdörtgen veya üçgen.", + "PAINT_GUIDE_CHARACTER_NAME_DESCRIPTION": "Karakterin adını düzenle.", + "PAINT_GUIDE_CUT_DESCRIPTION": "Kesme aracını seçtikten sonra, tuvalden kaldırmak için karakter veya şekil üzerine tıklatabilirsiniz.", + "PAINT_GUIDE_DUPLICATE_DESCRIPTION": "İkiye Çoklama aracını seçtikten sonra, bir kopyasını yaratmak için karakter veya şekil üzerine tıklatabilirsiniz.", + "PAINT_GUIDE_ROTATE_DESCRIPTION": "Döndürme aracını seçtikten sonra, bir karakteri veya şekli kendi merkezi etrafında döndürebilirsiniz.", + "PAINT_GUIDE_DRAG_DESCRIPTION": "Sürükleme aracını seçtikten sonra, karakteri veya şekli tuval üzerine sürükleyebilirsiniz. Eğer bir şeklin üzerine tıklatırsanız, o şekli kenarlarında görünen noktalardan sürükleyerek düzenleyebilirsiniz.", + "PAINT_GUIDE_SAVE_DESCRIPTION": "Değişiklikleri kaydet ve Resim Düzenleyiciden çık.", + "PAINT_GUIDE_FILL_DESCRIPTION": "Doldurma aracını seçtikten sonra, o anda seçilmiş olan renkle doldurmak için, bir karakterin veya şeklin herhangi bir yerine tıklayabilirsiniz.", + "PAINT_GUIDE_CAMERA_DESCRIPTION": "Kamera aracını seçtikten sonra, bir karakterin veya şeklin herhangi bir yerine tıklatabilir, ve daha sonra kamera düğmesine tıklatarak o bölümü kamera ile yeni çekilecek fotoğraf ile doldurabilirsiniz.", + "PAINT_GUIDE_COLOR_DESCRIPTION": "Şekilleri çizmek veya doldurmak için yeni bir renk seçin.", + "PAINT_GUIDE_LINE_WIDTH_DESCRIPTION": "Çizdiğiniz şekillerin çizgi kalınlıklarını değiştirin.", + "SAMPLE_Under the sea": "Denizin altında", + "SAMPLE_Farm": "Çiftlik", + "SAMPLE_Seasons": "Mevsimler", + "SAMPLE_Friends": "Arkadaşlar", + "SAMPLE_Dance": "Dans", + "SAMPLE_Animal Race": "Hayvan Yarışı", + "SAMPLE_Bump": "Çarpışma", + "SAMPLE_Quick Intro": "Hızlı Tanıtım", + "SAMPLE_Star": "Yıldız", + "SAMPLE_TEXT_key_character_cat": "Kedi", + "SAMPLE_TEXT_key_character_star": "Yıldız", + "SAMPLE_TEXT_key_character_teen_girl": "Genç", + "SAMPLE_TEXT_key_character_teen_boy": "Genç", + "SAMPLE_TEXT_key_farm_tap_them": "Üzerlerine tıklat", + "SAMPLE_TEXT_key_party_question": "Parti?", + "SAMPLE_TEXT_key_soccer_question": "Veya futbol?", + "SAMPLE_TEXT_key_goal": "Goool!!", + "SAMPLE_TEXT_key_under_the_sea_fish": "Balık", + "SAMPLE_TEXT_key_under_the_sea_seahorse": "Denizatı", + "SAMPLE_TEXT_key_under_the_sea_starfish": "Denizyıldızı", + "SAMPLE_TEXT_key_farm_pig": "Domuz", + "SAMPLE_TEXT_key_farm_horse": "At", + "SAMPLE_TEXT_key_farm_chicken": "Tavuk", + "SAMPLE_TEXT_key_farm_barn": "Ahır", + "SAMPLE_TEXT_key_seasons_summer": "Yaz", + "SAMPLE_TEXT_key_seasons_fall": "Sonbahar", + "SAMPLE_TEXT_key_seasons_winter": "Kış", + "SAMPLE_TEXT_key_seasons_spring": "İlkbahar", + "SAMPLE_TEXT_key_friends_cake": "Kek", + "SAMPLE_TEXT_key_friends_soccer_ball": "Futbol topu", + "SAMPLE_TEXT_key_friends_child": "Çocuk", + "SAMPLE_TEXT_key_friends_table": "Masa", + "SAMPLE_TEXT_key_friends_soccer_net": "Futbol kalesi", + "SAMPLE_TEXT_key_animalrace_elephant": "Fil", + "SAMPLE_TEXT_key_animalrace_giraffe": "Zürafa", + "SAMPLE_TEXT_key_animalrace_monkey": "Maymun", + "SAMPLE_TEXT_key_dance_scubadiver": "Tüplü Dalgıç", + "SAMPLE_TEXT_key_dance_snake": "Yılan", + "SAMPLE_TEXT_key_bump_yellow_duck": "Sarı Ördek", + "SAMPLE_TEXT_key_bump_blue_duck": "Mavi Ördek", + "SAMPLE_TEXT_key_bump_green_duck": "Yeşil Ördek", + "SAMPLE_TEXT_key_quickintro_fish": "Balık", + "SAMPLE_TEXT_key_quickintro_toc": "Toc", + "CHARACTER_Cat.svg": "Kedi", + "CHARACTER_Cat2.svg": "Yürüyen Kedi", + "CHARACTER_Blue.svg": "Tic", + "CHARACTER_Purple.svg": "Tac", + "CHARACTER_Red.svg": "Toc", + "CHARACTER_Dragon.svg": "Ejderha", + "CHARACTER_Fairy.svg": "Peri", + "CHARACTER_Wizard.svg": "Sihirbaz", + "CHARACTER_Dog.svg": "Köpek", + "CHARACTER_Rabbit.svg": "Tavşan", + "CHARACTER_Chicken.svg": "Tavuk", + "CHARACTER_Pig.svg": "Domuz", + "CHARACTER_Horse.svg": "At", + "CHARACTER_Zebra.svg": "Zebra", + "CHARACTER_Monkey.svg": "Maymun", + "CHARACTER_Elephant.svg": "Fil", + "CHARACTER_Giraffe.svg": "Zürafa", + "CHARACTER_Camel.svg": "Deve", + "CHARACTER_Butterfly.svg": "Kelebek", + "CHARACTER_Fly.svg": "Sinek", + "CHARACTER_Bat.svg": "Yarasa", + "CHARACTER_Bird.svg": "Kuş", + "CHARACTER_Snake.svg": "Yılan", + "CHARACTER_Lizard.svg": "Kertenkele", + "CHARACTER_Frog.svg": "Kurbağa", + "CHARACTER_Duck.svg": "Ördek", + "CHARACTER_Crab.svg": "Yengeç", + "CHARACTER_Seahorse.svg": "Denizatı", + "CHARACTER_Starfish.svg": "Denizyıldızı", + "CHARACTER_Fish1.svg": "Balık", + "CHARACTER_Fish2.svg": "Balık", + "CHARACTER_Whale.svg": "Balina", + "CHARACTER_Penguin.svg": "Penguen", + "CHARACTER_PolarBear.svg": "Kutup Ayısı", + "CHARACTER_Girl1.svg": "Çocuk", + "CHARACTER_Girl2.svg": "Çocuk", + "CHARACTER_Girl3.svg": "Çocuk", + "CHARACTER_Boy1.svg": "Çocuk", + "CHARACTER_Boy2.svg": "Çocuk", + "CHARACTER_Boy3.svg": "Çocuk", + "CHARACTER_TeenGirl1.svg": "Genç", + "CHARACTER_TeenGirl2.svg": "Genç", + "CHARACTER_TeenGirl3.svg": "Genç", + "CHARACTER_TeenBoy1.svg": "Genç", + "CHARACTER_TeenBoy2.svg": "Genç", + "CHARACTER_TeenBoy3.svg": "Genç", + "CHARACTER_Baby.svg": "Bebek", + "CHARACTER_Mother.svg": "Anne", + "CHARACTER_Father.svg": "Baba", + "CHARACTER_Grandmother.svg": "Büyükanne", + "CHARACTER_Grandfather.svg": "Büyükbaba", + "CHARACTER_Girl.svg": "Çocuk", + "CHARACTER_Boy.svg": "Çocuk", + "CHARACTER_Teen2.svg": "Genç", + "CHARACTER_Teen3.svg": "Genç", + "CHARACTER_Farmer1.svg": "Çiftçi", + "CHARACTER_Farmer.svg": "Çiftçi", + "CHARACTER_Bike2.svg": "Bisikletçi", + "CHARACTER_Bike.svg": "Bisikletçi", + "CHARACTER_Car2.svg": "Sürücü", + "CHARACTER_Car1.svg": "Sürücü", + "CHARACTER_Aeroplane.svg": "Pilot", + "CHARACTER_Astronaut.svg": "Astronot", + "CHARACTER_Inuit.svg": "Kuzeyli", + "CHARACTER_Scubadiver.svg": "Tüplü Dalgıç", + "CHARACTER_Rowboat.svg": "Kürekçi", + "CHARACTER_Tree1.svg": "Ağaç", + "CHARACTER_Tree3.svg": "Ağaç", + "CHARACTER_Tree4.svg": "Ağaç", + "CHARACTER_Evergreen.svg": "Ağaç", + "CHARACTER_Weed.svg": "Bitki", + "CHARACTER_Pasture.svg": "Uzun Ot", + "CHARACTER_Cactus.svg": "Kaktüs", + "CHARACTER_Daffodil.svg": "Nergis", + "CHARACTER_Daisy1.svg": "Papatya", + "CHARACTER_Daisy2.svg": "Papatya", + "CHARACTER_Daisy3.svg": "Papatya", + "CHARACTER_Tulip2.svg": "Lale", + "CHARACTER_Flowers.svg": "Çiçekler", + "CHARACTER_Apple.svg": "Elma", + "CHARACTER_Peach.svg": "Şeftali", + "CHARACTER_Mushroom.svg": "Mantar", + "CHARACTER_Star.svg": "Yıldız", + "CHARACTER_Star2.svg": "Yıldız", + "CHARACTER_Star3.svg": "Yıldız", + "CHARACTER_ShootingStar.svg": "Kayan Yıldız", + "CHARACTER_Earth.svg": "Dünya", + "CHARACTER_Planet.svg": "Gezegen", + "CHARACTER_Sun.svg": "Güneş", + "CHARACTER_Moon.svg": "Dolunay", + "CHARACTER_CrescentMoon.svg": "Ay", + "CHARACTER_Cloud1.svg": "Bulut", + "CHARACTER_Thundercloud.svg": "Fırtına Bulutu", + "CHARACTER_Tornado.svg": "Kasırga", + "CHARACTER_Barn.svg": "Ahır", + "CHARACTER_Fort.svg": "Kale", + "CHARACTER_Castle.svg": "Şato", + "CHARACTER_Igloo.svg": "Eskimo Kulübesi", + "CHARACTER_House1.svg": "Ev", + "CHARACTER_House.svg": "Ev", + "CHARACTER_House3.svg": "Ev", + "CHARACTER_House4.svg": "Ev", + "CHARACTER_Apartment.svg": "Apartman", + "CHARACTER_School.svg": "Okul", + "CHARACTER_Shop.svg": "Dükkan", + "CHARACTER_Fence.svg": "Çit", + "CHARACTER_Mailbox.svg": "Posta Kutusu", + "CHARACTER_Cake.svg": "Kek", + "CHARACTER_Ball.svg": "Top", + "CHARACTER_Basketball.svg": "Basketbol Topu", + "CHARACTER_Soccerball.svg": "Futbol Topu", + "CHARACTER_SoccerNet.svg": "Futbol Kalesi", + "CHARACTER_Bed.svg": "Yatak", + "CHARACTER_NightTable.svg": "Komodin", + "CHARACTER_Stool.svg": "Tabure", + "CHARACTER_Table.svg": "Masa", + "CHARACTER_Car.svg": "Araba", + "CHARACTER_Bus.svg": "Otobüs", + "CHARACTER_SailBoat.svg": "Tekne", + "CHARACTER_Boat2.svg": "Tekne", + "CHARACTER_Rocket.svg": "Roket", + "BACKGROUND_Farm.svg": "Çiftlik", + "BACKGROUND_Park.svg": "Park", + "BACKGROUND_Suburbs.svg": "Banliyö", + "BACKGROUND_City.svg": "Şehir", + "BACKGROUND_Library.svg": "Kütüphane", + "BACKGROUND_Classroom.svg": "Sınıf", + "BACKGROUND_Theatre.svg": "Tiyatro", + "BACKGROUND_Gym.svg": "Spor Salonu", + "BACKGROUND_Gym2.svg": "Spor Salonu", + "BACKGROUND_Bedroom.svg": "Yatak Odası", + "BACKGROUND_EmptyRoom.svg": "Boş Oda", + "BACKGROUND_Summer.svg": "Yaz", + "BACKGROUND_Fall.svg": "Sonbahar", + "BACKGROUND_Winter.svg": "Kış", + "BACKGROUND_Spring.svg": "İlkbahar", + "BACKGROUND_Creek.svg": "Nehir", + "BACKGROUND_Lake.svg": "Göl", + "BACKGROUND_Woods.svg": "Tahtalar", + "BACKGROUND_BeachDay.svg": "Plaj Günü", + "BACKGROUND_BeachSunrise.svg": "Plaj Günbatımı", + "BACKGROUND_BeachNight.svg": "Plaj Gecesi", + "BACKGROUND_Underwater.svg": "Sualtı", + "BACKGROUND_Jungle.svg": "Orman", + "BACKGROUND_Savannah.svg": "Savana", + "BACKGROUND_Desert.svg": "Çöl", + "BACKGROUND_Arctic.svg": " Buzul Yer", + "BACKGROUND_Space.svg": "Uzay", + "BACKGROUND_MoonBkg.svg": "Ay", + "BLOCK_DESC_GREEN_FLAG": "YEŞİL BAYRAKLA BAŞLA", + "BLOCK_DESC_ON_TAP": " {CHARACTER_NAME} ÜZERİNE TIKLATINCA BAŞLA", + "BLOCK_DESC_ON_BUMP": " {CHARACTER_NAME} ÇARPINCA BAŞLA", + "BLOCK_DESC_MESSAGE_COLOR_ORANGE": "Turuncu", + "BLOCK_DESC_ON_MESSAGE": " {COLOR} İLETİ İLE BAŞLA", + "BLOCK_DESC_SEND_MESSAGE": " {COLOR} BAŞLATMA İLETİSİ GÖNDER", + "BLOCK_DESC_MOVE_RIGHT": "SAĞA GİT", + "BLOCK_DESC_MOVE_LEFT": "SOLA GİT", + "BLOCK_DESC_MOVE_UP": "YUKARI GİT", + "BLOCK_DESC_MOVE_DOWN": "AŞAĞI GİT", + "BLOCK_DESC_TURN_RIGHT": "SAĞA DÖN", + "BLOCK_DESC_TURN_LEFT": "SOLA DÖN", + "BLOCK_DESC_HOP": "SIÇRA", + "BLOCK_DESC_GO_HOME": "BAŞLANGIÇA GİT", + "BLOCK_DESC_SAY": "SÖYLE", + "BLOCK_DESC_GROW": "BÜYÜT", + "BLOCK_DESC_SHRINK": "KÜÇÜLT", + "BLOCK_DESC_RESET_SIZE": "BOYUTU SIFIRLA", + "BLOCK_DESC_HIDE": "GİZLE", + "BLOCK_DESC_SHOW": "GÖSTER", + "BLOCK_DESC_PLAY_SOUND": " {SOUND_NAME} SESİNİ ÇAL", + "BLOCK_DESC_PLAY_SOUND_POP": "pap", + "BLOCK_DESC_PLAY_RECORDED_SOUND": "KAYITLI SESİ ÇAL", + "BLOCK_DESC_WAIT": "BEKLE", + "BLOCK_DESC_STOP": " {CHARACTER_NAME} KARAKTERİNİ DURDUR", + "BLOCK_DESC_SET_SPEED": "HIZI AYARLA", + "BLOCK_DESC_REPEAT": "TEKRARLA", + "BLOCK_DESC_END": "SON", + "BLOCK_DESC_REPEAT_FOREVER": "SÜREKLİ TEKRARLA", + "BLOCK_DESC_GO_TO_PAGE": " {PAGE} SAYFASINA GİT", + "SHARING_BY_EMAIL": "Eposta ile Paylaş", + "SHARING_BY_AIRDROP": "Airdrop ile Paylaş", + "SHARING_EMAIL_SUBJECT": "ScratchJr Projesi: {PROJECT_NAME} ", + "SHARING_EMAIL_TEXT": "ScratchJr projelerimi iPad'inizde veya Android tabletinizde denemek için ikona tıklayın!

Eğer ScratchJr uygulamasına sahip değil iseniz, Apple Uygulama Mağazası veya Google Oyun Mağazasından indirin

ScratchJr kullanarak çocuklar kendi etkileşimli hikaye ve oyunlarını oluşturabilirler. Daha fazla bilgi için scratchjr.org sayfasını ziyaret edin.", + "FOR_PARENTS": "Anne-Babalar için", + "PARENTAL_GATE_EXPLANATION": "Niçin bunu soruyoruz? Çevrimiçi paylaşım için bir yetişkinin onay vermesi şart.", + "GRID_NUMBER": " {N, number} ", + "NEW_PROJECT_PREFIX": "Proje", + "LIBRARY_CHARACTER": "Karakter", + "LIBRARY_BACKGROUND": "Arkaplan", + "SAY_BLOCK_DEFAULT_ARGUMENT": "merhaba", + "ALERT_BACK": "Geri", + "ALERT_SAVING": "Kaydediliyor...", + "SELECT_LANGUAGE": "Dili seçiniz", + "USAGE_QUESTION": "ScratchJr'i nerede kullanıyorsunuz ?", + "USAGE_SCHOOL": "Okul", + "USAGE_HOME": "Ev", + "USAGE_OTHER": "Diğer", + "USAGE_NONE": "Tekrar sorma" +} \ No newline at end of file diff --git a/editions/free/src/localizations/zh-cn.json b/editions/free/src/localizations/zh-cn.json index 227cf6b5..2b441347 100644 --- a/editions/free/src/localizations/zh-cn.json +++ b/editions/free/src/localizations/zh-cn.json @@ -108,7 +108,7 @@ "INTERFACE_GUIDE_PROGRAMMING_SCRIPT_DESCRIPTION": "将积木贴在一起组合成一个积木堆,我们把它称作程序。通过程序可以告诉角色做什么事情。在积木上点一下可以执行这个程序。若要删除一个积木、或是程序,只要把它们拖动到编程工作区以外的区域就可以了 。若要把一个程序从一个角色复制到另外一个角色上,可以直接将程序拖放到另一个角色的缩略图上。", "INTERFACE_GUIDE_PROGRAMMING_AREA_DESCRIPTION": "这里是组合积木,产生程序的地方,程序可以告诉角色要做的事情。", "INTERFACE_GUIDE_BLOCKS_PALETTE_DESCRIPTION": "这个菜单显示可用积木,把要使用的积木拖放到编程工作区,然后在积木上点一下可以看到他们是做什么的。", - "INTERFACE_GUIDE_BLOCKS_CATEGORIES_DESCRIPTION": "这里将所有程序积木按照用途分类,可分为:触发 ( 黄色 ) 、动作 ( 蓝色 ) 、外观 ( 紫色 )、音效 ( 绿色 ) 、控制 ( 橙色 ) 、结束 ( 红色 ) 。 ", + "INTERFACE_GUIDE_BLOCKS_CATEGORIES_DESCRIPTION": "这里将所有程序积木按照用途分类,可分为:触发 ( 黄色 ) 、动作 ( 蓝色 ) 、外观 ( 紫色 )、音效 ( 绿色 ) 、控制 ( 橙色 ) 、结束 ( 红色 ) 。", "INTERFACE_GUIDE_CHARACTERS_DESCRIPTION": "选择项目中使用中的角色 - 点击加号图示可以添加新的角色。当角色被选中,你可以编写它的程序;点击名称可以为角色重新命名,点击笔刷图示可以编辑角色图片。若要删除角色,在角色上点着不放,会出现删除按钮。若要复制角色到其他页面,只要将它拖放到其他的页面的缩略图。", "PAINT_GUIDE_UNDO": "{N, number}. 撤销", "PAINT_GUIDE_REDO": "{N, number}. 重做", @@ -362,6 +362,7 @@ "SHARING_BY_AIRDROP": "用 Airdrop 分享", "SHARING_EMAIL_SUBJECT": "ScratchJr 项目: {PROJECT_NAME}", "SHARING_EMAIL_TEXT": "在你的 iPad 或者 Android 平板上点击这个图标,试试我的 ScratchJr 项目!

如果你没有安装 ScratchJr 应用程序,你可以从 Apple 应用商店或者 Google Play 商店中下载

ScratchJr 可以让孩子建立自己的互动故事或游戏。若要进一步了解,可以访问scratchjr.org。", + "FOR_PARENTS": "致家长", "PARENTAL_GATE_EXPLANATION": "为什么我们要问这个问题?因为必须要大人同意的情况下才可以在线上分享。", "GRID_NUMBER": "{N, number}", "NEW_PROJECT_PREFIX": "项目", diff --git a/editions/free/src/localizations/zh-tw.json b/editions/free/src/localizations/zh-tw.json index f9d6961e..85e99099 100644 --- a/editions/free/src/localizations/zh-tw.json +++ b/editions/free/src/localizations/zh-tw.json @@ -362,6 +362,7 @@ "SHARING_BY_AIRDROP": "用 Airdrop 分享", "SHARING_EMAIL_SUBJECT": "ScratchJr 專案: {PROJECT_NAME}", "SHARING_EMAIL_TEXT": "點按圖示可以在你的 iPad 或 Android 平板上嘗試我的 ScratchJr 專案!

如果你還沒有 ScratchJr App,你可以從 Apple App Store 或 Google Play 商店上下載。

有了 ScratchJr,小朋友可以製作自己的互動故事和遊戲。若想深入瞭解,請見 scratchjr.org。", + "FOR_PARENTS": "致家長", "PARENTAL_GATE_EXPLANATION": "為什麼我們要問這個問題?因為必須要大人同意的情況下才可以在線上分享。", "GRID_NUMBER": "{N, number}", "NEW_PROJECT_PREFIX": "專案", diff --git a/editions/free/src/settings.json b/editions/free/src/settings.json index 08d6a361..c76f3e79 100644 --- a/editions/free/src/settings.json +++ b/editions/free/src/settings.json @@ -24,15 +24,20 @@ "Cymraeg": "cy", "Dansk": "da", "Deutsch": "de", + "Ελληνικά": "el", "English": "en", "Español": "es", "Français": "fr", "Italiano": "it", "Nederlands": "nl", "にほんご": "ja", + "Norsk": "no", + "Polski": "pl", "Português": "pt", + "Português BR": "pt-br", "Svenska": "sv", "ไทย": "th", + "Türkçe": "tr", "简体中文": "zh-cn", "繁體中文": "zh-tw" }, diff --git a/ios/ScratchJr.xcodeproj/project.pbxproj b/ios/ScratchJr.xcodeproj/project.pbxproj index 5c156f1d..e4cc1f2b 100644 --- a/ios/ScratchJr.xcodeproj/project.pbxproj +++ b/ios/ScratchJr.xcodeproj/project.pbxproj @@ -13,6 +13,9 @@ 204D80CC18A4140600ECBB8B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 204D80CA18A4140600ECBB8B /* InfoPlist.strings */; }; 204D80CE18A4140600ECBB8B /* ScratchJrTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 204D80CD18A4140600ECBB8B /* ScratchJrTests.m */; }; 7465F19843DCA9DDC62CC852 /* libPods-ScratchJr Free.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7ACBA0233542F96AC72D4D7E /* libPods-ScratchJr Free.a */; }; + 8F8FEAA724E700FF00571717 /* JsBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F8FEAA624E700FF00571717 /* JsBridge.m */; }; + 8F8FEAA924E703B000571717 /* JsRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F8FEAA824E703B000571717 /* JsRequest.m */; }; + 8F8FEAAB24E7065E00571717 /* View.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8F8FEAAA24E7065E00571717 /* View.xib */; }; A7FDEB52BFEDCD9E4520FF89 /* libPods-ScratchJrTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 512C88D0E9938AB5972ACF38 /* libPods-ScratchJrTests.a */; }; D92D0F951C33381B00C573AD /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2001BEB918E237AE008E563F /* MessageUI.framework */; }; D92D0F961C33381B00C573AD /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20B2227818A53688003BDE44 /* AVFoundation.framework */; }; @@ -22,7 +25,6 @@ D92D0F9A1C33381B00C573AD /* libsqlite3.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 20B2226E18A46327003BDE44 /* libsqlite3.0.dylib */; }; D92D0F9D1C33381B00C573AD /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 20B2226818A4404B003BDE44 /* Settings.bundle */; }; D92D0F9E1C33381B00C573AD /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 204D80B118A4140600ECBB8B /* InfoPlist.strings */; }; - D92D0F9F1C33381B00C573AD /* View.xib in Resources */ = {isa = PBXBuildFile; fileRef = 204D80DC18A4195E00ECBB8B /* View.xib */; }; D92D0FCA1C3346D200C573AD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D92D0FB31C33469A00C573AD /* AppDelegate.m */; }; D92D0FCB1C3346D200C573AD /* CameraMask.m in Sources */ = {isa = PBXBuildFile; fileRef = D92D0FB41C33469A00C573AD /* CameraMask.m */; }; D92D0FCC1C3346D200C573AD /* CameraView.m in Sources */ = {isa = PBXBuildFile; fileRef = D92D0FB51C33469A00C573AD /* CameraView.m */; }; @@ -62,7 +64,6 @@ 204D80C918A4140600ECBB8B /* ScratchJrTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ScratchJrTests-Info.plist"; sourceTree = ""; }; 204D80CB18A4140600ECBB8B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 204D80CD18A4140600ECBB8B /* ScratchJrTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScratchJrTests.m; sourceTree = ""; }; - 204D80DC18A4195E00ECBB8B /* View.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = View.xib; sourceTree = ""; }; 20B2226818A4404B003BDE44 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = SOURCE_ROOT; }; 20B2226E18A46327003BDE44 /* libsqlite3.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.0.dylib; path = usr/lib/libsqlite3.0.dylib; sourceTree = SDKROOT; }; 20B2227818A53688003BDE44 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; @@ -70,6 +71,9 @@ 5A3230A01AEC02BC09345F16 /* Pods-ScratchJrTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScratchJrTests.debug.xcconfig"; path = "Target Support Files/Pods-ScratchJrTests/Pods-ScratchJrTests.debug.xcconfig"; sourceTree = ""; }; 72E2C9BF3BE9F67099F0180F /* Pods-ScratchJrTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScratchJrTests.release.xcconfig"; path = "Target Support Files/Pods-ScratchJrTests/Pods-ScratchJrTests.release.xcconfig"; sourceTree = ""; }; 7ACBA0233542F96AC72D4D7E /* libPods-ScratchJr Free.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ScratchJr Free.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F8FEAA624E700FF00571717 /* JsBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = JsBridge.m; path = src/JsBridge.m; sourceTree = ""; }; + 8F8FEAA824E703B000571717 /* JsRequest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = JsRequest.m; path = src/JsRequest.m; sourceTree = ""; }; + 8F8FEAAA24E7065E00571717 /* View.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = View.xib; path = src/View.xib; sourceTree = ""; }; 97A526F2B60190BFC0BD3081 /* Pods-ScratchJr Free.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ScratchJr Free.debug.xcconfig"; path = "Target Support Files/Pods-ScratchJr Free/Pods-ScratchJr Free.debug.xcconfig"; sourceTree = ""; }; D905DF721C220BA6003DA34A /* free */ = {isa = PBXFileReference; lastKnownFileType = folder; name = free; path = ../editions/free; sourceTree = ""; }; D92D0FA61C33381B00C573AD /* ScratchJr Free.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ScratchJr Free.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -166,7 +170,6 @@ children = ( D92D0FC91C3346AC00C573AD /* src */, 204D80AF18A4140600ECBB8B /* Supporting Files */, - 204D80DC18A4195E00ECBB8B /* View.xib */, ); path = ScratchJr; sourceTree = ""; @@ -249,6 +252,9 @@ D92D0FBC1C33469A00C573AD /* ViewController.h */, D92D0FBD1C33469A00C573AD /* ViewController.m */, D92D0FB81C33469A00C573AD /* main.m */, + 8F8FEAA624E700FF00571717 /* JsBridge.m */, + 8F8FEAA824E703B000571717 /* JsRequest.m */, + 8F8FEAAA24E7065E00571717 /* View.xib */, ); name = App; sourceTree = ""; @@ -310,7 +316,7 @@ isa = PBXProject; attributes = { LastUpgradeCheck = 1110; - ORGANIZATIONNAME = "Playful Invention Company"; + ORGANIZATIONNAME = "Scratch Foundation"; TargetAttributes = { 204D80BF18A4140600ECBB8B = { DevelopmentTeam = TTT4R28WVF; @@ -354,9 +360,9 @@ buildActionMask = 2147483647; files = ( D92D0F9D1C33381B00C573AD /* Settings.bundle in Resources */, + 8F8FEAAB24E7065E00571717 /* View.xib in Resources */, D965E3971C3EC63A005D792F /* Free-Images.xcassets in Resources */, D92D0F9E1C33381B00C573AD /* InfoPlist.strings in Resources */, - D92D0F9F1C33381B00C573AD /* View.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -419,7 +425,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "EDITION=free;\n\n../bin/bundle-compile.sh;\n\nrsync -pvtrlL --cvs-exclude \\\n ../editions/$EDITION/ios-resources/* \\\n \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/\";\n\nrsync -pvtrlL --cvs-exclude \\\n ../editions/$EDITION/src/* \\\n \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/HTML5\";\n \nmkdir -p \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/HTML5/pnglibrary\";\n\n../bin/convert-svg-to-png.py -i \"../editions/$EDITION/src/svglibrary/\" -o \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/HTML5/pnglibrary\";"; + shellScript = "EDITION=free;\n\n../bin/bundle-compile.sh;\n\nrsync -pvtrlL --cvs-exclude \\\n ../editions/$EDITION/ios-resources/* \\\n \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/\";\n\nrsync -pvtrlL --cvs-exclude \\\n ../editions/$EDITION/src/* \\\n \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/HTML5\";\n \nmkdir -p \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/HTML5/pnglibrary\";\n\n../bin/convert-svg-to-png.py -i \"../editions/$EDITION/src/svglibrary/\" -o \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/HTML5/pnglibrary\";\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -438,7 +444,9 @@ files = ( D92D0FCD1C3346DC00C573AD /* Database.m in Sources */, D92D0FCE1C3346DC00C573AD /* IO.m in Sources */, + 8F8FEAA724E700FF00571717 /* JsBridge.m in Sources */, D92D0FCF1C3346DC00C573AD /* main.m in Sources */, + 8F8FEAA924E703B000571717 /* JsRequest.m in Sources */, D92D0FD01C3346DC00C573AD /* RecordSound.m in Sources */, D92D0FD11C3346DC00C573AD /* ScratchJr.m in Sources */, D92D0FD21C3346DC00C573AD /* ViewController.m in Sources */, @@ -520,7 +528,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; ONLY_ACTIVE_ARCH = YES; PROVISIONING_PROFILE = "8f58b6d2-97d0-4e4a-ac2e-3c4ee99770bf"; SDKROOT = iphoneos; @@ -570,7 +578,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; PROVISIONING_PROFILE = "8f58b6d2-97d0-4e4a-ac2e-3c4ee99770bf"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; @@ -644,7 +652,7 @@ "COCOAPODS=1", ); INFOPLIST_FILE = "$(SRCROOT)/../editions/free/Free-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; PRODUCT_BUNDLE_IDENTIFIER = edu.mitmedialab.scratchjrfree; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; @@ -669,7 +677,7 @@ "COCOAPODS=1", ); INFOPLIST_FILE = "$(SRCROOT)/../editions/free/Free-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; PRODUCT_BUNDLE_IDENTIFIER = edu.mitmedialab.scratchjrfree; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; diff --git a/ios/ScratchJr/View.xib b/ios/ScratchJr/View.xib deleted file mode 100644 index e95e0726..00000000 --- a/ios/ScratchJr/View.xib +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ios/ScratchJr/src/IO.m b/ios/ScratchJr/src/IO.m index f2eea809..fc8fa4ee 100644 --- a/ios/ScratchJr/src/IO.m +++ b/ios/ScratchJr/src/IO.m @@ -282,10 +282,10 @@ + (NSString *)playSound :(NSString*)name { + (void)soundEnded:(NSTimer*)timer { NSString *soundName = [[timer userInfo] objectForKey:@"soundName"]; if (sounds[soundName] == nil) return; - NSString *callback = [NSString stringWithFormat:@"iOS.soundDone('%@');", soundName]; - UIWebView *webview = [ViewController webview]; + NSString *callback = [NSString stringWithFormat:@"OS.soundDone('%@');", soundName]; + WKWebView *webview = [ViewController webview]; dispatch_async(dispatch_get_main_queue(), ^{ - [webview stringByEvaluatingJavaScriptFromString:callback]; + [webview evaluateJavaScript:callback completionHandler:nil]; }); } diff --git a/ios/ScratchJr/src/JsBridge.m b/ios/ScratchJr/src/JsBridge.m new file mode 100644 index 00000000..a810101f --- /dev/null +++ b/ios/ScratchJr/src/JsBridge.m @@ -0,0 +1,202 @@ +// +// JsBridge.m +// ScratchJr Free +// +// Created by Yueyu on 2020/7/31. +// + +#import "ScratchJr.h" +#import +@import Firebase; + +@implementation JsBridge + +-(void) userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message +{ + NSDictionary *dict = (NSDictionary *)message.body; + + JsRequest *request = [[JsRequest alloc] initWithDictionary:dict]; + + NSString *method = [request.method stringByAppendingString:@":"]; + SEL selector = NSSelectorFromString(method); + if (![self respondsToSelector:selector]) { + NSLog(@"method %@ not exists", request.method); + return; + } + // [self performSelector:selector withObject:request]; + // to disable warning: PerformSelector may cause a leak because its selector is unknown + // thanks wbyoung for https://stackoverflow.com/a/20058585 + IMP imp = [self methodForSelector:selector]; + void (*func)(id, SEL, JsRequest *) = (void *)imp; + func(self, selector, request); +} + +-(void) askForPermission: (JsRequest *) request +{ + [RecordSound setPermission]; + [request callback:@"ok"]; +} + +-(void) database_stmt: (JsRequest *) request { + [request callback:[Database stmt:request.params[0]]]; +} + +-(void) database_query: (JsRequest *) request { + [request callback:[Database query:request.params[0]]]; +} + +-(void) io_getmd5: (JsRequest *) request { + [request callback:[IO getMD5:request.params[0]]]; +} + +-(void) io_getsettings: (JsRequest *) request { + [request callback:[IO getsettings]]; +} + +-(void) io_cleanassets: (JsRequest *) request { + [IO cleanassets: request.params[0]]; + [request callback:@"ok"]; +} + +-(void) io_setfile: (JsRequest *) request { + [request callback:[IO setfile:request.params[0]:request.params[1]]]; +} + +-(void) io_getfile: (JsRequest *) request { + [request callback:[IO getfile:request.params[0]]]; +} + +-(void) io_setmedia: (JsRequest *) request { + [request callback:[IO setmedia:request.params[0] :request.params[1]]]; +} + +-(void) io_setmedianame: (JsRequest *) request { + [request callback:[IO setmedianame:request.params[0] :request.params[1] :request.params[2]]]; +} + +-(void) io_getmedia: (JsRequest *) request { + [request callback:[IO getmedia:request.params[0]]]; +} + +-(void) io_getmediadata: (JsRequest *) request { + int offset = [request.params[1] intValue]; + int length = [request.params[2] intValue]; + NSString *key = [NSString stringWithFormat:@"%@", request.params[0]]; + [request callback:[IO getmediadata:key :offset :length]]; +} + +-(void) io_getmedialen: (JsRequest *) request { + NSString *key = [NSString stringWithFormat:@"%@", request.params[1]]; + [request callback:[IO getmedialen:request.params[0] :key]]; +} + +-(void) io_getmediadone: (JsRequest *) request { + [request callback:[IO getmediadone:request.params[0]]]; +} + +-(void) io_remove: (JsRequest *) request { + [request callback:[IO remove:request.params[0]]]; +} + +-(void) io_registersound: (JsRequest *) request { + [request callback:[IO registerSound:request.params[0] :request.params[1]]]; +} + +-(void) io_playsound: (JsRequest *) request { + [request callback:[IO playSound:request.params[0]]]; +} + +-(void) io_stopsound: (JsRequest *) request { + [request callback:[IO stopSound:request.params[0]]]; +} + +-(void) recordsound_recordstart: (JsRequest *) request { + [request callback:[RecordSound startRecord]]; +} + +-(void) recordsound_recordstop: (JsRequest *) request { + [request callback:[RecordSound stopRecording]]; +} + +-(void) recordsound_volume: (JsRequest *) request { + [request callback:[NSString stringWithFormat:@"%f", [RecordSound getVolume]]]; +} + +-(void) recordsound_startplay: (JsRequest *) request { + [request callback:[RecordSound startPlay]]; +} + +-(void) recordsound_stopplay: (JsRequest *) request { + [request callback:[RecordSound stopPlay]]; +} + +-(void) recordsound_recordclose: (JsRequest *) request { + [request callback:[RecordSound recordclose:request.params[0]]]; +} + +-(void) scratchjr_cameracheck: (JsRequest *) request { + [request callback:[ScratchJr cameracheck]]; +} + +-(void) scratchjr_has_multiple_cameras: (JsRequest *) request { + [request callback:@"YES"]; +} + +-(void) scratchjr_startfeed: (JsRequest *) request { + [request callback:[ScratchJr startfeed: request.params[0]]]; +} + +-(void) scratchjr_stopfeed: (JsRequest *) request { + [request callback:[ScratchJr stopfeed]]; +} + +-(void) scratchjr_choosecamera: (JsRequest *) request { + [request callback:[ScratchJr choosecamera:request.params[0]]]; +} + +-(void) scratchjr_captureimage: (JsRequest *) request { + [request callback:[ScratchJr captureimage:request.params[0]]]; +} + +-(void) sendSjrUsingShareDialog: (JsRequest *) request { + int shareType = [request.params[3] intValue]; + NSString *res = [IO sendSjrUsingShareDialog:request.params[0] :request.params[1] :request.params[2] :shareType : request.params[4]]; + [request callback:res]; +} + +- (void) hideSplash: (JsRequest *) request { + [request callback:[ScratchJr hideSplash:nil]]; +} + +-(void) analyticsEvent: (JsRequest *) request { + NSString *label = @"undefined"; + if (![request.params[2] isEqual:[NSNull null]]) { + label = request.params[2]; + } + [FIRAnalytics logEventWithName:request.params[1] // action + parameters:@{ + kFIRParameterItemName:label, // label + kFIRParameterItemCategory:request.params[0] // category + }]; + [request callback:@"ok"]; +} + +-(void) setAnalyticsPlacePref: (JsRequest *) request { + [FIRAnalytics setUserPropertyString:request.params[0] forName:@"place_preference"]; + [request callback:@"ok"]; +} + +// @param request like [name, propertyString] +-(void) setAnalyticsPref: (JsRequest *) request { + NSString *name = [NSString stringWithFormat:@"%@", request.params[0]]; + NSString *propertyString = [NSString stringWithFormat:@"%@", request.params[1]]; + [FIRAnalytics setUserPropertyString:propertyString forName:name]; + [request callback:@"ok"]; +} + +// iPad name (used for information in the name/sharing dialog to help people using Airdrop) +- (void) deviceName: (JsRequest *) request { + [request callback:[[UIDevice currentDevice] name]]; +} + +@end diff --git a/ios/ScratchJr/src/JsRequest.m b/ios/ScratchJr/src/JsRequest.m new file mode 100644 index 00000000..7acd9078 --- /dev/null +++ b/ios/ScratchJr/src/JsRequest.m @@ -0,0 +1,32 @@ +// +// JsRequest.m +// ScratchJr Free +// +// Created by Yueyu on 2020/7/31. +// + +#import "ScratchJr.h" + +@implementation JsRequest + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary { + self = [super init]; + self.method = dictionary[@"method"]; + self.callId = dictionary[@"id"]; + self.params = dictionary[@"params"]; + return self; +} + +- (void) callback:(NSString *)res { + NSString *js = nil; + if ([res hasPrefix:@"["] || [res hasPrefix:@"{"]) { + js = [NSString stringWithFormat:@"iOS.resolve('%@', %@);", self.callId, res]; + } else { + js = [NSString stringWithFormat:@"iOS.resolve('%@', '%@');", self.callId, res]; + } + dispatch_async(dispatch_get_main_queue(), ^{ + [ViewController.webview evaluateJavaScript:js completionHandler:nil]; + }); +} + +@end diff --git a/ios/ScratchJr/src/ScratchJr.h b/ios/ScratchJr/src/ScratchJr.h index 873bf715..bd23e366 100644 --- a/ios/ScratchJr/src/ScratchJr.h +++ b/ios/ScratchJr/src/ScratchJr.h @@ -3,6 +3,7 @@ #import #import #import +#import @interface Database : NSObject @@ -84,55 +85,8 @@ + (NSString *)stopPlay; + (NSString *)recordclose:(NSString *)keep; @end - -@protocol JSExports -/* Functions exported to JavaScript */ -- (NSString *)hideSplash:(NSString *)body; -- (void) askForPermission; -- (NSString *)database_stmt:(NSString *) json; -- (NSString *)database_query:(NSString *) json; -- (NSString *)io_getmd5:(NSString *) str; -- (NSString *)io_getsettings; -- (void)io_cleanassets:(NSString *)fileType; -- (NSString *)io_setfile:(NSString *)filename :(NSString *)base64ContentStr; -- (NSString *)io_getfile:(NSString *)filename; -- (NSString *)io_setmedia:(NSString *)base64ContentStr :(NSString *)extension; -- (NSString *)io_setmedianame:(NSString *)contents :(NSString *)key :(NSString *)ext; -- (NSString *)io_getmedia:(NSString *)filename; -- (NSString *)io_getmediadata:(NSString *)filename :(int)offset :(int)length; -- (NSString *)io_getmedialen:(NSString *)file :(NSString *)key; -- (NSString *)io_getmediadone:(NSString *)filename; -- (NSString *)io_remove:(NSString *)filename; -- (NSString *)io_registersound:(NSString *)dir :(NSString *)name; -- (NSString *)io_playsound:(NSString *)name; -- (NSString *)io_stopsound:(NSString *)name; - -- (NSString *)recordsound_recordstart; -- (NSString *)recordsound_recordstop; -- (NSString *)recordsound_volume; -- (NSString *)recordsound_startplay; -- (NSString *)recordsound_stopplay; -- (NSString *)recordsound_recordclose:(NSString *)keep; - -- (NSString *)scratchjr_cameracheck; -- (bool) scratchjr_has_multiple_cameras; -- (NSString *)scratchjr_startfeed:(NSString *)str; -- (NSString *)scratchjr_stopfeed; -- (NSString *)scratchjr_choosecamera:(NSString *)body; -- (NSString *)scratchjr_captureimage:(NSString *)onCameraCaptureComplete; -- (NSString *)sendSjrUsingShareDialog:(NSString *)fileName - :(NSString *)emailSubject - :(NSString *)emailBody - :(int)shareType - :(NSString *)b64data; -- (NSString *) deviceName; -- (NSString *) analyticsEvent:(NSString *)category :(NSString *)action :(NSString *)label; -- (void) setAnalyticsPlacePref:(NSString *)place; -@end - -@interface ViewController : UIViewController -@property (nonatomic, readwrite, strong) JSContext *js; -+ (UIWebView *)webview; +@interface ViewController : UIViewController ++ (WKWebView *)webview; + (UIImageView *)splashScreen; - (void)receiveProject:(NSString *)project; - (void)registerDefaultsFromSettingsBundle; @@ -147,6 +101,23 @@ - (void)showShareAirdrop:(NSURL *)projectURL; @end +@interface JsBridge: NSObject + +@property(weak, nonatomic) ViewController *controller; + +@end + +@interface JsRequest : NSObject + +@property(nonatomic, readwrite) NSString* callId; +@property(nonatomic, readwrite) NSString* method; +@property(nonatomic, readwrite) NSArray* params; + +- (instancetype) initWithDictionary: (NSDictionary *)dictionary; + +- (void) callback: (NSString *) res; + +@end @interface IO : NSObject diff --git a/ios/ScratchJr/src/ScratchJr.m b/ios/ScratchJr/src/ScratchJr.m index e5b6cca1..1396f279 100644 --- a/ios/ScratchJr/src/ScratchJr.m +++ b/ios/ScratchJr/src/ScratchJr.m @@ -113,10 +113,10 @@ + (NSString *)captureimage:(NSString *)oc{ + (void)reportImageError { NSString *callback = [NSString stringWithFormat: @"%@('error getting a still');",oncomplete]; - UIWebView *webview = [ViewController webview]; + WKWebView *webview = [ViewController webview]; dispatch_async(dispatch_get_main_queue(), ^{ - [webview stringByEvaluatingJavaScriptFromString: callback]; + [webview evaluateJavaScript:callback completionHandler:nil]; }); } @@ -124,9 +124,9 @@ + (void)sendBase64Image:(NSData *)imagedata { NSString *base64img = [cameraView getImageBase64:imagedata]; [self closefeed]; NSString *callback = [NSString stringWithFormat: @"%@('%@');",oncomplete, base64img]; - UIWebView *webview = [ViewController webview]; + WKWebView *webview = [ViewController webview]; dispatch_async(dispatch_get_main_queue(), ^{ - [webview stringByEvaluatingJavaScriptFromString: callback]; + [webview evaluateJavaScript:callback completionHandler:nil]; }); } diff --git a/ios/ScratchJr/src/View.xib b/ios/ScratchJr/src/View.xib new file mode 100644 index 00000000..a87ae3b7 --- /dev/null +++ b/ios/ScratchJr/src/View.xib @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/ScratchJr/src/ViewController.m b/ios/ScratchJr/src/ViewController.m index 064f2260..6e5a8828 100644 --- a/ios/ScratchJr/src/ViewController.m +++ b/ios/ScratchJr/src/ViewController.m @@ -1,12 +1,12 @@ #import "ScratchJr.h" +#import // @import MessageUI; @import Firebase; -UIWebView *webview; +WKWebView *webview; NSDate* startDate; UIImageView *splashScreen; NSDate *startDate; -JSContext *js; @interface ViewController () @@ -26,14 +26,17 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil - (void)viewDidLoad { [super viewDidLoad]; + + webview = [[WKWebView alloc] initWithFrame:CGRectZero configuration:[self webViewConfig]]; + webview.backgroundColor = UIColor.blackColor; + webview.navigationDelegate = self; + self.view = webview; [self registerDefaultsFromSettingsBundle]; - webview = (UIWebView*)[self view] ; // disable webview scroll // to fix https://github.com/LLK/scratchjr/issues/243 webview.scrollView.scrollEnabled = false; - [webview setDelegate:self]; [Database open:@"ScratchJr"]; [ScratchJr cameraInit]; [self reload]; @@ -44,6 +47,18 @@ - (void)viewDidLoad [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; } +- (WKWebViewConfiguration*) webViewConfig { + WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; + config.allowsInlineMediaPlayback = true; + config.allowsAirPlayForMediaPlayback = true; + [config.preferences setValue:@YES forKey:@"allowFileAccessFromFileURLs"]; + + WKUserContentController *controller = [[WKUserContentController alloc] init]; + [controller addScriptMessageHandler:[[JsBridge alloc] init] name:@"jsBridge"]; + config.userContentController = controller; + return config; +} + - (void) showSplash { UIImage *loadingImage = [UIImage imageNamed:@"Default-Landscape~ipad.png"]; splashScreen = [[UIImageView alloc] initWithImage:loadingImage]; @@ -59,7 +74,7 @@ - (void)didReceiveMemoryWarning // Dispose of any resources that can be recreated. } -+ (UIWebView*) webview {return webview;} ++ (WKWebView*) webview {return webview;} + (UIImageView*) splashScreen {return splashScreen;} - (void)registerDefaultsFromSettingsBundle { @@ -86,11 +101,11 @@ - (void)registerDefaultsFromSettingsBundle { } - (void)reload { - UIWebView *webview = (UIWebView*)[self view]; + WKWebView *webview = (WKWebView*)[self view]; NSString *location = [[NSUserDefaults standardUserDefaults] stringForKey:@"html"]; if ([location length] > 3) location = [location substringFromIndex:3]; NSString *path = [[NSBundle mainBundle] pathForResource: @"HTML5/index" ofType:@"html"]; - NSURL *url = [NSURL URLWithString: [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + NSURL *url = [NSURL fileURLWithPath:path]; NSURLRequest* request = [NSURLRequest requestWithURL:url]; [[NSURLCache sharedURLCache] removeAllCachedResponses]; [webview loadRequest:request]; @@ -103,46 +118,10 @@ - (void)viewDidAppear:(BOOL)animated{ startDate = [NSDate date]; } -// UIWebView delegate methods - -- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ - //read your request here - //before the webview will load your request - return YES; -} - -- (void)webViewDidStartLoad:(UIWebView *)webView{ - //access your request -} - -- (void)webViewDidFinishLoad:(UIWebView *)webView{ - // Inject a reference for the dispatch method into the UIWebView - // This happens after the page is loaded and the page's onLoad method is called - js = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; - js[@"tablet"] = self; - [self disableWebViewLongPressGestures:webView]; - - NSString *debugChoice =[[NSUserDefaults standardUserDefaults] stringForKey:@"debugstate"]; - - // Patch through app "advanced"->debug to allow users to display long-form errors - if (![debugChoice isEqualToString:@""] && ![debugChoice isEqualToString:@"0"]) { - [webView stringByEvaluatingJavaScriptFromString:@"window.reloadDebug = true;"]; - } - - NSURL* screenName = webView.request.URL.filePathURL; - NSString* screenString =[screenName absoluteString]; - NSArray* parts = [screenString componentsSeparatedByString:@"/"]; - NSString* page = [[[parts lastObject] componentsSeparatedByString:@"?"] firstObject]; - - // Track pageview in Firebase? - [FIRAnalytics setScreenName:page screenClass:NULL]; - -} - // Disables iOS 9 webview touch tooltip by disabling the long-press gesture recognizer in subviews // Thanks to Rye: // http://stackoverflow.com/questions/32687368/how-to-completely-disable-magnifying-glass-for-uiwebview-ios9 -- (void) disableWebViewLongPressGestures:(UIWebView *)webview { +- (void) disableWebViewLongPressGestures:(WKWebView *)webview { for(id subView in webview.subviews) { if([subView isKindOfClass:[UIScrollView class]]) { UIScrollView *scrollView = (UIScrollView *)subView; @@ -160,33 +139,27 @@ - (void) disableWebViewLongPressGestures:(UIWebView *)webview { } } -- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ - NSLog(@"could not load the website caused by error DESC: %@", error); - NSDictionary *userInfo = [error userInfo]; - NSString *desc = [NSString stringWithFormat:@"%@", ([userInfo objectForKey: @"NSLocalizedDescription"] == NULL)? [error localizedDescription]: [userInfo objectForKey: @"NSLocalizedDescription"]]; - NSString *callback = [NSString stringWithFormat: @"iOS.pageError('%@');",desc]; - UIWebView *webview = [ViewController webview]; - dispatch_async(dispatch_get_main_queue(), ^{ - [webview stringByEvaluatingJavaScriptFromString: callback]; - }); -} - - (void) receiveProject:(NSString *)project{ - NSString *callback = [NSString stringWithFormat:@"iOS.loadProjectFromSjr('%@');", project]; - UIWebView *webview = [ViewController webview]; + NSString *callback = [NSString stringWithFormat:@"OS.loadProjectFromSjr('%@');", project]; + WKWebView *webview = [ViewController webview]; dispatch_async(dispatch_get_main_queue(), ^{ - NSString *res = [webview stringByEvaluatingJavaScriptFromString:callback]; - if ([res isEqualToString:@"1"]) { - // Success - return; - } else if ([res isEqualToString:@"0"]) { - // Processing error - return; - } else { - // Loading the project failed - reschedule for a time when the WebView has hopefully loaded - // A little bit roundabout, but simpler than queueing projects to be loaded - [self performSelector:@selector(receiveProject:) withObject:project afterDelay:2.0]; - } + [webview evaluateJavaScript:callback completionHandler:^(id result, NSError * _Nullable error) { + if (error != nil) { + return; + } + NSString *res = [NSString stringWithFormat:@"%@", result]; + if ([res isEqualToString:@"1"]) { + // Success + return; + } else if ([res isEqualToString:@"0"]) { + // Processing error + return; + } else { + // Loading the project failed - reschedule for a time when the WebView has hopefully loaded + // A little bit roundabout, but simpler than queueing projects to be loaded + [self performSelector:@selector(receiveProject:) withObject:project afterDelay:2.0]; + } + }]; }); } @@ -194,152 +167,39 @@ - (BOOL)prefersStatusBarHidden{ return YES; } -/* -* JavaScript Interface Exports -*/ - --(void) askForPermission { - [RecordSound setPermission]; -} - --(NSString*) database_stmt: (NSString*) json { - return [Database stmt:json]; -} - --(NSString*) database_query: (NSString*) json { - return [Database query:json]; -} - --(NSString*) io_getmd5: (NSString*) str { - return [IO getMD5:str]; -} - --(NSString*) io_getsettings { - return [IO getsettings]; -} - --(void) io_cleanassets:(NSString*) fileType { - [IO cleanassets:fileType]; -} - --(NSString*) io_setfile:(NSString*)filename :(NSString*)base64ContentStr { - return [IO setfile:filename:base64ContentStr]; -} - --(NSString*) io_getfile:(NSString*)filename { - return [IO getfile:filename]; -} - --(NSString*) io_setmedia:(NSString*) base64ContentStr :(NSString*) extension { - return [IO setmedia:base64ContentStr:extension]; -} +// WKNavigationDelegate --(NSString*) io_setmedianame:(NSString*) contents :(NSString*) key :(NSString*) ext { - return [IO setmedianame:contents:key:ext]; -} - --(NSString*) io_getmedia:(NSString*) filename { - return [IO getmedia:filename]; -} - --(NSString*) io_getmediadata:(NSString*)filename :(int) offset :(int) length { - return [IO getmediadata:filename:offset:length]; -} - --(NSString*) io_getmedialen:(NSString*)file :(NSString*)key { - return [IO getmedialen:file:key]; -} - --(NSString*) io_getmediadone:(NSString*)filename { - return [IO getmediadone:filename]; -} - --(NSString*) io_remove:(NSString*)filename { - return [IO remove:filename]; -} - --(NSString*) io_registersound:(NSString*)dir :(NSString*)name { - return [IO registerSound:dir:name]; -} - --(NSString*) io_playsound:(NSString*) name { - return [IO playSound:name]; -} - --(NSString*) io_stopsound:(NSString*) name { - return [IO stopSound:name]; -} - --(NSString*) recordsound_recordstart { - return [RecordSound startRecord]; -} --(NSString*) recordsound_recordstop { - return [RecordSound stopRecording]; -} --(NSString*) recordsound_volume { - return [NSString stringWithFormat:@"%f", [RecordSound getVolume]]; -} --(NSString*) recordsound_startplay { - return [RecordSound startPlay]; -} --(NSString*) recordsound_stopplay { - return [RecordSound stopPlay]; -} --(NSString*) recordsound_recordclose:(NSString*) keep { - return [RecordSound recordclose:keep]; -} - --(NSString*) scratchjr_cameracheck { - return [ScratchJr cameracheck]; -} --(bool) scratchjr_has_multiple_cameras { - return YES; -} --(NSString*) scratchjr_startfeed:(NSString*)str { - return [ScratchJr startfeed:str]; -} --(NSString*) scratchjr_stopfeed { - return [ScratchJr stopfeed]; -} - --(NSString*) scratchjr_choosecamera:(NSString *)body { - return [ScratchJr choosecamera:body]; -} - --(NSString*) scratchjr_captureimage: (NSString*)onCameraCaptureComplete { - return [ScratchJr captureimage:onCameraCaptureComplete]; -} - -//iOS.sendSjrToShareDialog = function(fileName, emailSubject, emailBody, shareType, b64data) { +- (void) webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { + [webview evaluateJavaScript:@"window.tablet = window.webkit.messageHandlers.jsBridge" completionHandler:nil]; + [self disableWebViewLongPressGestures:webView]; --(NSString*) sendSjrUsingShareDialog:(NSString*) fileName :(NSString*) emailSubject :(NSString*) emailBody :(int) shareType :(NSString*) b64data { - return [IO sendSjrUsingShareDialog:fileName :emailSubject :emailBody :shareType : b64data]; -} + NSString *debugChoice =[[NSUserDefaults standardUserDefaults] stringForKey:@"debugstate"]; -- (NSString *) hideSplash :(NSString *)body { - return [ScratchJr hideSplash:body]; -} + // Patch through app "advanced"->debug to allow users to display long-form errors when projects fail to load + if (![debugChoice isEqualToString:@""] && ![debugChoice isEqualToString:@"0"]) { + [webView evaluateJavaScript:@"window.reloadDebug = true;" completionHandler:nil]; + } --(NSString*) analyticsEvent:(NSString*) category :(NSString*) action :(NSString*) label { - [FIRAnalytics logEventWithName:kFIREventViewItem - parameters:@{ - kFIRParameterItemID:action, - kFIRParameterItemName:label, - kFIRParameterItemCategory:category - }]; - return @"1"; -} + NSURL* screenName = webView.URL.filePathURL; + NSString* screenString =[screenName absoluteString]; + NSArray* parts = [screenString componentsSeparatedByString:@"/"]; + NSString* page = [[[parts lastObject] componentsSeparatedByString:@"?"] firstObject]; --(void) setAnalyticsPlacePref:(NSString*)place { - [FIRAnalytics setUserPropertyString:place forName:@"place_preference"]; + // Track pageview in Firebase? + [FIRAnalytics setScreenName:page screenClass:NULL]; } -// iPad name (used for information in the name/sharing dialog to help people using Airdrop) -- (NSString*) deviceName { - return [[UIDevice currentDevice] name]; +- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error { + NSLog(@"could not load the website caused by error DESC: %@", error); + NSDictionary *userInfo = [error userInfo]; + NSString *desc = [NSString stringWithFormat:@"%@", ([userInfo objectForKey: @"NSLocalizedDescription"] == NULL)? [error localizedDescription]: [userInfo objectForKey: @"NSLocalizedDescription"]]; + NSString *callback = [NSString stringWithFormat: @"iOS.pageError('%@');",desc]; + WKWebView *webview = [ViewController webview]; + dispatch_async(dispatch_get_main_queue(), ^{ + [webview evaluateJavaScript:callback completionHandler:nil]; + }); } - // Sharing controllers - if we later decide to unify, use UIActivityViewController // Email sharing diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..09ac858f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7331 @@ +{ + "name": "scratchjr", + "version": "1.2.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/polyfill": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.10.4.tgz", + "integrity": "sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg==", + "dev": true, + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-to-esprima": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/acorn-to-esprima/-/acorn-to-esprima-1.0.7.tgz", + "integrity": "sha1-lDYll2AJj56tm52iJC+rL0hQKBs=", + "dev": true + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "alter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", + "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", + "dev": true, + "requires": { + "stable": "~0.1.3" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-traverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", + "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=", + "dev": true + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-eslint": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-4.1.8.tgz", + "integrity": "sha1-T3nnpPWHns8D9Iyxb1UqNV/MMbI=", + "dev": true, + "requires": { + "acorn-to-esprima": "^1.0.5", + "babel-core": "^5.8.33", + "lodash.assign": "^3.2.0", + "lodash.pick": "^3.1.0" + }, + "dependencies": { + "babel-core": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", + "dev": true, + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", + "dev": true + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", + "dev": true + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", + "dev": true, + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-loader": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "dev": true, + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-constant-folding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", + "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=", + "dev": true + }, + "babel-plugin-dead-code-elimination": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", + "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=", + "dev": true + }, + "babel-plugin-eval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", + "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=", + "dev": true + }, + "babel-plugin-inline-environment-variables": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", + "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=", + "dev": true + }, + "babel-plugin-jscript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", + "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=", + "dev": true + }, + "babel-plugin-member-expression-literals": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", + "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=", + "dev": true + }, + "babel-plugin-property-literals": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", + "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=", + "dev": true + }, + "babel-plugin-proto-to-assign": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", + "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", + "dev": true, + "requires": { + "lodash": "^3.9.3" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "babel-plugin-react-constant-elements": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", + "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=", + "dev": true + }, + "babel-plugin-react-display-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", + "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=", + "dev": true + }, + "babel-plugin-remove-console": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", + "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=", + "dev": true + }, + "babel-plugin-remove-debugger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", + "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=", + "dev": true + }, + "babel-plugin-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", + "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-undeclared-variables-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", + "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", + "dev": true, + "requires": { + "leven": "^1.0.2" + } + }, + "babel-plugin-undefined-to-void": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", + "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=", + "dev": true + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "breakable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", + "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=", + "dev": true + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-width": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz", + "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "commoner": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", + "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", + "dev": true, + "requires": { + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + } + } + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "defs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", + "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", + "dev": true, + "requires": { + "alter": "~0.2.0", + "ast-traverse": "~0.1.1", + "breakable": "~1.0.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "simple-fmt": "~0.1.0", + "simple-is": "~0.2.0", + "stringmap": "~0.2.2", + "stringset": "~0.2.1", + "tryor": "~0.1.2", + "yargs": "~3.27.0" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "dev": true, + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "disparity": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/disparity/-/disparity-2.0.0.tgz", + "integrity": "sha1-V92stHMkrl9Y0swNqIbbTOnutxg=", + "dev": true, + "requires": { + "ansi-styles": "^2.0.1", + "diff": "^1.3.2" + } + }, + "doctrine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "dev": true, + "requires": { + "esutils": "^1.1.6", + "isarray": "0.0.1" + }, + "dependencies": { + "esutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", + "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es5-ext": { + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.51" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esformatter": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/esformatter/-/esformatter-0.8.2.tgz", + "integrity": "sha1-e6mIKqPtMIOfivds3fTxLaM3084=", + "dev": true, + "requires": { + "debug": "^0.7.4", + "disparity": "^2.0.0", + "espree": "^2.2.4", + "glob": "^5.0.3", + "minimist": "^1.1.1", + "mout": ">=0.9 <2.0", + "npm-run": "^2.0.0", + "resolve": "^1.1.5", + "rocambole": ">=0.7 <2.0", + "rocambole-indent": "^2.0.4", + "rocambole-linebreak": "^1.0.0", + "rocambole-node": "~1.0", + "rocambole-token": "^1.1.2", + "rocambole-whitespace": "^1.0.0", + "stdin": "*", + "strip-json-comments": "~0.1.1", + "supports-color": "^1.3.1", + "user-home": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + }, + "espree": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/espree/-/espree-2.2.5.tgz", + "integrity": "sha1-32kbkxCIlAKuspzAZnCMVmkLhUs=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "supports-color": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz", + "integrity": "sha1-FXWN8J2P87SswwdTn6vicJXhBC0=", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + } + } + }, + "esformatter-braces": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/esformatter-braces/-/esformatter-braces-1.2.1.tgz", + "integrity": "sha1-c+BxdEat5LsmnO7OtGw3AujB6Cc=", + "dev": true, + "requires": { + "rocambole-token": "^1.2.1" + } + }, + "esformatter-dot-notation": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esformatter-dot-notation/-/esformatter-dot-notation-1.3.1.tgz", + "integrity": "sha1-21uqJBQyFOVA+jJ9JV7rBPWxV+A=", + "dev": true, + "requires": { + "rocambole": "^0.6.0", + "rocambole-token": "^1.2.1", + "unquoted-property-validator": "^1.0.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "rocambole": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rocambole/-/rocambole-0.6.0.tgz", + "integrity": "sha1-U08jWih8wX+bBXuVvRHQ8Nw1RSw=", + "dev": true, + "requires": { + "esprima": "^2.0" + } + } + } + }, + "esformatter-quotes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esformatter-quotes/-/esformatter-quotes-1.1.0.tgz", + "integrity": "sha1-4ixsRFx/MGBB2BybnlH8psv6yoI=", + "dev": true + }, + "esformatter-semicolons": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/esformatter-semicolons/-/esformatter-semicolons-1.1.2.tgz", + "integrity": "sha1-I0GQ0iKGWm3FxcXooC2KyEctiu4=", + "dev": true + }, + "eslint": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-1.10.3.tgz", + "integrity": "sha1-+xmpGxPBWAgrvKKUsX2Xm8g1Ogo=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "concat-stream": "^1.4.6", + "debug": "^2.1.1", + "doctrine": "^0.7.1", + "escape-string-regexp": "^1.0.2", + "escope": "^3.3.0", + "espree": "^2.2.4", + "estraverse": "^4.1.1", + "estraverse-fb": "^1.3.1", + "esutils": "^2.0.2", + "file-entry-cache": "^1.1.1", + "glob": "^5.0.14", + "globals": "^8.11.0", + "handlebars": "^4.0.0", + "inquirer": "^0.11.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "3.4.5", + "json-stable-stringify": "^1.0.0", + "lodash.clonedeep": "^3.0.1", + "lodash.merge": "^3.3.2", + "lodash.omit": "^3.1.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.1", + "optionator": "^0.6.0", + "path-is-absolute": "^1.0.0", + "path-is-inside": "^1.0.1", + "shelljs": "^0.5.3", + "strip-json-comments": "~1.0.1", + "text-table": "~0.2.0", + "user-home": "^2.0.0", + "xml-escape": "~1.0.0" + }, + "dependencies": { + "espree": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/espree/-/espree-2.2.5.tgz", + "integrity": "sha1-32kbkxCIlAKuspzAZnCMVmkLhUs=", + "dev": true + }, + "globals": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", + "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=", + "dev": true + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", + "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estraverse-fb": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/estraverse-fb/-/estraverse-fb-1.3.2.tgz", + "integrity": "sha1-0yOky15awzHOoDNBOpJT4WQ+B8Q=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expose-loader": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.5.tgz", + "integrity": "sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz", + "integrity": "sha1-AXjc3uAjuSkFGTrwlZ6KdjnP3Lk=", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-entry-cache": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", + "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-readdir-recursive": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", + "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true, + "optional": true + } + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.2.0.tgz", + "integrity": "sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.11.4.tgz", + "integrity": "sha1-geM3ToNhvq/y2XAWIG01nQsy+k0=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^1.0.1", + "figures": "^1.3.5", + "lodash": "^3.3.1", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "intl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/intl/-/intl-1.2.5.tgz", + "integrity": "sha1-giRKIZDE5Bn4Nx9ao02qNCDiq94=" + }, + "intl-messageformat": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-1.3.0.tgz", + "integrity": "sha1-99kmre16OrGbLcYB79VOmaS9Tq4=", + "requires": { + "intl-messageformat-parser": "1.2.0" + } + }, + "intl-messageformat-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.2.0.tgz", + "integrity": "sha1-WQa3+VOrdHDg3IVJCXtki5kYkv8=" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-integer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", + "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.5.tgz", + "integrity": "sha1-w0A3l98SuRhmV08t4jZG/oyvtE0=", + "dev": true, + "requires": { + "argparse": "^1.0.2", + "esprima": "^2.6.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jszip": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.6.1.tgz", + "integrity": "sha1-uI86ey5noqBIFSmCx6N1bZxIKPA=", + "requires": { + "pako": "~1.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leven": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", + "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=", + "dev": true + }, + "levn": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz", + "integrity": "sha1-uo0znQykphDjo/FFucr0iAcVUFQ=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.0", + "type-check": "~0.3.1" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", + "dev": true + }, + "lodash._arraymap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraymap/-/lodash._arraymap-3.0.0.tgz", + "integrity": "sha1-Go/Q9MDfS2HeoHbXF83Jfwo8PmY=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", + "dev": true, + "requires": { + "lodash._arraycopy": "^3.0.0", + "lodash._arrayeach": "^3.0.0", + "lodash._baseassign": "^3.0.0", + "lodash._basefor": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basedifference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basedifference/-/lodash._basedifference-3.0.3.tgz", + "integrity": "sha1-8sIEKWwqeOArOJCBtu3KyTPPYpw=", + "dev": true, + "requires": { + "lodash._baseindexof": "^3.0.0", + "lodash._cacheindexof": "^3.0.0", + "lodash._createcache": "^3.0.0" + } + }, + "lodash._baseflatten": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", + "integrity": "sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c=", + "dev": true, + "requires": { + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", + "dev": true + }, + "lodash._baseindexof": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz", + "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz", + "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true, + "requires": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash._createcache": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", + "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._pickbyarray": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash._pickbyarray/-/lodash._pickbyarray-3.0.2.tgz", + "integrity": "sha1-H4mNlgfrVgsOFnOEt3x8bRCKpMU=", + "dev": true + }, + "lodash._pickbycallback": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._pickbycallback/-/lodash._pickbycallback-3.0.0.tgz", + "integrity": "sha1-/2G5oBens699MObFPeKK+hm4dQo=", + "dev": true, + "requires": { + "lodash._basefor": "^3.0.0", + "lodash.keysin": "^3.0.0" + } + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true, + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash.clonedeep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", + "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", + "dev": true, + "requires": { + "lodash._baseclone": "^3.0.0", + "lodash._bindcallback": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isplainobject": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", + "integrity": "sha1-moI4rhayAEMpYM1zRlEtASP79MU=", + "dev": true, + "requires": { + "lodash._basefor": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.keysin": "^3.0.0" + } + }, + "lodash.istypedarray": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", + "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.keysin": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", + "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", + "dev": true, + "requires": { + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.merge": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-3.3.2.tgz", + "integrity": "sha1-DZDZPtY3sYeEN7s+IWASYNev6ZQ=", + "dev": true, + "requires": { + "lodash._arraycopy": "^3.0.0", + "lodash._arrayeach": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.isplainobject": "^3.0.0", + "lodash.istypedarray": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.keysin": "^3.0.0", + "lodash.toplainobject": "^3.0.0" + } + }, + "lodash.omit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-3.1.0.tgz", + "integrity": "sha1-iX/jguZBPZrJfGH3jtHgV6AK+fM=", + "dev": true, + "requires": { + "lodash._arraymap": "^3.0.0", + "lodash._basedifference": "^3.0.0", + "lodash._baseflatten": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash._pickbyarray": "^3.0.0", + "lodash._pickbycallback": "^3.0.0", + "lodash.keysin": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash.pick": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-3.1.0.tgz", + "integrity": "sha1-8lKoVbIEa2G805BLJvdr0u/GVVA=", + "dev": true, + "requires": { + "lodash._baseflatten": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash._pickbyarray": "^3.0.0", + "lodash._pickbycallback": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.toplainobject": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz", + "integrity": "sha1-KHkK2ULSk9eKpmOgfs9/UsoEGY0=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keysin": "^3.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mout": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mout/-/mout-1.1.0.tgz", + "integrity": "sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-1.1.0.tgz", + "integrity": "sha1-BHSuAEGcMn1UcBt88s0F3Ii+EUA=", + "dev": true, + "requires": { + "which": "^1.2.4" + } + }, + "npm-run": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-run/-/npm-run-2.0.0.tgz", + "integrity": "sha1-KN/ArV4uRv4ISOK9WN3wAue3PBU=", + "dev": true, + "requires": { + "minimist": "^1.1.1", + "npm-path": "^1.0.1", + "npm-which": "^2.0.0", + "serializerr": "^1.0.1", + "spawn-sync": "^1.0.5", + "sync-exec": "^0.5.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-which": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-2.0.0.tgz", + "integrity": "sha1-DEaYIWC3gwk2YdHQG9RJbS/qu6w=", + "dev": true, + "requires": { + "commander": "^2.2.0", + "npm-path": "^1.0.0", + "which": "^1.0.5" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.6.0.tgz", + "integrity": "sha1-tj7Lvw4xX61LyYJ7Rdx7pFKE/LY=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~1.0.6", + "levn": "~0.2.5", + "prelude-ls": "~1.1.1", + "type-check": "~0.3.1", + "wordwrap": "~0.0.2" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", + "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "protochain": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/protochain/-/protochain-1.0.5.tgz", + "integrity": "sha1-mRxAfpneJkqt+PgVBLXn+ve/omA=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + } + }, + "recast": { + "version": "0.10.33", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", + "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", + "dev": true, + "requires": { + "ast-types": "0.8.12", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "ast-types": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", + "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator": { + "version": "0.8.40", + "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", + "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", + "dev": true, + "requires": { + "commoner": "~0.10.3", + "defs": "~1.1.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "recast": "0.10.33", + "through": "~2.3.8" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", + "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", + "dev": true, + "requires": { + "esprima": "^2.6.0", + "recast": "^0.10.10", + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + } + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rocambole": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rocambole/-/rocambole-0.7.0.tgz", + "integrity": "sha1-9seVBVF9xCtvuECEK4uVOw+WhYU=", + "dev": true, + "requires": { + "esprima": "^2.1" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + } + } + }, + "rocambole-indent": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/rocambole-indent/-/rocambole-indent-2.0.4.tgz", + "integrity": "sha1-oYokl3ygQAuGHapGMehh3LUtCFw=", + "dev": true, + "requires": { + "debug": "^2.1.3", + "mout": "^0.11.0", + "rocambole-token": "^1.2.1" + }, + "dependencies": { + "mout": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=", + "dev": true + } + } + }, + "rocambole-linebreak": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/rocambole-linebreak/-/rocambole-linebreak-1.0.2.tgz", + "integrity": "sha1-A2IVFbQ7RyHJflocG8paA2Y2jy8=", + "dev": true, + "requires": { + "debug": "^2.1.3", + "rocambole-token": "^1.2.1", + "semver": "^4.3.1" + } + }, + "rocambole-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rocambole-node/-/rocambole-node-1.0.0.tgz", + "integrity": "sha1-21tJ3nQHsAgN1RSHLyjjk9D3/z8=", + "dev": true + }, + "rocambole-token": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rocambole-token/-/rocambole-token-1.2.1.tgz", + "integrity": "sha1-x4XfdCjcPLJ614lwR71SOMwHDTU=", + "dev": true + }, + "rocambole-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rocambole-whitespace/-/rocambole-whitespace-1.0.0.tgz", + "integrity": "sha1-YzMJSSVrKZQfWbGQRZ+ZnGsdO/k=", + "dev": true, + "requires": { + "debug": "^2.1.3", + "repeat-string": "^1.5.0", + "rocambole-token": "^1.2.1" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "^1.3.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "serializerr": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/serializerr/-/serializerr-1.0.3.tgz", + "integrity": "sha1-EtTFqhw/+49tHcXzlaqUVVacP5E=", + "dev": true, + "requires": { + "protochain": "^1.0.5" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", + "integrity": "sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-fmt": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", + "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=", + "dev": true + }, + "simple-is": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", + "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "snapsvg": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/snapsvg/-/snapsvg-0.3.0.tgz", + "integrity": "sha1-DhWYNpLPshRsYJmiq6KhVoggJPY=" + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "dev": true, + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stdin": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", + "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringmap": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", + "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", + "dev": true + }, + "stringset": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", + "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz", + "integrity": "sha1-Fkxk43Coo8wAyeAbU55WmCPw7lQ=", + "dev": true + }, + "strip-sourcemap-loader": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/strip-sourcemap-loader/-/strip-sourcemap-loader-0.0.1.tgz", + "integrity": "sha1-xJK1SH3pCFNIrgfZJ7u9JR2Ptg0=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "sync-exec": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/sync-exec/-/sync-exec-0.5.0.tgz", + "integrity": "sha1-P3JY5KW6FyRTgZCfpqb2z1BuFmE=", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.1.tgz", + "integrity": "sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "try-resolve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", + "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", + "dev": true + }, + "tryor": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", + "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/type/-/type-1.0.3.tgz", + "integrity": "sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unquoted-property-validator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unquoted-property-validator/-/unquoted-property-validator-1.1.0.tgz", + "integrity": "sha512-ZWeQoYZ7HN8DCLeaowNv2GvZIXqJptKB1uUWd08ZYc1qAmJt8tXh9nck26aoYmhJtE3jCjDqdqEfUTqcJ0R7bw==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.39.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.3.tgz", + "integrity": "sha512-BXSI9M211JyCVc3JxHWDpze85CvjC842EvpRsVTc/d15YJGlox7GIDd38kJgWrb3ZluyvIjgenbLDMBQPDcxYQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.8.tgz", + "integrity": "sha512-RANYSXwikSWINjHMd/mtesblNSpjpDLoYTBtP99n1RhXqVI/wxN40Auqy42I7y4xrbmRBoA5Zy5E0JSBD5XRhw==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + } + } + }, + "webpack-notifier": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.8.0.tgz", + "integrity": "sha512-I6t76NoPe5DZCCm5geELmDV2wlJ89LbU425uN6T2FG8Ywrrt1ZcUMz6g8yWGNg4pttqTPFQJYUPjWAlzUEQ+cQ==", + "dev": true, + "requires": { + "node-notifier": "^5.1.2", + "object-assign": "^4.1.0", + "strip-ansi": "^3.0.1" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xml-escape": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.0.0.tgz", + "integrity": "sha1-AJY9aXsq3wwYXE4E5zF0upsojrI=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", + "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", + "dev": true, + "requires": { + "camelcase": "^1.2.1", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index d4f02f6e..34670a8e 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,12 @@ }, "homepage": "https://github.com/llk/scratchjr", "devDependencies": { + "@babel/polyfill": "^7.10.4", "babel-core": "^6.4.0", "babel-eslint": "^4.1.6", "babel-loader": "^7.1.4", "babel-preset-es2015": "^6.3.13", + "babel-preset-stage-3": "^6.24.1", "esformatter": "^0.8.1", "esformatter-braces": "^1.2.1", "esformatter-dot-notation": "^1.3.1", diff --git a/src/editor/ScratchJr.js b/src/editor/ScratchJr.js index f1b35ccc..d6852cbb 100644 --- a/src/editor/ScratchJr.js +++ b/src/editor/ScratchJr.js @@ -6,8 +6,8 @@ import Undo from './ui/Undo'; import Alert from './ui/Alert'; import Palette from './ui/Palette'; import Record from './ui/Record'; -import IO from '../iPad/IO'; -import iOS from '../iPad/iOS'; +import IO from '../tablet/IO'; +import OS from '../tablet/OS'; import UI from './ui/UI'; import Menu from './blocks/Menu'; import Library from './ui/Library'; @@ -183,7 +183,7 @@ export default class ScratchJr { document.body.scrollTop = 0; time = (new Date()) - 0; var urlvars = getUrlVars(); - iOS.hascamera(); + OS.hascamera(); ScratchJr.log('starting the app'); BlockSpecs.initBlocks(); Project.loadIcon = document.createElement('img'); @@ -345,7 +345,7 @@ export default class ScratchJr { static saveProject (e, onDone) { if (ScratchJr.isEditable() && editmode == 'storyStarter' && storyStarted && !Project.error) { - iOS.analyticsEvent('samples', 'story_starter_edited', Project.metadata.name); + OS.analyticsEvent('samples', 'story_starter_edited', Project.metadata.name); // Localize sample project names var sampleName = Localization.localize('SAMPLE_' + Project.metadata.name); // Get the new project name @@ -381,13 +381,14 @@ export default class ScratchJr { ScratchJr.stopStripsFromTop(e); ScratchJr.unfocus(e); ScratchJr.saveProject(e, ScratchJr.flippage); + OS.analyticsEvent('editor', 'project_editor_close'); } static flippage () { Alert.close(); - iOS.cleanassets('wav', doNext); + OS.cleanassets('wav', doNext); function doNext () { - iOS.cleanassets('svg', ScratchJr.switchPage); + OS.cleanassets('svg', ScratchJr.switchPage); } } @@ -524,7 +525,7 @@ export default class ScratchJr { ScratchJr.displayStatus('none'); inFullscreen = true; UI.enterFullScreen(); - iOS.analyticsEvent('editor', 'full_screen_entered'); + OS.analyticsEvent('editor', 'full_screen_entered'); document.body.style.background = 'black'; } @@ -536,6 +537,7 @@ export default class ScratchJr { inFullscreen = false; UI.quitFullScreen(); onBackButtonCallback.pop(); + OS.analyticsEvent('editor', 'full_screen_exited'); document.body.style.background = 'white'; } @@ -903,26 +905,6 @@ export default class ScratchJr { ///////////////// //Application on the background - - // XXX: does this ever happen? - // I'm pretty sure this is dead code -TM - static saveProjectState () { - ScratchAudio.sndFX('tap.wav'); - if (frame.style.display == 'none') { - Paint.saveEditState(ScratchJr.stopServer); - } else { - ScratchJr.unfocus(); - ScratchJr.stopStrips(); - if (ScratchJr.isEditable() && currentProject && !Project.error && changed) { - Project.save(currentProject, ScratchJr.stopServer); - } - } - } - - static stopServer () { - iOS.stopserver(iOS.trace); - } - /** * The functions that are invokved when the Android back button is clicked. * Methods are called from the rear and popped off after each invocation. diff --git a/src/editor/blocks/BlockSpecs.js b/src/editor/blocks/BlockSpecs.js index 40f6f5a5..14e4db67 100755 --- a/src/editor/blocks/BlockSpecs.js +++ b/src/editor/blocks/BlockSpecs.js @@ -1,5 +1,5 @@ import Localization from '../../utils/Localization'; -import IO from '../../iPad/IO'; +import IO from '../../tablet/IO'; let loadCount = 0; diff --git a/src/editor/engine/Page.js b/src/editor/engine/Page.js index e92e0649..7f5da2e4 100644 --- a/src/editor/engine/Page.js +++ b/src/editor/engine/Page.js @@ -5,9 +5,9 @@ import UI from '../ui/UI'; import Sprite from './Sprite'; import Palette from '../ui/Palette'; import BlockSpecs from '../blocks/BlockSpecs'; -import iOS from '../../iPad/iOS'; -import IO from '../../iPad/IO'; -import MediaLib from '../../iPad/MediaLib'; +import OS from '../../tablet/OS'; +import IO from '../../tablet/IO'; +import MediaLib from '../../tablet/MediaLib'; import Undo from '../ui/Undo'; import Matrix from '../../geom/Matrix'; import Vector from '../../geom/Vector'; @@ -125,7 +125,9 @@ export default class Page { return; } var me = this; - var url = (MediaLib.keys[name]) ? MediaLib.path + name : (name.indexOf('/') < 0) ? iOS.path + name : name; + var url = (MediaLib.keys[name]) ? + MediaLib.path + name : + (name.indexOf('/') < 0) ? OS.path + name : name; var md5 = (MediaLib.keys[name]) ? MediaLib.path + name : name; if (md5.substr(md5.length - 3) == 'png') { @@ -137,7 +139,7 @@ export default class Page { if (md5.indexOf('/') > -1) { IO.requestFromServer(md5, doNext); } else { - iOS.getmedia(md5, nextStep); + OS.getmedia(md5, nextStep); } function nextStep (base64) { doNext(atob(base64)); @@ -145,14 +147,10 @@ export default class Page { function doNext (str) { str = str.replace(/>\s*<'); me.setSVG(str); - if ((str.indexOf('xlink:href') < 0) && iOS.path) { - me.setBackgroundImage(url, fcn); // does not have embedded images - } else { + IO.getImagesInSVG(str, function () { var base64 = IO.getImageDataURL(me.md5, btoa(str)); - IO.getImagesInSVG(str, function () { - me.setBackgroundImage(base64, fcn); - }); - } + me.setBackgroundImage(base64, fcn); + }); } } diff --git a/src/editor/engine/Sprite.js b/src/editor/engine/Sprite.js index fafb578a..7f032431 100755 --- a/src/editor/engine/Sprite.js +++ b/src/editor/engine/Sprite.js @@ -12,9 +12,9 @@ import Project from '../ui/Project'; import Thumbs from '../ui/Thumbs'; import UI from '../ui/UI'; import BlockSpecs from '../blocks/BlockSpecs'; -import iOS from '../../iPad/iOS'; -import IO from '../../iPad/IO'; -import MediaLib from '../../iPad/MediaLib'; +import IO from '../../tablet/IO'; +import OS from '../../tablet/OS'; +import MediaLib from '../../tablet/MediaLib'; import Undo from '../ui/Undo'; import ScriptsPane from '../ui/ScriptsPane'; import SVG2Canvas from '../../utils/SVG2Canvas'; @@ -77,12 +77,11 @@ export default class Sprite { getAsset (whenDone) { var md5 = this.md5; var spr = this; - var url = (MediaLib.keys[md5]) ? MediaLib.path + md5 : (md5.indexOf('/') < 0) ? iOS.path + md5 : md5; md5 = (MediaLib.keys[md5]) ? MediaLib.path + md5 : md5; if (md5.indexOf('/') > -1) { IO.requestFromServer(md5, doNext); } else { - iOS.getmedia(md5, nextStep); + OS.getmedia(md5, nextStep); } function nextStep (base64) { doNext(atob(base64)); @@ -90,14 +89,10 @@ export default class Sprite { function doNext (str) { str = str.replace(/>\s*<'); spr.setSVG(str); - if ((str.indexOf('xlink:href') < 0) && iOS.path) { - whenDone(url); // does not have embedded images - } else { + IO.getImagesInSVG(str, function () { var base64 = IO.getImageDataURL(spr.md5, btoa(str)); - IO.getImagesInSVG(str, function () { - whenDone(base64); - }); - } + whenDone(base64); + }); } } @@ -716,6 +711,7 @@ export default class Sprite { var sprites = JSON.parse(page.sprites); sprites.push(this.id); page.sprites = JSON.stringify(sprites); + OS.analyticsEvent('editor', 'text_sprite_create'); if ((this.str == '') && !whenDone) { this.setTextBox(); this.activateInput(); @@ -805,6 +801,7 @@ export default class Sprite { document.body.scrollLeft = 0; var form = document.forms.activetextbox; var changed = (this.oldvalue != form.typing.value); + OS.analyticsEvent('editor', 'text_sprite_close'); if (this.noChars(form.typing.value)) { this.deleteText(this.oldvalue != ''); } else { @@ -889,6 +886,7 @@ export default class Sprite { var ti = document.forms.activetextbox.typing; gn('textbox').style.visibility = 'visible'; var me = this; + OS.analyticsEvent('editor', 'text_sprite_open'); ti.onblur = function () { me.unfocusText(); }; diff --git a/src/editor/ui/Library.js b/src/editor/ui/Library.js index 96ce9633..76cde193 100644 --- a/src/editor/ui/Library.js +++ b/src/editor/ui/Library.js @@ -1,8 +1,8 @@ import ScratchJr from '../ScratchJr'; -import iOS from '../../iPad/iOS'; -import IO from '../../iPad/IO'; -import MediaLib from '../../iPad/MediaLib'; +import OS from '../../tablet/OS'; +import IO from '../../tablet/IO'; +import MediaLib from '../../tablet/MediaLib'; import Paint from '../../painteditor/Paint'; import Events from '../../utils/Events'; import Localization from '../../utils/Localization'; @@ -406,12 +406,12 @@ export default class Library { // (this is possible if we receive a duplicate project, for example) Library.assetThumbnailUnique(data.altmd5, type, function (isUnique) { if (isUnique) { - iOS.remove(data.altmd5, iOS.trace); + OS.remove(data.altmd5, OS.trace); } }); } - IO.deleteobject(key, data.id, iOS.trace); + IO.deleteobject(key, data.id, OS.trace); } static parseAssetData (data) { @@ -525,7 +525,7 @@ export default class Library { if (!(selectedOne in MediaLib.keys)) { analyticsName = 'user_asset'; } - iOS.analyticsEvent('editor', 'new_character', analyticsName); + OS.analyticsEvent('editor', 'new_character', analyticsName); } Library.close(e); } @@ -542,7 +542,7 @@ export default class Library { if (!(selectedOne in MediaLib.keys)) { analyticsName = 'user_background'; } - iOS.analyticsEvent('editor', 'choose_background', analyticsName); + OS.analyticsEvent('editor', 'choose_background', analyticsName); } Library.close(e); } diff --git a/src/editor/ui/Palette.js b/src/editor/ui/Palette.js index 22f4d930..6f0ec7a6 100644 --- a/src/editor/ui/Palette.js +++ b/src/editor/ui/Palette.js @@ -7,8 +7,8 @@ import Block from '../blocks/Block'; import BlockSpecs from '../blocks/BlockSpecs'; import ScriptsPane from './ScriptsPane'; import Undo from './Undo'; -import iOS from '../../iPad/iOS'; -import MediaLib from '../../iPad/MediaLib'; +import OS from '../../tablet/OS'; +import MediaLib from '../../tablet/MediaLib'; import Events from '../../utils/Events'; import Rectangle from '../../geom/Rectangle'; import DrawPath from '../../utils/DrawPath'; @@ -582,7 +582,7 @@ export default class Palette { e.preventDefault(); switch (Palette.getLandingPlace(element, e)) { case 'scripts': - iOS.analyticsEvent('editor', 'new_block', element.owner.blocktype); + OS.analyticsEvent('editor', 'new_block_' + element.owner.blocktype); var sc = ScratchJr.getActiveScript(); var dx = localx(sc, element.left); var dy = localy(sc, element.top); diff --git a/src/editor/ui/Project.js b/src/editor/ui/Project.js index 8229dc54..3ad7a9a7 100644 --- a/src/editor/ui/Project.js +++ b/src/editor/ui/Project.js @@ -5,8 +5,8 @@ import Palette from './Palette'; import UI from './UI'; import Page from '../engine/Page'; import Sprite from '../engine/Sprite'; -import iOS from '../../iPad/iOS'; -import IO from '../../iPad/IO'; +import OS from '../../tablet/OS'; +import IO from '../../tablet/IO'; import Paint from '../../painteditor/Paint'; import SVG2Canvas from '../../utils/SVG2Canvas'; import {frame, gn, newHTML, scaleMultiplier, getIdFor, @@ -417,7 +417,7 @@ export default class Project { json.cond = 'deleted = ? AND id != ? AND gallery IS NULL'; json.items = ['name', 'thumbnail', 'id']; json.values = ['NO', projectID]; - IO.query(iOS.database, json, function (result) { + IO.query(OS.database, json, function (result) { var pdata = JSON.parse(result); var isUnique = true; for (var p = 0; p < pdata.length; p++) { @@ -444,7 +444,7 @@ export default class Project { if (thumb.md5.indexOf('samples/') < 0) { // In case we've exited story-starter mode Project.thumbnailUnique(thumb.md5, id, function (isUnique) { if (isUnique) { - iOS.remove(thumb.md5, iOS.trace); // remove thumb; + OS.remove(thumb.md5, OS.trace); // remove thumb; } }); } @@ -454,14 +454,14 @@ export default class Project { Project.getThumbnailPNG(ScratchJr.stage.pages[0], 192, 144, getMD5); function getMD5 (dataurl) { var pngBase64 = dataurl.split(',')[1]; - iOS.getmd5(pngBase64, function (str) { + OS.getmd5(pngBase64, function (str) { savePNG(str, pngBase64); }); } function savePNG (md5, pngBase64) { var filename = ScratchJr.currentProject + '_' + md5; - iOS.setmedianame(pngBase64, filename, 'png', doNext); + OS.setmedianame(pngBase64, filename, 'png', doNext); } function doNext (md5) { diff --git a/src/editor/ui/Record.js b/src/editor/ui/Record.js index c02cd5b0..a9dc43f2 100644 --- a/src/editor/ui/Record.js +++ b/src/editor/ui/Record.js @@ -1,7 +1,7 @@ import ScratchJr from '../ScratchJr'; import Palette from './Palette'; import Undo from './Undo'; -import iOS from '../../iPad/iOS'; +import OS from '../../tablet/OS'; import ScratchAudio from '../../utils/ScratchAudio'; import {frame, gn, newHTML, isTablet, isAndroid, setProps} from '../../utils/lib'; @@ -60,6 +60,7 @@ export default class Record { // Dialog box hide/show static appear () { + OS.analyticsEvent('editor', 'record_dialog_open'); gn('backdrop').setAttribute('class', 'modal-backdrop fade in'); setProps(gn('backdrop').style, { display: 'block' @@ -71,6 +72,7 @@ export default class Record { } static disappear () { + OS.analyticsEvent('editor', 'record_dialog_close'); setTimeout(function () { gn('backdrop').setAttribute('class', 'modal-backdrop fade'); setProps(gn('backdrop').style, { @@ -146,12 +148,13 @@ export default class Record { if (isRecording) { Record.stopRecording(); // Stop if we're already recording } else { - iOS.sndrecord(Record.startRecording); // Start a recording + OS.sndrecord(Record.startRecording); // Start a recording } } } static startRecording (filename) { + OS.analyticsEvent('editor', 'start_recording'); if (parseInt(filename) < 0) { // Error in getting record filename - go back to editor recordedSound = undefined; @@ -166,7 +169,7 @@ export default class Record { Record.soundname = filename; Record.toggleButtonUI('record', true); var poll = function () { - iOS.volume(Record.updateVolume, Record.recordError); + OS.volume(Record.updateVolume, Record.recordError); }; interval = setInterval(poll, 33); timeLimit = setTimeout(function () { @@ -199,7 +202,7 @@ export default class Record { // Start playing the sound and switch UI appropriately static startPlaying () { - iOS.startplay(Record.timeOutPlay); + OS.startplay(Record.timeOutPlay); Record.toggleButtonUI('play', true); isPlaying = true; } @@ -241,7 +244,7 @@ export default class Record { // Stop playing the sound and switch UI appropriately static stopPlayingSound (fcn) { - iOS.stopplay(fcn); + OS.stopplay(fcn); Record.toggleButtonUI('play', false); isPlaying = false; window.clearTimeout(playTimeLimit); @@ -250,6 +253,7 @@ export default class Record { // Stop the volume monitor and recording static stopRecording (fcn) { + OS.analyticsEvent('editor', 'stop_recording'); if (timeLimit != null) { clearTimeout(timeLimit); timeLimit = null; @@ -268,7 +272,7 @@ export default class Record { static volumeCheckStopped (fcn) { isRecording = false; Record.recordUIoff(); - iOS.recordstop(fcn); + OS.recordstop(fcn); } // Press OK (check) @@ -289,12 +293,12 @@ export default class Record { } static closeContinueSave () { - iOS.recorddisappear('YES', Record.registerProjectSound); + OS.recorddisappear('YES', Record.registerProjectSound); } static closeContinueRemove () { // don't get the sound - proceed right to tearDown - iOS.recorddisappear('NO', Record.tearDownRecorder); + OS.recorddisappear('NO', Record.tearDownRecorder); } static registerProjectSound () { diff --git a/src/editor/ui/Thumbs.js b/src/editor/ui/Thumbs.js index c7fba28e..1e6d1d2e 100644 --- a/src/editor/ui/Thumbs.js +++ b/src/editor/ui/Thumbs.js @@ -8,6 +8,7 @@ import Page from '../engine/Page'; import ScriptsPane from './ScriptsPane'; import Undo from './Undo'; import UI from './UI'; +import OS from '../../tablet/OS'; import Events from '../../utils/Events'; import ScratchAudio from '../../utils/ScratchAudio'; import {frame, gn, localx, newHTML, scaleMultiplier, getIdFor, @@ -82,6 +83,7 @@ export default class Thumbs { var tb = Thumbs.getType(Thumbs.t, 'pagethumb'); if (ScratchJr.shaking && (e.target.className == 'deletethumb')) { ScratchJr.clearSelection(); + OS.analyticsEvent('editor', 'delete_scene'); ScratchJr.stage.deletePage(tb.owner); return; } @@ -376,6 +378,7 @@ export default class Thumbs { sc.owner.deactivate(); } ScratchJr.unfocus(e); + OS.analyticsEvent('editor', 'add_scene'); new Page(getIdFor('page')); } diff --git a/src/editor/ui/UI.js b/src/editor/ui/UI.js index 42f6a827..f9a77615 100644 --- a/src/editor/ui/UI.js +++ b/src/editor/ui/UI.js @@ -13,15 +13,16 @@ import Stage from '../engine/Stage'; import ScriptsPane from './ScriptsPane'; import Undo from './Undo'; import Library from './Library'; -import iOS from '../../iPad/iOS'; -import IO from '../../iPad/IO'; -import MediaLib from '../../iPad/MediaLib'; +import OS from '../../tablet/OS'; +import IO from '../../tablet/IO'; +import MediaLib from '../../tablet/MediaLib'; import Paint from '../../painteditor/Paint'; import Events from '../../utils/Events'; import Localization from '../../utils/Localization'; import ScratchAudio from '../../utils/ScratchAudio'; -import {frame, gn, CSSTransition, localx, newHTML, scaleMultiplier, fullscreenScaleMultiplier, getIdFor, isTablet, newDiv, - newTextInput, isAndroid, getDocumentWidth, getDocumentHeight, setProps, globalx} from '../../utils/lib'; +import {frame, gn, CSSTransition, localx, newHTML, scaleMultiplier, fullscreenScaleMultiplier, + getIdFor, isTablet, newDiv, newTextInput, isAndroid, getDocumentWidth, getDocumentHeight, + setProps, globalx} from '../../utils/lib'; let projectNameTextInput = null; let info = null; @@ -156,7 +157,7 @@ export default class UI { }; } - iOS.deviceName(function (name) { + OS.deviceName(function (name) { gn('deviceName').textContent = name; }); @@ -257,7 +258,7 @@ export default class UI { setTimeout(saveAndShare, 500); // 500ms delay to wait for loading GIF to show and keyboard to hide - iOS.analyticsEvent('editor', 'share_button', (shareType == EMAILSHARE) ? 'email' : 'airdrop'); + OS.analyticsEvent('editor', 'share_button', (shareType == EMAILSHARE) ? 'email' : 'airdrop'); function saveAndShare () { // Save the project's new name @@ -276,7 +277,7 @@ export default class UI { var emailSubject = Localization.localize('SHARING_EMAIL_SUBJECT', { PROJECT_NAME: IO.shareName }); - iOS.sendSjrToShareDialog(IO.zipFileName, emailSubject, Localization.localize('SHARING_EMAIL_TEXT'), + OS.sendSjrToShareDialog(IO.zipFileName, emailSubject, Localization.localize('SHARING_EMAIL_TEXT'), shareType, contents); shareLoadingGif.style.visibility = 'hidden'; @@ -332,7 +333,7 @@ export default class UI { static handleTextFieldSave (dontHide) { // Handle story-starter mode project if (ScratchJr.isEditable() && ScratchJr.editmode == 'storyStarter' && !Project.error) { - iOS.analyticsEvent('samples', 'story_starter_edited', Project.metadata.name); + OS.analyticsEvent('samples', 'story_starter_edited', Project.metadata.name); // Get the new project name var sampleName = Localization.localize('SAMPLE_' + Project.metadata.name); IO.uniqueProjectName({ @@ -366,7 +367,7 @@ export default class UI { } Project.metadata.name = pname; ScratchJr.changed = true; - iOS.setfield(iOS.database, Project.metadata.id, 'name', pname); + OS.setfield(OS.database, Project.metadata.id, 'name', pname); if (!dontHide) { ScratchAudio.sndFX('exittap.wav'); gn('infobox').className = 'infobox fade'; @@ -729,7 +730,7 @@ export default class UI { UI.creatTopBarClicky(div, 'go', 'go on', UI.toggleRun); UI.creatTopBarClicky(div, 'resetall', 'resetall', UI.resetAllSprites); UI.creatTopBarClicky(div, 'full', 'fullscreen', ScratchJr.fullScreen); - UI.toggleGrid(true); + UI.setShowGrid(false); } static resetAllSprites (e) { @@ -756,11 +757,12 @@ export default class UI { static switchGrid () { ScratchAudio.sndFX('tap.wav'); - UI.toggleGrid(!Grid.hidden); + UI.setShowGrid(Grid.hidden); + OS.analyticsEvent('editor', Grid.hidden ? 'hide_grid' : 'show_grid'); } - static toggleGrid (b) { - Grid.hide(b); + static setShowGrid (b) { + Grid.hide(!b); gn('grid').className = Grid.hidden ? 'gridToggle off' : 'gridToggle on'; } diff --git a/src/entry/app.js b/src/entry/app.js index bcd31bff..2b4dabd4 100644 --- a/src/entry/app.js +++ b/src/entry/app.js @@ -1,9 +1,9 @@ import {preprocessAndLoadCss} from '../utils/lib'; import Localization from '../utils/Localization'; -import AppUsage from '../utils/AppUsage'; -import iOS from '../iPad/iOS'; -import IO from '../iPad/IO'; -import MediaLib from '../iPad/MediaLib'; +import InitialOptions from '../utils/InitialOptions'; +import OS from '../tablet/OS'; +import IO from '../tablet/IO'; +import MediaLib from '../tablet/MediaLib'; import {indexMain} from './index'; import {homeMain} from './home'; @@ -11,7 +11,6 @@ import {editorMain} from './editor'; import {gettingStartedMain} from './gettingstarted'; import {inappInterfaceGuide, inappAbout, inappBlocksGuide, inappPaintEditorGuide} from './inapp'; - function loadSettings (settingsRoot, whenDone) { IO.requestFromServer(settingsRoot + 'settings.json', (result) => { window.Settings = JSON.parse(result); @@ -42,7 +41,7 @@ window.onload = () => { preprocessAndLoadCss('css', 'css/thumbs.css'); /* For parental gate. These CSS properties should be refactored */ preprocessAndLoadCss('css', 'css/editor.css'); - entryFunction = () => iOS.waitForInterface(indexMain); + entryFunction = () => OS.waitForInterface(indexMain); break; case 'home': // Lobby pages @@ -50,7 +49,7 @@ window.onload = () => { preprocessAndLoadCss('css', 'css/base.css'); preprocessAndLoadCss('css', 'css/lobby.css'); preprocessAndLoadCss('css', 'css/thumbs.css'); - entryFunction = () => iOS.waitForInterface(homeMain); + entryFunction = () => OS.waitForInterface(homeMain); break; case 'editor': // Editor pages @@ -62,14 +61,14 @@ window.onload = () => { preprocessAndLoadCss('css', 'css/editormodal.css'); preprocessAndLoadCss('css', 'css/librarymodal.css'); preprocessAndLoadCss('css', 'css/paintlook.css'); - entryFunction = () => iOS.waitForInterface(editorMain); + entryFunction = () => OS.waitForInterface(editorMain); break; case 'gettingStarted': // Getting started video page preprocessAndLoadCss('css', 'css/font.css'); preprocessAndLoadCss('css', 'css/base.css'); preprocessAndLoadCss('css', 'css/gs.css'); - entryFunction = () => iOS.waitForInterface(gettingStartedMain); + entryFunction = () => OS.waitForInterface(gettingStartedMain); break; case 'inappAbout': // About ScratchJr in-app help frame @@ -111,6 +110,6 @@ window.onload = () => { }); }); // Initialize currentUsage data - AppUsage.initUsage(); + InitialOptions.initWithSettings(window.Settings.initialOptions); }); }; diff --git a/src/entry/editor.js b/src/entry/editor.js index 2b3be6e6..76434b1d 100644 --- a/src/entry/editor.js +++ b/src/entry/editor.js @@ -1,13 +1,14 @@ import ScratchJr from '../editor/ScratchJr'; -import iOS from '../iPad/iOS'; +import OS from '../tablet/OS'; import Camera from '../painteditor/Camera'; import Record from '../editor/ui/Record'; export function editorMain () { - iOS.getsettings(doNext); + OS.getsettings(doNext); + OS.analyticsEvent('editor', 'project_editor_open'); function doNext (str) { var list = str.split(','); - iOS.path = list[1] == '0' ? list[0] + '/' : undefined; + OS.path = list[1] == '0' ? list[0] + '/' : undefined; if (list.length > 2) { Record.available = list[2] == 'YES' ? true : false; } diff --git a/src/entry/home.js b/src/entry/home.js index aac133c7..3f495882 100644 --- a/src/entry/home.js +++ b/src/entry/home.js @@ -1,15 +1,15 @@ import {gn} from '../utils/lib'; import Localization from '../utils/Localization'; -import iOS from '../iPad/iOS'; +import OS from '../tablet/OS'; import Lobby from '../lobby/Lobby'; export function homeMain () { gn('logotab').ontouchend = homeGoBack; homeStrings(); - iOS.getsettings(doNext); + OS.getsettings(doNext); function doNext (str) { var list = str.split(','); - iOS.path = list[1] == '0' ? list[0] + '/' : undefined; + OS.path = list[1] == '0' ? list[0] + '/' : undefined; Lobby.appinit(window.Settings.scratchJrVersion); } } diff --git a/src/entry/index.js b/src/entry/index.js index 27415d5a..0b4ec849 100644 --- a/src/entry/index.js +++ b/src/entry/index.js @@ -1,19 +1,29 @@ import ScratchAudio from '../utils/ScratchAudio'; import {gn, getUrlVars, isAndroid, isiOS} from '../utils/lib'; -import iOS from '../iPad/iOS'; +import OS from '../tablet/OS'; import UI from '../editor/ui/UI'; import Localization from '../utils/Localization'; -import AppUsage from '../utils/AppUsage'; +import InitialOptions from '../utils/InitialOptions'; + +/* +When this code starts up, there are several scenarios: +* the app was already running: "AlreadyRunning" +* the app was not already running, but has been opened before: "NewSession" +* the app has never been opened before: "FirstTimeEver" + +*/ + +let alreadyStartedQuestions = false; export function indexMain () { gn('gettings').ontouchend = indexGettingstarted; gn('startcode').ontouchend = indexGohome; ScratchAudio.init(); var urlvars = getUrlVars(); - if (urlvars.back) { - indexLoadOptions(); + if (urlvars.back && InitialOptions.allQuestionsAnswered()) { + indexLoadStart(); } else { - indexFirstTime(); + indexNewSession(); } if (window.Settings.edition == 'PBS') { @@ -36,7 +46,28 @@ export function indexMain () { }, 250); } -function indexFirstTime () { +function startQuestionsIfNotAlreadyStarted () { + if (!alreadyStartedQuestions) { + alreadyStartedQuestions = true; + indexAskRemainingQuestions(); + } + window.removeEventListener('touchend', startQuestionsIfNotAlreadyStarted, false); +} + +function indexNewSession () { + showSplash(); + OS.askpermission(); // ask for sound recording + setTimeout(function () { + OS.hidesplash(addTouchListener); + }, 500); + // may be necessary to wait for a touch in some environments + function addTouchListener () { + window.addEventListener('touchend', startQuestionsIfNotAlreadyStarted, false); + } + setTimeout(startQuestionsIfNotAlreadyStarted, 2000); +} + +function showSplash () { gn('authors').className = 'credits show'; gn('authorsText').className = 'creditsText show'; if (window.Settings.edition == 'PBS') { @@ -49,29 +80,9 @@ function indexFirstTime () { gn('blueguy').className = 'blue show'; gn('redguy').className = 'red show'; } - iOS.askpermission(); // ask for sound recording - setTimeout(function () { - iOS.hidesplash(doit); - }, 500); - function doit () { - window.ontouchend = function () { - indexLoadOptions(); - }; - } - setTimeout(function () { - indexLoadOptions(); - }, 2000); -} - -function indexLoadOptions () { - if (window.Settings.edition != 'PBS' && AppUsage.askForUsage()) { - indexLoadUsage(); - } else { - indexLoadStart(); - } } -function indexLoadStart (afterUsage) { +function indexHideSplash () { gn('authors').className = 'credits hide'; gn('authorsText').className = 'creditsText hide'; @@ -84,20 +95,27 @@ function indexLoadStart (afterUsage) { gn('blueguy').className = 'blue hide'; gn('redguy').className = 'red hide'; gn('gear').className = 'gear show'; - - if (afterUsage) { - gn('catface').className = 'catface show'; - gn('jrlogo').className = 'jrlogo show'; - gn('usageQuestion').className = 'usageQuestion hide'; - gn('usageSchool').className = 'usageSchool hide'; - gn('usageHome').className = 'usageHome hide'; - gn('usageOther').className = 'usageOther hide'; - gn('usageNoanswer').className = 'usageNoanswer hide'; - } - iOS.setAnalyticsPlacePref(AppUsage.currentUsage); } +} + +// set analytics prefs for all initial options, whether set in this session +// or before +function indexSetAnalyticsPrefs () { + var prefs = InitialOptions.getCurrentVals(); + if (!prefs) return; + Object.keys(prefs).map(function (key) { + OS.setAnalyticsPref(key, prefs[key]); + }); +} + +function indexLoadStart () { + indexHideSplash(); + showLogo(); gn('gettings').className = 'gettings show'; gn('startcode').className = 'startcode show'; + + indexSetAnalyticsPrefs(); + document.ontouchmove = function (e) { e.preventDefault(); }; @@ -106,14 +124,31 @@ function indexLoadStart (afterUsage) { } } -function indexLoadUsage () { +function indexAskRemainingQuestions () { + var nextQuestionKey = InitialOptions.nextUnansweredQuestion(); + if (nextQuestionKey) { + indexShowQuestion(nextQuestionKey); + } else { // done with questions + indexLoadStart(); + } +} + +function hideLogo () { + gn('catface').className = 'catface hide'; + gn('jrlogo').className = 'jrlogo hide'; +} + +function showLogo () { + gn('catface').className = 'catface show'; + gn('jrlogo').className = 'jrlogo show'; +} + +function indexAskPlace () { gn('authors').className = 'credits show'; gn('authorsText').className = 'creditsText hide'; gn('purpleguy').className = 'purple hide'; gn('blueguy').className = 'blue hide'; gn('redguy').className = 'red hide'; - gn('catface').className = 'catface hide'; - gn('jrlogo').className = 'jrlogo hide'; gn('usageQuestion').textContent = Localization.localize('USAGE_QUESTION'); gn('useSchoolText').textContent = Localization.localize('USAGE_SCHOOL'); @@ -126,14 +161,142 @@ function indexLoadUsage () { gn('usageHome').className = 'usageHome show'; gn('usageOther').className = 'usageOther show'; gn('usageNoanswer').className = 'usageNoanswer show'; - gn('usageSchool').ontouchend = indexSetUsage; - gn('usageHome').ontouchend = indexSetUsage; - gn('usageOther').ontouchend = indexSetUsage; - gn('usageNoanswer').ontouchend = indexSetUsage; + gn('usageSchool').ontouchend = indexSetPlace; + gn('usageHome').ontouchend = indexSetPlace; + gn('usageOther').ontouchend = indexSetPlace; + gn('usageNoanswer').ontouchend = indexSetPlace; +} + +function indexSetPlace (e) { + var usageText = ''; + + switch (e.target.parentElement.id) { + case 'usageSchool': + usageText = 'school'; + break; + case 'usageHome': + usageText = 'home'; + break; + case 'usageOther': + usageText = 'other'; + break; + case 'usageNoanswer': + default: + usageText = 'noanswer'; + break; + } + // Send one-time analytics event about usage + OS.analyticsEvent('lobby', 'scratchjr_usage', usageText); + InitialOptions.setValue('place_preference', usageText); + ScratchAudio.sndFX('tap.wav'); + indexHidePlaceQuestion(); + indexAskRemainingQuestions(); +} + +function indexHidePlaceQuestion () { + gn('catface').className = 'catface show'; + gn('jrlogo').className = 'jrlogo show'; + gn('usageQuestion').className = 'usageQuestion hide'; + gn('usageSchool').className = 'usageSchool hide'; + gn('usageHome').className = 'usageHome hide'; + gn('usageOther').className = 'usageOther hide'; + gn('usageNoanswer').className = 'usageNoanswer hide'; +} + +function optionTouched (elem) { + var key = elem.target.getAttribute('data-key'); + var value = elem.target.getAttribute('data-value'); + // sometimes a touch is registered by a child of the relevant parent + if (!key && !value) { + var parent = elem.target.parentNode; + key = parent.getAttribute('data-key'); + value = parent.getAttribute('data-value'); + } + // if we still don't have a key and value, something is wrong -- just go + // to lobby + if (!key && !value) { + indexLoadStart(); + return; + } + // elem.target.style.backgroundColor = 'purple'; + // if everything is good, register the selection and advance to next screen + indexSelectOption(key, value); +} + +// show the question for a given settings option key +function indexShowQuestion (key) { + indexHideSplash(); + hideLogo(); + var optionType = InitialOptions.optionTypeForKey(key); + if (optionType === 'place_preference') { + indexAskPlace(); + } else { // custom question + var options = InitialOptions.optionsForKey(key); + // if we could not find any options, choose 'n/a' + if (!options || !options.length) { + indexSelectOption(key, 'none'); + return; + } + // if there's only one option, don't bother asking, just choose it! + if (options.length === 1) { + indexSelectOption(key, options[0]); + return; + } + // if we got here, there is more than one option... + var instructionText = Localization.localizeOptional(InitialOptions.instructionForKey(key)); + var instructionElem = document.getElementById('optionsInstruction'); + instructionElem.appendChild(document.createTextNode(instructionText)); + gn('optionsInstruction').className = 'optionsInstruction show'; + + var optionsListElem = document.getElementById('optionsList'); + var optionNum = 0; + options.forEach(function (option) { + var optionElem = document.createElement('div'); + optionElem.setAttribute('data-key', key); + optionElem.setAttribute('data-value', option); + optionElem.setAttribute('id', 'option-' + key + '-' + optionNum); + optionElem.ontouchend = optionTouched; + optionsListElem.appendChild(optionElem); + + switch (optionType) { + case 'image': + var imgElem = document.createElement('img'); + imgElem.setAttribute('src', 'svglibrary/' + option); + imgElem.setAttribute('style', 'max-width: 150px; max-height: 90px'); + optionElem.appendChild(imgElem); + break; + case 'text': + default: + var translatedOption = Localization.localizeOptional(option); + optionElem.appendChild(document.createTextNode(translatedOption)); + break; + } + optionNum = optionNum + 1; + }); + gn('optionsList').className = 'optionsList show'; + } +} + +// store user selection, and show next question +function indexSelectOption (key, val) { + InitialOptions.setValue(key, val); + ScratchAudio.sndFX('tap.wav'); + + // clear out old options instruction + var instructionElem = document.getElementById('optionsInstruction'); + instructionElem.innerHTML = ''; + gn('optionsInstruction').className = 'optionsInstruction hide'; + // clear out old options content + var optionsListElem = document.getElementById('optionsList'); + optionsListElem.innerHTML = ''; + gn('optionsList').className = 'optionsList hide'; + + // show next question, or advance to start screen + indexAskRemainingQuestions(); } function indexGohome () { - iOS.setfile('homescroll.sjr', 0, function () { + OS.setfile('homescroll.sjr', 0, function () { doNext(); }); function doNext () { @@ -153,29 +316,6 @@ function indexGettingstarted () { window.location.href = 'gettingstarted.html?place=home'; } -function indexSetUsage (e) { - var usageText = ''; - - switch (e.target.parentElement.id) { - case 'usageSchool': - usageText = 'school'; - break; - case 'usageHome': - usageText = 'home'; - break; - case 'usageOther': - usageText = 'other'; - break; - case 'usageNoanswer': - usageText = 'noanswer'; - break; - } - // Send one-time analytics event about usage - iOS.analyticsEvent('lobby', 'scratchjr_usage', usageText); - AppUsage.setUsage(usageText); - ScratchAudio.sndFX('tap.wav'); - indexLoadStart(true); -} // For PBS KIDS edition only function indexInfo () { ScratchAudio.sndFX('tap.wav'); diff --git a/src/iPad/iOS.js b/src/iPad/iOS.js deleted file mode 100644 index 8062bfec..00000000 --- a/src/iPad/iOS.js +++ /dev/null @@ -1,375 +0,0 @@ -import {isiOS, gn} from '../utils/lib'; -import IO from './IO'; -import Lobby from '../lobby/Lobby'; -import Alert from '../editor/ui/Alert'; -import ScratchAudio from '../utils/ScratchAudio'; - -////////////////////////////////////////////////// -// Tablet interface functions -////////////////////////////////////////////////// - -// This file and object are named "iOS" for legacy reasons. -// But, it is also used for the AndroidInterface. All function calls here -// are mapped to Android/iOS native calls. - -let path; -let camera; -let database = 'projects'; -let mediacounter = 0; -let tabletInterface = null; - -export default class iOS { - // Getters/setters for properties used in other classes - static get path () { - return path; - } - - static set path (newPath) { - path = newPath; - } - - static get camera () { - return camera; - } - - static get database () { - return database; - } - - // Wait for the tablet interface to be injected into the webview - static waitForInterface (fcn) { - // Already loaded the interface - if (tabletInterface != null) { - fcn(); - return; - } - - // Android device - if (typeof AndroidInterface !== 'undefined') { - tabletInterface = AndroidInterface; - if (fcn) { - fcn(); - } - return; - } - - // iOS device - might not be loaded yet - if (typeof (window.tablet) != 'object') { - // Come back in 100ms - setTimeout(function () { - iOS.waitForInterface(fcn); - }, 100); - } else { - // All set to run commands - tabletInterface = window.tablet; - if (fcn) { - fcn(); - } - } - } - - // Database functions - static stmt (json, fcn) { - var result = tabletInterface.database_stmt(JSON.stringify(json)); - if (typeof (fcn) !== 'undefined') { - fcn(result); - } - } - - static query (json, fcn) { - var result = tabletInterface.database_query(JSON.stringify(json)); - if (typeof (fcn) !== 'undefined') { - fcn(result); - } - } - - static setfield (db, id, fieldname, val, fcn) { - var json = {}; - var keylist = [fieldname + ' = ?', 'mtime = ?']; - json.values = [val, (new Date()).getTime().toString()]; - json.stmt = 'update ' + db + ' set ' + keylist.toString() + ' where id = ' + id; - iOS.stmt(json, fcn); - } - - // IO functions - - static cleanassets (ft, fcn) { - tabletInterface.io_cleanassets(ft); fcn(); - } - - static getmedia (file, fcn) { - mediacounter++; - var nextStep = function (file, key, whenDone) { - var result = tabletInterface.io_getmedialen(file, key); - iOS.processdata(key, 0, result, '', whenDone); - }; - nextStep(file, mediacounter, fcn); - } - - static getmediadata (key, offset, len, fcn) { - var result = tabletInterface.io_getmediadata(key, offset, len); - if (fcn) { - fcn(result); - } - } - - static processdata (key, off, len, oldstr, fcn) { - if (len == 0) { - iOS.getmediadone(key); - fcn(oldstr); - return; - } - var newlen = (len < 100000) ? len : 100000; - iOS.getmediadata(key, off, newlen, function (str) { - iOS.processdata(key, off + newlen, len - newlen, oldstr + str, fcn); - }); - } - - static getsettings (fcn) { - var result = tabletInterface.io_getsettings(); - if (fcn) { - fcn(result); - } - } - - static getmediadone (file, fcn) { - var result = tabletInterface.io_getmediadone(file); - if (fcn) { - fcn(result); - } - } - - static setmedia (str, ext, fcn) { - var result = tabletInterface.io_setmedia(str, ext); - if (fcn) { - fcn(result); - } - } - - static setmedianame (str, name, ext, fcn) { - var result = tabletInterface.io_setmedianame(str, name, ext); - if (fcn) { - fcn(result); - } - } - - static getmd5 (str, fcn) { - var result = tabletInterface.io_getmd5(str); - if (fcn) { - fcn(result); - } - } - - static remove (str, fcn) { - var result = tabletInterface.io_remove(str); - if (fcn) { - fcn(result); - } - } - - static getfile (str, fcn) { - var result = tabletInterface.io_getfile(str); - if (fcn) { - fcn(result); - } - } - - static setfile (name, str, fcn) { - var result = tabletInterface.io_setfile(name, btoa(str)); - if (fcn) { - fcn(result); - } - } - - // Sound functions - - static registerSound (dir, name, fcn) { - var result = tabletInterface.io_registersound(dir, name); - if (fcn) { - fcn(result); - } - } - - static playSound (name, fcn) { - var result = tabletInterface.io_playsound(name); - if (fcn) { - fcn(result); - } - } - - static stopSound (name, fcn) { - var result = tabletInterface.io_stopsound(name); - if (fcn) { - fcn(result); - } - } - - // Web Wiew delegate call backs - - static soundDone (name) { - ScratchAudio.soundDone(name); - } - - static sndrecord (fcn) { - var result = tabletInterface.recordsound_recordstart(); - if (fcn) { - fcn(result); - } - } - - static recordstop (fcn) { - var result = tabletInterface.recordsound_recordstop(); - if (fcn) { - fcn(result); - } - } - - static volume (fcn) { - var result = tabletInterface.recordsound_volume(); - if (fcn) { - fcn(result); - } - } - - static startplay (fcn) { - var result = tabletInterface.recordsound_startplay(); - if (fcn) { - fcn(result); - } - } - - static stopplay (fcn) { - var result = tabletInterface.recordsound_stopplay(); - if (fcn) { - fcn(result); - } - } - - static recorddisappear (b, fcn) { - var result = tabletInterface.recordsound_recordclose(b); - if (fcn) { - fcn(result); - } - } - - // Record state - static askpermission () { - if (isiOS) { - tabletInterface.askForPermission(); - } - } - - // camera functions - - static hascamera () { - camera = tabletInterface.scratchjr_cameracheck(); - } - - static startfeed (data, fcn) { - var str = JSON.stringify(data); - var result = tabletInterface.scratchjr_startfeed(str); - if (fcn) { - fcn(result); - } - } - - static stopfeed (fcn) { - var result = tabletInterface.scratchjr_stopfeed(); - if (fcn) { - fcn(result); - } - } - - static choosecamera (mode, fcn) { - var result = tabletInterface.scratchjr_choosecamera(mode); - if (fcn) { - fcn(result); - } - } - - static captureimage (fcn) { - tabletInterface.scratchjr_captureimage(fcn); - } - - static hidesplash (fcn) { - if (isiOS) { - tabletInterface.hideSplash(); - } - if (fcn) { - fcn(); - } - } - - static trace (str) { - console.log(str); // eslint-disable-line no-console - } - - static parse (str) { - console.log(JSON.parse(str)); // eslint-disable-line no-console - } - - static tracemedia (str) { - console.log(atob(str)); // eslint-disable-line no-console - } - - ignore () { - } - - /////////////// - // Sharing - /////////////// - - - // Called on the JS side to trigger native UI for project sharing. - // fileName: name for the file to share - // emailSubject: subject text to use for an email - // emailBody: body HTML to use for an email - // shareType: 0 for Email; 1 for Airdrop - // b64data: base-64 encoded .SJR file to share - - static sendSjrToShareDialog (fileName, emailSubject, emailBody, shareType, b64data) { - tabletInterface.sendSjrUsingShareDialog(fileName, emailSubject, emailBody, shareType, b64data); - } - - // Called on the Objective-C side. The argument is a base64-encoded .SJR file, - // to be unzipped, processed, and stored. - static loadProjectFromSjr (b64data) { - try { - IO.loadProjectFromSjr(b64data); - } catch (err) { - var errorMessage = 'Couldn\'t load share -- project data corrupted. ' + err.message; - Alert.open(gn('frame'), gn('frame'), errorMessage, '#ff0000'); - console.log(err); // eslint-disable-line no-console - return 0; - } - return 1; - } - - // Name of the device/iPad to display on the sharing dialog page - // fcn is called with the device name as an arg - static deviceName (fcn) { - fcn(tabletInterface.deviceName()); - } - - static analyticsEvent (category, action, label) { - tabletInterface.analyticsEvent(category, action, label); - } - - static setAnalyticsPlacePref (preferredPlace) { - tabletInterface.setAnalyticsPlacePref(preferredPlace); - } - - // Web Wiew delegate call backs - - static pageError (desc) { - console.log('XCODE ERROR:', desc); // eslint-disable-line no-console - if (window.location.href.indexOf('home.html') > -1) { - if (Lobby.errorTimer) { - Lobby.errorLoading(desc); - } - } - } -} - -// Expose iOS methods for ScratchJr tablet sharing callbacks -window.iOS = iOS; diff --git a/src/lobby/Home.js b/src/lobby/Home.js index 161bb2ba..6a782041 100755 --- a/src/lobby/Home.js +++ b/src/lobby/Home.js @@ -3,8 +3,8 @@ ////////////////////////////////////////////////// import Lobby from './Lobby'; -import iOS from '../iPad/iOS'; -import IO from '../iPad/IO'; +import OS from '../tablet/OS'; +import IO from '../tablet/IO'; import Project from '../editor/ui/Project'; import Localization from '../utils/Localization'; import ScratchAudio from '../utils/ScratchAudio'; @@ -135,7 +135,7 @@ export default class Home { if (md5 && (md5 == 'newproject')) { Home.createNewProject(); } else if (md5) { - iOS.setfile('homescroll.sjr', gn('wrapc').scrollTop, function () { + OS.setfile('homescroll.sjr', gn('wrapc').scrollTop, function () { doNext(md5); }); } @@ -144,10 +144,10 @@ export default class Home { ScratchAudio.sndFX('cut.wav'); Project.thumbnailUnique(Home.actionTarget.thumb, Home.actionTarget.id, function (isUnique) { if (isUnique) { - iOS.remove(Home.actionTarget.thumb, iOS.trace); + OS.remove(Home.actionTarget.thumb, OS.trace); } }); - iOS.setfield(iOS.database, Home.actionTarget.id, 'deleted', 'YES', Home.removeProjThumb); + OS.setfield(OS.database, Home.actionTarget.id, 'deleted', 'YES', Home.removeProjThumb); break; default: if (Home.actionTarget && (Home.actionTarget.childElementCount > 2)) { @@ -156,13 +156,13 @@ export default class Home { break; } function doNext () { - iOS.analyticsEvent('lobby', 'existing_project_edited'); + OS.analyticsEvent('lobby', 'existing_project_edited'); window.location.href = 'editor.html?pmd5=' + md5 + '&mode=edit'; } } static createNewProject () { - iOS.analyticsEvent('lobby', 'project_created'); + OS.analyticsEvent('lobby', 'project_created'); var obj = {}; // XXX: for localization, the new project name should likely be refactored obj.name = Home.getNextName(Localization.localize('NEW_PROJECT_PREFIX')); @@ -172,7 +172,7 @@ export default class Home { } static gotoEditor (md5) { - iOS.setfile('homescroll.sjr', gn('wrapc').scrollTop, function () { + OS.setfile('homescroll.sjr', gn('wrapc').scrollTop, function () { doNext(md5); }); function doNext (md5) { @@ -230,7 +230,7 @@ export default class Home { ////////////////////////// static displayYourProjects () { - iOS.getfile('homescroll.sjr', gotScrollsState); + OS.getfile('homescroll.sjr', gotScrollsState); function gotScrollsState (str) { var num = Number(atob(str)); scrollvalue = (num.toString() == 'NaN') ? 0 : num; @@ -239,7 +239,7 @@ export default class Home { json.items = ['name', 'thumbnail', 'id', 'isgift']; json.values = ['NO', version]; json.order = 'ctime desc'; - IO.query(iOS.database, json, Home.displayProjects); + IO.query(OS.database, json, Home.displayProjects); } } diff --git a/src/lobby/Lobby.js b/src/lobby/Lobby.js index 680a7c37..eb416e26 100644 --- a/src/lobby/Lobby.js +++ b/src/lobby/Lobby.js @@ -4,7 +4,7 @@ import {libInit, getUrlVars, gn, isAndroid, newHTML} from '../utils/lib'; import ScratchAudio from '../utils/ScratchAudio'; -import iOS from '../iPad/iOS'; +import OS from '../tablet/OS'; import Localization from '../utils/Localization'; import Cookie from '../utils/Cookie'; @@ -98,7 +98,7 @@ export default class Lobby { var doNext = function (page) { Lobby.changePage(page); }; - iOS.setfile('homescroll.sjr', gn('wrapc').scrollTop, function () { + OS.setfile('homescroll.sjr', gn('wrapc').scrollTop, function () { doNext(page); }); } else { @@ -203,7 +203,7 @@ export default class Lobby { ScratchAudio.sndFX('tap.wav'); let newLocale = window.Settings.supportedLocales[e.target.textContent]; Cookie.set('localization', newLocale); - iOS.analyticsEvent('lobby', 'language_changed', newLocale); + OS.analyticsEvent('lobby', 'language_changed', newLocale); window.location = '?place=gear'; }; } diff --git a/src/lobby/Samples.js b/src/lobby/Samples.js index 240032a4..82ae4172 100644 --- a/src/lobby/Samples.js +++ b/src/lobby/Samples.js @@ -3,9 +3,9 @@ ////////////////////////////////////////////////// import Lobby from './Lobby'; -import IO from '../iPad/IO'; -import iOS from '../iPad/iOS'; -import MediaLib from '../iPad/MediaLib'; +import OS from '../tablet/OS'; +import IO from '../tablet/IO'; +import MediaLib from '../tablet/MediaLib'; import ScratchAudio from '../utils/ScratchAudio'; import Localization from '../utils/Localization'; import {gn, newHTML} from '../utils/lib'; @@ -75,7 +75,7 @@ export default class Samples { e.preventDefault(); e.stopPropagation(); ScratchAudio.sndFX('tap.wav'); - iOS.analyticsEvent('samples', 'sample_opened', mt.textContent); + OS.analyticsEvent('samples', 'sample_opened', mt.textContent); var md5 = mt.md5; window.location.href = 'editor.html?pmd5=' + md5 + '&mode=' + ((window.Settings.useStoryStarters) ? 'storyStarter' : 'look'); diff --git a/src/painteditor/Camera.js b/src/painteditor/Camera.js index 2ca17209..0d4dfbd4 100644 --- a/src/painteditor/Camera.js +++ b/src/painteditor/Camera.js @@ -1,5 +1,5 @@ import ScratchJr from '../editor/ScratchJr'; -import iOS from '../iPad/iOS'; +import OS from '../tablet/OS'; import ScratchAudio from '../utils/ScratchAudio'; import Paint from './Paint'; import PaintUndo from './PaintUndo'; @@ -53,7 +53,7 @@ export default class Camera { data.mw = Paint.workspaceWidth; data.mh = Paint.workspaceHeight; data.image = mask.toDataURL('image/png'); - iOS.startfeed(data, iOS.trace); + OS.startfeed(data, OS.trace); Paint.cameraToolsOn(); } @@ -80,7 +80,7 @@ export default class Camera { case 'cameraflip': ScratchAudio.sndFX('tap.wav'); view = (view == 'front') ? 'back' : 'front'; - iOS.choosecamera(view, Camera.flip); + OS.choosecamera(view, Camera.flip); break; case 'camerasnap': Camera.snapShot(); @@ -101,7 +101,7 @@ export default class Camera { target = undefined; view = 'front'; Camera.active = false; - iOS.stopfeed(); + OS.stopfeed(); Paint.cameraToolsOff(); if (isAndroid) { ScratchJr.onBackButtonCallback.pop(); @@ -109,7 +109,7 @@ export default class Camera { } static snapShot () { - iOS.captureimage('Camera.processimage'); // javascript call back; + OS.captureimage('Camera.processimage'); // javascript call back; } static getLayerMask (elem) { @@ -197,5 +197,5 @@ export default class Camera { } } -// Exposing the camera for the tablet callback in iOS.snapShot +// Exposing the camera for the tablet callback in OS.snapShot window.Camera = Camera; diff --git a/src/painteditor/Paint.js b/src/painteditor/Paint.js index 7140b99b..407bf136 100644 --- a/src/painteditor/Paint.js +++ b/src/painteditor/Paint.js @@ -3,9 +3,9 @@ import BlockSpecs from '../editor/blocks/BlockSpecs'; import SVGTools from './SVGTools'; import SVG2Canvas from '../utils/SVG2Canvas'; import Ghost from './Ghost'; -import iOS from '../iPad/iOS'; -import IO from '../iPad/IO'; -import MediaLib from '../iPad/MediaLib'; +import OS from '../tablet/OS'; +import IO from '../tablet/IO'; +import MediaLib from '../tablet/MediaLib'; import Localization from '../utils/Localization'; import Alert from '../editor/ui/Alert'; import PaintAction from './PaintAction'; @@ -164,8 +164,12 @@ export default class Paint { let action = ''; let label = ''; // Analytics: - // md3: name of the asset, an md5 hash for user generated, filename for library items - // sname: is not set for a new character (ignored for backgrounds) + // * md3: name of the asset, an md5 hash for user generated, filename for library items + // * sname: is not set for a new character (ignored for backgrounds) + // log two events: + // * paint editor is opened + // * type of edit (edit_background, edit_character, new_character) + OS.analyticsEvent('paint_editor', 'paint_editor_open'); if (bkg) { action = 'edit_background'; label = (md5 in MediaLib.keys) ? md5 : 'user_background'; @@ -173,7 +177,7 @@ export default class Paint { action = sname ? 'edit_character' : 'new_character'; label = (md5 in MediaLib.keys) ? md5 : 'user_character'; } - iOS.analyticsEvent('paint_editor', action, label); + OS.analyticsEvent('paint_editor', action, label); PaintUndo.buffer = []; PaintUndo.index = 0; maxZoom = 5; @@ -352,6 +356,7 @@ export default class Paint { } static close () { + OS.analyticsEvent('paint_editor', 'paint_editor_close'); saving = true; paintFrame.className = 'paintframe disappear'; frame.style.display = 'block'; @@ -769,7 +774,7 @@ export default class Paint { Paint.addSidePalette(rightpal, 'selectortools', ['select', 'rotate']); Paint.addSidePalette(rightpal, 'edittools', ['stamper', 'scissors']); Paint.addSidePalette(rightpal, 'filltools', - (iOS.camera == '1' && Camera.available) ? ['camera', 'paintbucket'] : ['paintbucket']); + (OS.camera == '1' && Camera.available) ? ['camera', 'paintbucket'] : ['paintbucket']); } static addSidePalette (p, id, list) { @@ -1093,7 +1098,7 @@ export default class Paint { Paint.loadChar(md5); } else if (!MediaLib.keys[md5]) { // Load user asset - iOS.getmedia(md5, nextStep); + OS.getmedia(md5, nextStep); } else { // Load library asset Paint.getBkg(MediaLib.path + md5); @@ -1180,7 +1185,7 @@ export default class Paint { Paint.loadChar(md5); } else if (!MediaLib.keys[md5]) { // Load user asset - iOS.getmedia(md5, nextStep); + OS.getmedia(md5, nextStep); } else { // Load library asset Paint.loadChar(MediaLib.path + md5); @@ -1272,14 +1277,14 @@ export default class Paint { static addToBkgLib (fcn) { var dataurl = IO.getThumbnail(svgdata, 480, 360, 120, 90); var pngBase64 = dataurl.split(',')[1]; - iOS.setmedia(pngBase64, 'png', setBkgRecord); + OS.setmedia(pngBase64, 'png', setBkgRecord); function setBkgRecord (pngmd5) { var json = {}; var keylist = ['md5', 'altmd5', 'version', 'width', 'height', 'ext']; var values = '?,?,?,?,?,?'; json.values = [saveMD5, pngmd5, ScratchJr.version, '480', '360', 'svg']; json.stmt = 'insert into userbkgs (' + keylist.toString() + ') values (' + values + ')'; - iOS.stmt(json, fcn); + OS.stmt(json, fcn); } } @@ -1359,14 +1364,14 @@ export default class Paint { var h = box.height.toString(); var dataurl = IO.getThumbnail(svgdata, w, h, 120, 90); var pngBase64 = dataurl.split(',')[1]; - iOS.setmedia(pngBase64, 'png', setCostumeRecord); + OS.setmedia(pngBase64, 'png', setCostumeRecord); function setCostumeRecord (pngmd5) { var json = {}; var keylist = ['scale', 'md5', 'altmd5', 'version', 'width', 'height', 'ext', 'name']; var values = '?,?,?,?,?,?,?,?'; json.values = [scale, saveMD5, pngmd5, ScratchJr.version, w, h, 'svg', cname]; json.stmt = 'insert into usershapes (' + keylist.toString() + ') values (' + values + ')'; - iOS.stmt(json, fcn); + OS.stmt(json, fcn); } } diff --git a/src/tablet/Android.js b/src/tablet/Android.js new file mode 100644 index 00000000..9bb9dd8b --- /dev/null +++ b/src/tablet/Android.js @@ -0,0 +1,281 @@ +////////////////////////////////////////////////// +// Android interface functions +// AndroidInterface will be the class defined for all the native function calls +////////////////////////////////////////////////// + +let mediacounter = 0; + +export default class Android { + // Database functions + static stmt (json, fcn) { + var result = AndroidInterface.database_stmt(JSON.stringify(json)); + if (typeof (fcn) !== 'undefined') { + fcn(result); + } + } + + static query (json, fcn) { + var result = AndroidInterface.database_query(JSON.stringify(json)); + if (typeof (fcn) !== 'undefined') { + fcn(result); + } + } + + // IO functions + + static cleanassets (ft, fcn) { + AndroidInterface.io_cleanassets(ft); fcn(); + } + + static getmedia (file, fcn) { + mediacounter++; + var nextStep = function (file, key, whenDone) { + var result = AndroidInterface.io_getmedialen(file, key); + Android.processdata(key, 0, result, '', whenDone); + }; + nextStep(file, mediacounter, fcn); + } + + static getmediadata (key, offset, len, fcn) { + var result = AndroidInterface.io_getmediadata(key, offset, len); + if (fcn) { + fcn(result); + } + } + + static processdata (key, off, len, oldstr, fcn) { + if (len == 0) { + Android.getmediadone(key); + fcn(oldstr); + return; + } + var newlen = (len < 100000) ? len : 100000; + Android.getmediadata(key, off, newlen, function (str) { + Android.processdata(key, off + newlen, len - newlen, oldstr + str, fcn); + }); + } + + static getsettings (fcn) { + var result = AndroidInterface.io_getsettings(); + if (fcn) { + fcn(result); + } + } + + static getmediadone (file, fcn) { + var result = AndroidInterface.io_getmediadone(file); + if (fcn) { + fcn(result); + } + } + + static setmedia (str, ext, fcn) { + var result = AndroidInterface.io_setmedia(str, ext); + if (fcn) { + fcn(result); + } + } + + static setmedianame (str, name, ext, fcn) { + var result = AndroidInterface.io_setmedianame(str, name, ext); + if (fcn) { + fcn(result); + } + } + + static getmd5 (str, fcn) { + var result = AndroidInterface.io_getmd5(str); + if (fcn) { + fcn(result); + } + } + + static remove (str, fcn) { + var result = AndroidInterface.io_remove(str); + if (fcn) { + fcn(result); + } + } + + static getfile (str, fcn) { + var result = AndroidInterface.io_getfile(str); + if (fcn) { + fcn(result); + } + } + + static setfile (name, str, fcn) { + var result = AndroidInterface.io_setfile(name, btoa(str)); + if (fcn) { + fcn(result); + } + } + + // Sound functions + + static registerSound (dir, name, fcn) { + var result = AndroidInterface.io_registersound(dir, name); + if (fcn) { + fcn(result); + } + } + + static playSound (name, fcn) { + var result = AndroidInterface.io_playsound(name); + if (fcn) { + fcn(result); + } + } + + static stopSound (name, fcn) { + var result = AndroidInterface.io_stopsound(name); + if (fcn) { + fcn(result); + } + } + + // Web Wiew delegate call backs + + static sndrecord (fcn) { + var result = AndroidInterface.recordsound_recordstart(); + if (fcn) { + fcn(result); + } + } + + static recordstop (fcn) { + var result = AndroidInterface.recordsound_recordstop(); + if (fcn) { + fcn(result); + } + } + + static volume (fcn) { + var result = AndroidInterface.recordsound_volume(); + if (fcn) { + fcn(result); + } + } + + static startplay (fcn) { + var result = AndroidInterface.recordsound_startplay(); + if (fcn) { + fcn(result); + } + } + + static stopplay (fcn) { + var result = AndroidInterface.recordsound_stopplay(); + if (fcn) { + fcn(result); + } + } + + static recorddisappear (b, fcn) { + var result = AndroidInterface.recordsound_recordclose(b); + if (fcn) { + fcn(result); + } + } + + // camera functions + + static hascamera () { + return AndroidInterface.scratchjr_cameracheck(); + } + + static startfeed (data, fcn) { + var str = JSON.stringify(data); + var result = AndroidInterface.scratchjr_startfeed(str); + if (fcn) { + fcn(result); + } + } + + static stopfeed (fcn) { + var result = AndroidInterface.scratchjr_stopfeed(); + if (fcn) { + fcn(result); + } + } + + static choosecamera (mode, fcn) { + var result = AndroidInterface.scratchjr_choosecamera(mode); + if (fcn) { + fcn(result); + } + } + + static captureimage (fcn) { + AndroidInterface.scratchjr_captureimage(fcn); + } + + static hidesplash (fcn) { + // just call funct, splash is hidden in native code + if (fcn) { + fcn(); + } + } + + /////////////// + // Sharing + /////////////// + + + // Called on the JS side to trigger native UI for project sharing. + // fileName: name for the file to share + // emailSubject: subject text to use for an email + // emailBody: body HTML to use for an email + // shareType: 0 for Email; 1 for Airdrop + // b64data: base-64 encoded .SJR file to share + + static sendSjrToShareDialog (fileName, emailSubject, emailBody, shareType, b64data) { + AndroidInterface.sendSjrUsingShareDialog(fileName, emailSubject, emailBody, shareType, b64data); + } + + // // Called on the Objective-C side. The argument is a base64-encoded .SJR file, + // // to be unzipped, processed, and stored. + // static loadProjectFromSjr (b64data) { + // try { + // IO.loadProjectFromSjr(b64data); + // } catch (err) { + // var errorMessage = 'Couldn\'t load share -- project data corrupted. ' + err.message; + // Alert.open(gn('frame'), gn('frame'), errorMessage, '#ff0000'); + // console.log(err); // eslint-disable-line no-console + // return 0; + // } + // return 1; + // } + + // Name of the device/iPad to display on the sharing dialog page + // fcn is called with the device name as an arg + static deviceName (fcn) { + fcn(AndroidInterface.deviceName()); + } + + static analyticsEvent (category, action, label) { + AndroidInterface.analyticsEvent(category, action, label); + } + + static setAnalyticsPlacePref (preferredPlace) { + AndroidInterface.setAnalyticsPlacePref(preferredPlace); + } + + static setAnalyticsPref (key, value) { + AndroidInterface.setAnalyticsPref(key, value); + } + + // // Web Wiew delegate call backs + // + // static pageError (desc) { + // console.log('XCODE ERROR:', desc); // eslint-disable-line no-console + // if (window.location.href.indexOf('home.html') > -1) { + // if (Lobby.errorTimer) { + // Lobby.errorLoading(desc); + // } + // } + // } +} + +// // Expose Android methods for ScratchJr tablet sharing callbacks +// window.Android = Android; diff --git a/src/iPad/IO.js b/src/tablet/IO.js similarity index 94% rename from src/iPad/IO.js rename to src/tablet/IO.js index db9727e6..ef767c31 100644 --- a/src/iPad/IO.js +++ b/src/tablet/IO.js @@ -1,4 +1,4 @@ -import iOS from './iOS'; +import OS from './OS'; import MediaLib from './MediaLib'; import JSZip from 'jszip'; import {setCanvasSize, drawThumbnail, gn} from '../utils/lib'; @@ -90,11 +90,8 @@ export default class IO { IO.requestFromServer(md5, gotit); // get url contents return; } - if ((IO.getExtension(md5) == 'png') && iOS.path) { - fcn(iOS.path + md5); // only if it is not in debug mode - } else { - iOS.getmedia(md5, nextStep); - } // get url contents + + OS.getmedia(md5, nextStep); function gotit (str) { var base64 = IO.getImageDataURL(md5, btoa(str)); @@ -107,16 +104,12 @@ export default class IO { } // base64 dataurl } - function nextStep (dataurl) { // iOS 7 requires to read the internal base64 images before returning contents + function nextStep (dataurl) { var str = atob(dataurl); - if ((str.indexOf('xlink:href') < 0) && iOS.path) { - fcn(iOS.path + md5); // does not have embedded images - } else { - var base64 = IO.getImageDataURL(md5, dataurl); - IO.getImagesInSVG(str, function () { - fcn(base64); - }); // base64 dataurl - } + var base64 = IO.getImageDataURL(md5, dataurl); + IO.getImagesInSVG(str, function () { + fcn(base64); + }); } } @@ -210,11 +203,11 @@ export default class IO { var json = {}; json.stmt = 'select * from ' + db + ' where id = ?'; json.values = [md5]; - iOS.query(json, fcn); + OS.query(json, fcn); } static setMedia (data, type, fcn) { - iOS.setmedia(btoa(data), type, fcn); + OS.setmedia(btoa(data), type, fcn); } static query (type, obj, fcn) { @@ -222,14 +215,14 @@ export default class IO { json.stmt = 'select ' + obj.items + ' from ' + type + ' where ' + obj.cond + (obj.order ? ' order by ' + obj.order : ''); json.values = obj.values; - iOS.query(json, fcn); + OS.query(json, fcn); } static deleteobject (type, id, fcn) { var json = {}; json.stmt = 'delete from ' + type + ' where id = ?'; json.values = [id]; - iOS.stmt(json, fcn); + OS.stmt(json, fcn); } //////////////////////// @@ -258,7 +251,7 @@ export default class IO { addValue('thumbnail', JSON.stringify(obj.thumbnail)); } json.stmt = 'insert into ' + database + ' (' + keylist.toString() + ') values (' + values + ')'; - iOS.stmt(json, fcn); + OS.stmt(json, fcn); function addValue (key, str) { keylist.push(key); values += ',?'; @@ -272,7 +265,7 @@ export default class IO { json.values = [obj.version, obj.deleted, obj.name, JSON.stringify(obj.json), JSON.stringify(obj.thumbnail), (new Date()).getTime().toString()]; json.stmt = 'update ' + database + ' set ' + keylist.toString() + ' where id = ' + obj.id; - iOS.stmt(json, fcn); + OS.stmt(json, fcn); } // Since saveProject is changing the modified time of the project, @@ -282,7 +275,7 @@ export default class IO { var keylist = ['isgift = ?']; json.values = [obj.isgift]; json.stmt = 'update ' + database + ' set ' + keylist.toString() + ' where id = ' + obj.id; - iOS.stmt(json, fcn); + OS.stmt(json, fcn); } static getExtension (str) { @@ -407,7 +400,7 @@ export default class IO { }); } else { // User file - iOS.getmedia(md5, addB64ToZip); + OS.getmedia(md5, addB64ToZip); } }; @@ -496,7 +489,7 @@ export default class IO { json.cond = 'deleted = ? AND gallery IS NULL'; json.items = ['name']; json.values = ['NO']; - IO.query(iOS.database, json, function (existingProjects) { + IO.query(OS.database, json, function (existingProjects) { var newNumber = null; existingProjects = JSON.parse(existingProjects); @@ -613,14 +606,14 @@ export default class IO { if (subFolder == 'thumbnails' || subFolder == 'sounds') { // Save these immediately to the filesystem - no additional processing necessary - iOS.setmedianame(b2data, name, ext, function () { + OS.setmedianame(b2data, name, ext, function () { saveActual++; }); } else if (subFolder == 'characters') { // This code is messy - needs a refactor sometime for all the database calls/duplication for bkgs... // Save the character, generate its thumbnail, and add entry to the database - iOS.setmedianame(b2data, name, ext, function () { // Saves the SVG + OS.setmedianame(b2data, name, ext, function () { // Saves the SVG // Parse SVG to determine width/height var svgParser = new DOMParser().parseFromString(data, 'text/xml'); var width = svgParser.getElementsByTagName('svg')[0].width.baseVal.value; @@ -636,7 +629,7 @@ export default class IO { var charName = characterNames[fullName]; - iOS.setmedia(thumbnailPngBase64, 'png', function (thumbnailMD5) { + OS.setmedia(thumbnailPngBase64, 'png', function (thumbnailMD5) { // Sprite thumbnail is saved - save character to the DB // First ensure that this character doesn't already exist in the exact form @@ -660,7 +653,7 @@ export default class IO { json.stmt = 'insert into usershapes (' + keylist.toString() + ') values (' + values + ')'; - iOS.stmt(json, function () { + OS.stmt(json, function () { saveActual++; }); } else { @@ -672,13 +665,13 @@ export default class IO { }); } else if (subFolder == 'backgrounds') { // Same idea as characters, but the dimensions are fixed - iOS.setmedianame(b2data, name, ext, function () { + OS.setmedianame(b2data, name, ext, function () { IO.getImagesInSVG(data, gotSVGImages); function gotSVGImages () { var thumbnailDataURL = IO.getThumbnail(data, 480, 360, 120, 90); var thumbnailPngBase64 = thumbnailDataURL.split(',')[1]; - iOS.setmedia(thumbnailPngBase64, 'png', function (thumbnailMD5) { + OS.setmedia(thumbnailPngBase64, 'png', function (thumbnailMD5) { // First ensure that this bg doesn't already exist in the exact form var json = {}; @@ -696,7 +689,7 @@ export default class IO { json.values = [fullName, thumbnailMD5, 'iOSv01', '480', '360', 'svg']; json.stmt = 'insert into userbkgs (' + keylist.toString() + ') values (' + values + ')'; - iOS.stmt(json, function () { + OS.stmt(json, function () { saveActual++; }); } else { diff --git a/src/iPad/MediaLib.js b/src/tablet/MediaLib.js similarity index 100% rename from src/iPad/MediaLib.js rename to src/tablet/MediaLib.js diff --git a/src/tablet/OS.js b/src/tablet/OS.js new file mode 100644 index 00000000..378a2f4b --- /dev/null +++ b/src/tablet/OS.js @@ -0,0 +1,277 @@ +import {isiOS, isAndroid, gn} from '../utils/lib'; +import IO from './IO'; +import iOS from './iOS'; +import Android from './Android'; +import Lobby from '../lobby/Lobby'; +import Alert from '../editor/ui/Alert'; +import ScratchAudio from '../utils/ScratchAudio'; + +////////////////////////////////////////////////// +// Tablet interface functions +////////////////////////////////////////////////// + +let path; +let camera; +let database = 'projects'; +let tabletInterface = null; + +export default class OS { + // Getters/setters for properties used in other classes + static get path () { + return path; + } + + static set path (newPath) { + path = newPath; + } + + static get camera () { + return camera; + } + + static set camera (newCamera) { + camera = newCamera; + } + + static get database () { + return database; + } + + // Wait for the tablet interface to be injected into the webview + static waitForInterface (fcn) { + // Already loaded the interface + if (tabletInterface != null) { + fcn(); + return; + } + if ((isAndroid && typeof AndroidInterface === 'undefined') || (isiOS && typeof (window.tablet) !== 'object')) { + // interface not loaded - come back in 100ms + setTimeout(function () { + OS.waitForInterface(fcn); + }, 100); + } + + tabletInterface = isiOS ? iOS : Android; + if (fcn) { + fcn(); + } + return; + } + + // Database functions + static stmt (json, fcn) { + tabletInterface.stmt(json, fcn); + } + + static query (json, fcn) { + tabletInterface.query(json, fcn); + } + + // DB helper - shared by both + static setfield (db, id, fieldname, val, fcn) { + var json = {}; + var keylist = [fieldname + ' = ?', 'mtime = ?']; + json.values = [val, (new Date()).getTime().toString()]; + json.stmt = 'update ' + db + ' set ' + keylist.toString() + ' where id = ' + id; + OS.stmt(json, fcn); + } + + // IO functions + + static cleanassets (ft, fcn) { + tabletInterface.cleanassets(ft, fcn); + } + + static getsettings (fcn) { + tabletInterface.getsettings(fcn); + } + + // note the interfaces (iOS and Android) are responsible for deciding how + // to manage getting media (e.g. whether it needs to be done in chunks etc) + static getmedia (file, fcn) { + tabletInterface.getmedia(file, fcn); + } + + static setmedia (str, ext, fcn) { + tabletInterface.setmedia(str, ext, fcn); + } + + static setmedianame (str, name, ext, fcn) { + tabletInterface.setmedianame(str, name, ext, fcn); + } + + static getmd5 (str, fcn) { + tabletInterface.getmd5(str, fcn); + } + + static remove (str, fcn) { + tabletInterface.remove(str, fcn); + } + + static getfile (str, fcn) { + tabletInterface.getfile(str, fcn); + } + + static setfile (name, str, fcn) { + tabletInterface.setfile(name, str, fcn); + } + + // Sound functions + + static registerSound (dir, name, fcn) { + tabletInterface.registerSound(dir, name, fcn); + } + + static playSound (name, fcn) { + tabletInterface.playSound(name, fcn); + } + + static stopSound (name, fcn) { + tabletInterface.stopSound(name, fcn); + } + + // Web Wiew delegate call backs + + static soundDone (name) { + ScratchAudio.soundDone(name); + } + + static sndrecord (fcn) { + tabletInterface.sndrecord(fcn); + } + + static recordstop (fcn) { + tabletInterface.recordstop(fcn); + } + + static volume (fcn) { + tabletInterface.volume(fcn); + } + + static startplay (fcn) { + tabletInterface.startplay(fcn); + } + + static stopplay (fcn) { + tabletInterface.stopplay(fcn); + } + + static recorddisappear (b, fcn) { + tabletInterface.recorddisappear(b, fcn); + } + + // Record state + static askpermission () { + if (isiOS) { + iOS.askpermission(); + } + } + + // camera functions + + static hascamera () { + camera = tabletInterface.hascamera(); + } + + static startfeed (data, fcn) { + tabletInterface.startfeed(data, fcn); + } + + static stopfeed (fcn) { + tabletInterface.stopfeed(fcn); + } + + static choosecamera (mode, fcn) { + tabletInterface.choosecamera(mode, fcn); + } + + static captureimage (fcn) { + tabletInterface.captureimage(fcn); + } + + static hidesplash (fcn) { + if (isiOS) { + iOS.hidesplash(); + } + if (fcn) { + fcn(); + } + } + + static trace (str) { + console.log(str); // eslint-disable-line no-console + } + + static parse (str) { + console.log(JSON.parse(str)); // eslint-disable-line no-console + } + + static tracemedia (str) { + console.log(atob(str)); // eslint-disable-line no-console + } + + ignore () { + } + + /////////////// + // Sharing + /////////////// + + + // Called on the JS side to trigger native UI for project sharing. + // fileName: name for the file to share + // emailSubject: subject text to use for an email + // emailBody: body HTML to use for an email + // shareType: 0 for Email; 1 for Airdrop + // b64data: base-64 encoded .SJR file to share + + static sendSjrToShareDialog (fileName, emailSubject, emailBody, shareType, b64data) { + tabletInterface.sendSjrToShareDialog(fileName, emailSubject, emailBody, shareType, b64data); + } + + // Called on the Objective-C side. The argument is a base64-encoded .SJR file, + // to be unzipped, processed, and stored. + static loadProjectFromSjr (b64data) { + try { + IO.loadProjectFromSjr(b64data); + } catch (err) { + var errorMessage = 'Couldn\'t load share -- project data corrupted. ' + err.message; + Alert.open(gn('frame'), gn('frame'), errorMessage, '#ff0000'); + console.log(err); // eslint-disable-line no-console + return 0; + } + return 1; + } + + // Name of the device/iPad to display on the sharing dialog page + // fcn is called with the device name as an arg + static deviceName (fcn) { + tabletInterface.deviceName(fcn); + } + + static analyticsEvent (category, action, label) { + tabletInterface.analyticsEvent(category, action, label); + } + + static setAnalyticsPlacePref (preferredPlace) { + tabletInterface.setAnalyticsPlacePref(preferredPlace); + } + + static setAnalyticsPref (key, value) { + tabletInterface.setAnalyticsPref(key, value); + } + + // Web Wiew delegate call backs + + static pageError (desc) { + console.log('XCODE ERROR:', desc); // eslint-disable-line no-console + if (window.location.href.indexOf('home.html') > -1) { + if (Lobby.errorTimer) { + Lobby.errorLoading(desc); + } + } + } +} + +// Expose OS methods for ScratchJr tablet sharing callbacks +window.OS = OS; diff --git a/src/tablet/iOS.js b/src/tablet/iOS.js new file mode 100644 index 00000000..28e6b175 --- /dev/null +++ b/src/tablet/iOS.js @@ -0,0 +1,384 @@ +////////////////////////////////////////////////// +// iOS interface functions +// window.tablet is the class where native functions are injected for calling in +// javascript. It will be initialized prior to calling any functions in this class +////////////////////////////////////////////////// + +import OS from './OS'; +import '@babel/polyfill'; + +let mediacounter = 0; +let callbacks = {}; + +export default class iOS { + static getId () { + do { //eslint-disable-line no-constant-condition + var id = 'jr' + ((new Date()).getTime()) + Math.floor(Math.random() * 10000); + if (!callbacks[id]) { + return id; + } + } while (true); + } + + static call (method) { + return new Promise((resolve) => { + var id = iOS.getId(); + callbacks[id] = resolve; + var args = [].slice.call(arguments); + args.shift(); + window.tablet.postMessage({ + id: id, + method: method, + params: args + }); + }); + } + + static resolve (id, res) { + if (!id) { + return; + } + const callbackFn = callbacks[id]; + if (!callbackFn) { + return; + } + if (typeof callbackFn === 'function') { + callbackFn(res); + } + delete callbacks[id]; + } + + // Database functions + static stmt (json, fcn) { + (async () => { + var result = await iOS.call('database_stmt', JSON.stringify(json)); + if (typeof (fcn) !== 'undefined') { + fcn(result); + } + })(); + } + + static query (json, fcn) { + (async () => { + var result = await iOS.call('database_query', JSON.stringify(json)); + if (typeof result == 'object') { + result = JSON.stringify(result); + } + if (typeof (fcn) !== 'undefined') { + fcn(result); + } + })(); + } + + static setfield (db, id, fieldname, val, fcn) { + var json = {}; + var keylist = [fieldname + ' = ?', 'mtime = ?']; + json.values = [val, (new Date()).getTime().toString()]; + json.stmt = 'update ' + db + ' set ' + keylist.toString() + ' where id = ' + id; + iOS.stmt(json, fcn); + } + + // IO functions + + static cleanassets (ft, fcn) { + iOS.call('io_cleanassets', ft); + fcn(); + } + + static getmedia (file, fcn) { + mediacounter++; + var nextStep = function (file, key, whenDone) { + (async () => { + var result = await iOS.call('io_getmedialen', file, key); + iOS.processdata(key, 0, result * 1, '', whenDone); + })(); + }; + nextStep(file, mediacounter, fcn); + } + + static getmediadata (key, offset, len, fcn) { + (async () => { + var result = await iOS.call('io_getmediadata', key, offset, len); + if (fcn) { + fcn(result); + } + })(); + } + + static processdata (key, off, len, oldstr, fcn) { + if (len == 0) { + iOS.getmediadone(key); + fcn(oldstr); + return; + } + var newlen = (len < 100000) ? len : 100000; + iOS.getmediadata(key, off, newlen, function (str) { + iOS.processdata(key, off + newlen, len - newlen, oldstr + str, fcn); + }); + } + + static getsettings (fcn) { + (async () => { + var result = await iOS.call('io_getsettings'); + if (fcn) { + fcn(result); + } + })(); + } + + static getmediadone (file, fcn) { + (async () => { + var result = await iOS.call('io_getmediadone', file); + if (fcn) { + fcn(result); + } + })(); + } + + static setmedia (str, ext, fcn) { + (async () => { + var result = await iOS.call('io_setmedia', str, ext); + if (fcn) { + fcn(result); + } + })(); + } + + static setmedianame (str, name, ext, fcn) { + (async () => { + var result = await iOS.call('io_setmedianame', str, name, ext); + if (fcn) { + fcn(result); + } + })(); + } + + static getmd5 (str, fcn) { + (async () => { + var result = await iOS.call('io_getmd5', str); + if (fcn) { + fcn(result); + } + })(); + } + + static remove (str, fcn) { + (async () => { + var result = await iOS.call('io_remove', str); + if (fcn) { + fcn(result); + } + })(); + } + + static getfile (str, fcn) { + (async () => { + var result = await iOS.call('io_getfile', str); + if (fcn) { + fcn(result); + } + })(); + } + + static setfile (name, str, fcn) { + (async () => { + var result = await iOS.call('io_setfile', name, btoa(str)); + if (fcn) { + fcn(result); + } + })(); + } + + // Sound functions + + static registerSound (dir, name, fcn) { + (async () => { + var result = await iOS.call('io_registersound', dir, name); + if (fcn) { + fcn(result); + } + })(); + } + + static playSound (name, fcn) { + (async () => { + var result = await iOS.call('io_playsound', name); + if (fcn) { + fcn(result); + } + })(); + } + + static stopSound (name, fcn) { + (async () => { + var result = await iOS.call('io_stopsound', name); + if (fcn) { + fcn(result); + } + })(); + } + + // Web Wiew delegate call backs + + static sndrecord (fcn) { + (async () => { + var result = await iOS.call('recordsound_recordstart'); + if (fcn) { + fcn(result); + } + })(); + } + + static recordstop (fcn) { + (async () => { + var result = await iOS.call('recordsound_recordstop'); + if (fcn) { + fcn(result); + } + })(); + } + + static volume (fcn) { + (async () => { + var result = await iOS.call('recordsound_volume'); + if (fcn) { + fcn(result); + } + })(); + } + + static startplay (fcn) { + (async () => { + var result = await iOS.call('recordsound_startplay'); + if (fcn) { + fcn(result); + } + })(); + } + + static stopplay (fcn) { + (async () => { + var result = await iOS.call('recordsound_stopplay'); + if (fcn) { + fcn(result); + } + })(); + } + + static recorddisappear (b, fcn) { + (async () => { + var result = iOS.call('recordsound_recordclose', b); + if (fcn) { + fcn(result); + } + })(); + } + + // Record state + static askpermission () { + iOS.call('askForPermission'); + } + + // camera functions + + static hascamera () { + (async () => { + OS.camera = await iOS.call('scratchjr_cameracheck'); + })(); + } + + static startfeed (data, fcn) { + (async () => { + var str = JSON.stringify(data); + var result = await iOS.call('scratchjr_startfeed', str); + if (fcn) { + fcn(result); + } + })(); + } + + static stopfeed (fcn) { + (async () => { + var result = await iOS.call('scratchjr_stopfeed'); + if (fcn) { + fcn(result); + } + })(); + } + + static choosecamera (mode, fcn) { + (async () => { + var result = await iOS.call('scratchjr_choosecamera', mode); + if (fcn) { + fcn(result); + } + })(); + } + + static captureimage (fcn) { + iOS.call('scratchjr_captureimage', fcn); + } + + static hidesplash (fcn) { + (async () => { + iOS.call('hideSplash'); + if (fcn) { + fcn(); + } + })(); + } + + static trace (str) { + console.log(str); // eslint-disable-line no-console + } + + static parse (str) { + console.log(JSON.parse(str)); // eslint-disable-line no-console + } + + static tracemedia (str) { + console.log(atob(str)); // eslint-disable-line no-console + } + + ignore () { + } + + /////////////// + // Sharing + /////////////// + + + // Called on the JS side to trigger native UI for project sharing. + // fileName: name for the file to share + // emailSubject: subject text to use for an email + // emailBody: body HTML to use for an email + // shareType: 0 for Email; 1 for Airdrop + // b64data: base-64 encoded .SJR file to share + + static sendSjrToShareDialog (fileName, emailSubject, emailBody, shareType, b64data) { + iOS.call('sendSjrUsingShareDialog', fileName, emailSubject, emailBody, shareType, b64data); + } + + // Name of the device/iPad to display on the sharing dialog page + // fcn is called with the device name as an arg + static deviceName (fcn) { + (async () => { + fcn(await iOS.call('deviceName')); + })(); + } + + static analyticsEvent (category, action, label) { + iOS.call('analyticsEvent', category, action, label); + } + + static setAnalyticsPlacePref (preferredPlace) { + iOS.call('setAnalyticsPlacePref', preferredPlace); + } + + static setAnalyticsPref (key, value) { + iOS.call('setAnalyticsPref', key, value); + } +} + +// Expose iOS methods for ScratchJr tablet sharing callbacks +window.iOS = iOS; diff --git a/src/utils/AppUsage.js b/src/utils/AppUsage.js deleted file mode 100644 index 441e284a..00000000 --- a/src/utils/AppUsage.js +++ /dev/null @@ -1,37 +0,0 @@ -import Cookie from './Cookie'; - -let currentUsage; - -export default class AppUsage { - static get currentUsage () { - return currentUsage; - } - - /** - * Initialize currentUsage for attaching to Analytics events from - * the usage cookie if it is set. currentUsage is blank if the cookie is - * not set. - */ - static initUsage () { - const usageCookie = Cookie.get('usage'); - currentUsage = (usageCookie) ? usageCookie : ''; - } - - /** - * Check whether the App should ask for the usage data (first time launched) - * @return {boolean} True if the usage cookie has never been set - */ - static askForUsage () { - var usageCookie = Cookie.get('usage'); - return usageCookie === null; - } - - /** - * Set the usage cookie for tracking Analytics Events - * @param {string} kind answer from user to the usage survey (home, school, other, noanswer) - */ - static setUsage (kind) { - currentUsage = (kind === '') ? 'noanswer' : kind; - Cookie.set('usage', currentUsage); - } -} diff --git a/src/utils/InitialOptions.js b/src/utils/InitialOptions.js new file mode 100644 index 00000000..7ced8dbf --- /dev/null +++ b/src/utils/InitialOptions.js @@ -0,0 +1,171 @@ +import Cookie from './Cookie'; + +let settingsSection = null; // reference to settings.json's "initialOptions" section +let currentVals = {}; // locally cached copy of the same key-value settings in cookie +// tracks keys for options that have been set during the current session +// (useful for questions we want to ask every time the app starts up) +let answeredThisSession = {}; + +export default class InitialOptions { + + // **************************************** + // functions only used from within InitialOptions + // **************************************** + + /** + * Checks if a cookie is set for a given question + * @param {string} key indicates which options question to use + */ + static hasCookieSet (key) { + var usageCookie = Cookie.get(key); + return usageCookie !== null; + } + + /** + * Checks if a given question has been answered. If the question needs to be + * asked every time the app starts, check that it has been asked this session. + * @param {object} question options question object from settings + */ + static isAnswered (question) { + if (!question) return false; + if (InitialOptions.hasCookieSet(question.key)) { + // if the cookie is set, check if the question needs to be asked + // every time (and hasn't been asked yet) + if (question.everyTime && !answeredThisSession[question.key]) { + return false; + } + return true; + } + return false; + } + + /** + * Initialize currentVals for attaching to Analytics events from + * the usage cookie if it is set. currentVals is blank if the cookie is + * not set. + * @param {string} key indicates which options question to use + */ + static initKeyFromCookie (key) { + const usageCookie = Cookie.get(key); + currentVals[key] = (usageCookie) ? usageCookie : ''; + } + + /** + * Get value for a given question and a given field for that question + * @param {string} questionKey indicates which options question to use + * @param {string} fieldKey indicates which field of that question to use + */ + static valForKeyAndField (questionKey, fieldKey) { + if (!settingsSection || !settingsSection.length) return null; + var question = settingsSection.find(function (question) { + return (question.key === questionKey); + }); + if (!question || !question[fieldKey]) return null; + return question[fieldKey]; + } + + // **************************************** + // functions called from outside InitialOptions + // **************************************** + + /** + * Process settings object from settings.json, and initialize values + * using cookie values + * @param {object} settingsSectionParam JSON-derived object with entire + * initialOptions section from settings + */ + static initWithSettings (settingsSectionParam) { + settingsSection = settingsSectionParam; + if (!settingsSection) return; + settingsSection.forEach(function (question) { + // question is like {key: OPTION_NAME, options: [...]} + InitialOptions.initKeyFromCookie(question.key); + }); + } + + /** + * Get instruction for given question + * @param {string} key indicates which options question to use + */ + static instructionForKey (key) { + return InitialOptions.valForKeyAndField(key, 'instruction'); + } + + /** + * Get question type for given question + * @param {string} key indicates which options question to use + */ + static optionTypeForKey (key) { + var type = InitialOptions.valForKeyAndField(key, 'type'); + if (!type) { + type = 'text'; // default + } + return type; + } + + /** + * Get array of posible value choices for given question. + * If question depends on a previous response, use that response to + * determine which value choices to show. + * @param {string} key indicates which options question to use + */ + static optionsForKey (key) { + if (!settingsSection || !settingsSection.length) return null; + var question = settingsSection.find(function (question) { + return (question.key === key); + }); + if (!question || !question.values) return null; + var valuesKey = 'default'; + if (question.dependsOn) { + var prevSelection = currentVals[question.dependsOn]; + if (question.values[prevSelection]) valuesKey = prevSelection; + } + if (!question.values[valuesKey] || !question.values[valuesKey].length) return null; + return question.values[valuesKey]; + } + + /** + * Checks if all of the questions have options set. If any question doesn't + * have a cookie value set, or if it needs to be asked every time the app + * starts and hasn't yet, return false. + */ + static allQuestionsAnswered () { + if (!settingsSection || !settingsSection.length) return true; + settingsSection.forEach(function (question) { + if (!InitialOptions.isAnswered(question)) { + return false; + } + }); + return true; + } + + /** + * Gets next question that needs to be asked + */ + static nextUnansweredQuestion () { + if (!settingsSection || !settingsSection.length) return null; + var nextUnansweredQuestion = settingsSection.find(function (question) { + return !InitialOptions.isAnswered(question); + }); + if (nextUnansweredQuestion) return nextUnansweredQuestion.key; + return null; + } + + /** + * Returns the object of current values + */ + static getCurrentVals () { + return currentVals; + } + + /** + * Set an options value in both cookie, and local object. + * @param {string} key indicates which options question this value is for + * @param {string} value option chosen by user + */ + static setValue (key, value) { + currentVals[key] = value; + Cookie.set(key, currentVals[key]); + answeredThisSession[key] = true; + } +} diff --git a/src/utils/Localization.js b/src/utils/Localization.js index c009a22b..6e95b813 100644 --- a/src/utils/Localization.js +++ b/src/utils/Localization.js @@ -1,6 +1,6 @@ import Cookie from './Cookie'; import Intl from 'intl'; -import IO from '../iPad/IO'; +import IO from '../tablet/IO'; if (!window.Intl) { window.Intl = Intl; @@ -112,6 +112,18 @@ export default class Localization { return 'String missing: ' + key; } + // Translate a particular message given the message key and info; + // if key not found, assume it's just a raw text string without a translation, + // and return that + static localizeOptional (keyOrRawText, formatting) { + var message; + if (keyOrRawText in localizationMessages) { + message = new window.IntlMessageFormat(localizationMessages[keyOrRawText], currentLocale); + return message.format(formatting); + } + return keyOrRawText; + } + // For sample projects, some fields (sprite names, text on stage, and text in say blocks) // may have a special prefix to indicate that it should be replaced with a localized value. // E.g., we might have some text on the stage that says "Touch me" in English. This gets translated. diff --git a/src/utils/ScratchAudio.js b/src/utils/ScratchAudio.js index 7add3067..1330654f 100755 --- a/src/utils/ScratchAudio.js +++ b/src/utils/ScratchAudio.js @@ -1,6 +1,6 @@ import {isAndroid} from './lib'; import Sound from './Sound'; -import iOS from '../iPad/iOS'; +import OS from '../tablet/OS'; //////////////////////////////////////////////////// /// Sound Playing @@ -64,7 +64,7 @@ export default class ScratchAudio { fcn(name); } }; - iOS.registerSound(url, snd, whenDone); + OS.registerSound(url, snd, whenDone); } else { // In Android, this is handled outside of JavaScript, so just place a stub here. dict[snd] = new Sound(url + snd); diff --git a/src/utils/Sound.js b/src/utils/Sound.js index 1d7aba97..66ede8fe 100644 --- a/src/utils/Sound.js +++ b/src/utils/Sound.js @@ -1,5 +1,5 @@ import {isAndroid} from './lib'; -import iOS from '../iPad/iOS'; +import OS from '../tablet/OS'; export default class Sound { constructor (name, time) { @@ -23,7 +23,7 @@ export default class Sound { if (this.playing) { this.stop(); } - iOS.playSound(this.name); + OS.playSound(this.name); this.playing = true; } } @@ -51,7 +51,7 @@ export default class Sound { } this.soundPlayId = null; } else { - iOS.stopSound(this.name); + OS.stopSound(this.name); this.playing = false; } } diff --git a/src/utils/lib.js b/src/utils/lib.js index 99d56731..8df530aa 100755 --- a/src/utils/lib.js +++ b/src/utils/lib.js @@ -8,6 +8,7 @@ export const WINDOW_INNER_WIDTH = window.innerWidth; export const scaleMultiplier = WINDOW_INNER_HEIGHT / 768.0; export const fullscreenScaleMultiplier = 136; +console.log('setting OS flags'); export const isiOS = (typeof AndroidInterface == 'undefined'); export const isAndroid = (typeof AndroidInterface != 'undefined'); diff --git a/webpack.config.js b/webpack.config.js index ec9e14eb..6546b66c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -27,7 +27,7 @@ module.exports = { exclude: /node_modules/, test: /\.jsx?$/, query: { - presets: ['es2015'] + presets: ['es2015', 'stage-3'] } } ]