Skip to content

Commit

Permalink
Use package.json to install node modules; upgrade node module version…
Browse files Browse the repository at this point in the history
…s. (#6659)

* Use package.json to install node modules; upgrade node module versions.

* Upgrade to 12.1.2 for webdriver-manager and fix gulp watcher.

* Add audit command.

* Fix invocation of build script.

* Fix wrong arg parsed to build script.

* Add uglify-js dependency.

* Update package.json dependencies.

* Omit node_modules from being picked up by the backend tests script.

* Add logging info

* Fix path errors.

* Add karma dependency.

* Remove need for jasmine-jquery.

* Fix configuration issues.

* Exclude node_modules from linter.

* Try running a test in non-prod mode.

* Try to debug e2e tests

* Fix lint errors and disable angular/di for test files.

* Fix e2e test script

* Revert some lint changes.

* Fix html lint issues.

* Run Travis tests in prod env.

* Remove unnecessary comment.

* Address review comment.

* Update package.json

* Temporarily disable linter.

* Re-enable the linter.

* Fix path errors.

* Use angular.mock.inject.

* Update node version.
  • Loading branch information
seanlip committed Apr 30, 2019
1 parent 96acf46 commit ba1b79a
Show file tree
Hide file tree
Showing 66 changed files with 9,659 additions and 267 deletions.
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
- save_cache:
key: setup-files-cache-{{ checksum "date" }}
paths:
- ../node_modules/
- node_modules/
- ../oppia_tools/

lint_tests:
Expand Down
10 changes: 9 additions & 1 deletion .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,19 @@
"angular",
"html"
],
"overrides": [{
// We exclude test files from dependency injection format checks because
// they are never minified.
"files": ["*Spec.js", "*Spec.ts"],
"rules": {
"angular/di": "off"
}
}],
"rules": {
"angular/di": [
"error",
"array",
],
],
"angular/di-order": "error",
"angular/di-unused": "error",
"angular/directive-restrict": [
Expand Down
2 changes: 1 addition & 1 deletion .github/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Oppia is written using Python and AngularJS, and is built on top of Google App E
* [File an issue](https://github.com/oppia/oppia/issues/new/choose)

<p align="center">
<a href="http://www.youtube.com/watch?v=Ntcw0H0hwPU" target="_blank">
<a href="http://www.youtube.com/watch?v=Ntcw0H0hwPU" target="_blank" rel="noopener">
<img src="https://cloud.githubusercontent.com/assets/8845039/16814722/b219cac0-4954-11e6-9573-c37557d1b410.png">
</a>
</p>
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ backend_prod_files/*
local_compiled_js/*
core/templates/prod/*
core/tests/.browserstack.env
node_modules/*
.coverage*
.viminfo
.vscode/*
Expand Down
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ script:
# - if [ "$RUN_BACKEND_TESTS" == 'true' ] && [ "$REPORT_BACKEND_COVERAGE" == 'false' ] && [ "$EXCLUDE_LOAD_TESTS" == 'true' ]; then bash scripts/run_backend_tests.sh --exclude_load_tests; fi
# - if [ "$RUN_BACKEND_TESTS" == 'true' ] && [ "$REPORT_BACKEND_COVERAGE" == 'true' ] && [ "$EXCLUDE_LOAD_TESTS" == 'false' ]; then bash scripts/run_backend_tests.sh --generate_coverage_report; fi
# - if [ "$RUN_BACKEND_TESTS" == 'true' ] && [ "$REPORT_BACKEND_COVERAGE" == 'false' ] && [ "$EXCLUDE_LOAD_TESTS" == 'false' ]; then bash scripts/run_backend_tests.sh; fi
# Run e2e tests in production mode.
# Run the e2e tests in the production environment (using --prod_env).
- if [ "$RUN_E2E_TESTS_ACCESSIBILITY" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="accessibility" --prod_env; fi
- if [ "$RUN_E2E_TESTS_ADDITIONAL_EDITOR_AND_PLAYER_FEATURES" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="additionalEditorAndPlayerFeatures" --prod_env; fi
- if [ "$RUN_E2E_TESTS_COLLECTIONS" == 'true' ]; then travis_retry bash scripts/run_e2e_tests.sh --suite="collections" --prod_env; fi
Expand Down Expand Up @@ -151,8 +151,8 @@ script:
cache:
# Cache Oppia's dependencies.
directories:
- ../node_modules/
- ../oppia_tools/
- node_modules/
- third_party/
- $HOME/.cache/pip
- $HOME/.cache/TravisChrome/
Expand Down
1 change: 1 addition & 0 deletions app.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ skip_files:
- scripts/
- integrations/
- integrations_dev/
- node_modules/
# Some third_party static scripts are directly imported, namely: jquery,
# jqueryui, angularjs, jqueryui-touch-punch, MathJax, code-mirror,
# ui-codemirror, d3js, midi-js, ui-map, guppy, skulpt, math-expressions.
Expand Down
8 changes: 4 additions & 4 deletions core/templates/dev/head/App.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,11 @@ oppia.constant('LOGOUT_URL', '/logout');
oppia.constant('ENABLE_PROMO_BAR', true);

oppia.config([
'$compileProvider', '$httpProvider', '$interpolateProvider',
'$locationProvider', '$cookiesProvider',
'$compileProvider', '$cookiesProvider', '$httpProvider',
'$interpolateProvider', '$locationProvider',
function(
$compileProvider, $httpProvider, $interpolateProvider,
$locationProvider, $cookiesProvider) {
$compileProvider, $cookiesProvider, $httpProvider,
$interpolateProvider, $locationProvider) {
// This improves performance by disabling debug data. For more details,
// see https://code.angularjs.org/1.5.5/docs/guide/production
$compileProvider.debugInfoEnabled(false);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<div class="oppia-cc-icon oppia-transition-200" ng-if="!isMobileDevice && !iframed">
<div style="height: 3px; width: 3px;" class="protractor-test-neutral-element"></div>

<a class="oppia-attribution-image-link" rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank">
<a class="oppia-attribution-image-link" rel="noopener" href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank">
<img alt="Creative Commons License" style="border-width: 0; height: 24px;" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png">
</a><br>
<a class="oppia-attribution-link" href="/about#foundation" target="_blank" style="font-size: 10px;">Attribution Guide</a>
<a class="oppia-attribution-link" href="/about#foundation" rel="noopener" target="_blank" style="font-size: 10px;">Attribution Guide</a>
</div>
<style>
.oppia-cc-icon a.oppia-attribution-image-link,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ <h3>Embed this exploration</h3>
<div class="oppia-embed-modal-code" ng-click="selectText($event)">&lt;iframe src="<[serverName]>/embed/exploration/<[explorationId]>" width="700" height="1000"&gt;</div>

<p>
For more details, as well as instructions on how to embed a particular version of an exploration, please see the <a href="https://oppia.github.io/#/EmbeddingAnExploration" target="_blank">documentation</a>.
For more details, as well as instructions on how to embed a particular version of an exploration, please see the <a href="https://oppia.github.io/#/EmbeddingAnExploration" target="_blank" rel="noopener">documentation</a>.
</p>
</div>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
</form>
<div class="license-warning">
Please only upload audio files that you created yourself and that you are willing to license under the site's
<a href="/about#license" target="_blank">license terms</a>.
<a href="/about#license" target="_blank" rel="noopener">license terms</a>.
Audio translation files should be less than <b>five minutes</b> long.
</div>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
</span>
<span class="image-uploader-license-warning">
Before uploading images, please ensure that they are<br>
compatible with the <a href="/about#license" target="_blank">license terms</a> of the site.<br>
compatible with the <a href="/about#license" target="_blank" rel="noopener">license terms</a> of the site.<br>
Please do not upload watermarked images.
</span>
<label for="image-file-input" translate="I18N_DIRECTIVES_UPLOAD_A_FILE" class="image-uploader-upload-label-button"></label>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@
</li>

<li>
<a href="https://medium.com/oppia-org" target="_blank">
<a href="https://medium.com/oppia-org" target="_blank" rel="noopener">
<img ng-src="<[getStaticImageUrl('/sidebar/blogger.png')]>" class="oppia-sidebar-menu-icon" alt="Oppia Blog">
<span translate="I18N_SIDEBAR_BLOG"></span>
</a>
Expand All @@ -138,7 +138,7 @@
</li>

<li>
<a href="http://oppiafoundation.org/" target="_blank">
<a href="http://oppiafoundation.org/" target="_blank" rel="noopener">
<img ng-src="<[getStaticImageUrl('/sidebar/oppia-foundation-logo.png')]>" class="oppia-sidebar-menu-icon" alt="Oppia Foundation">
<span translate="I18N_SIDEBAR_OPPIA_FOUNDATION"></span>
</a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@ <h4>

<div class="oppia-footer-social-icons">
<div class="oppia-youtube-follow">
<a href="https://www.youtube.com/channel/UC5c1G7BNDCfv1rczcBp9FPw" target="_blank">
<a href="https://www.youtube.com/channel/UC5c1G7BNDCfv1rczcBp9FPw" target="_blank" rel="noopener">
<i class="oppia-follow-icons fa fa-youtube-play"></i>
<span class="oppia-icon-accessibility-label">Youtube</span>
</a>
</div>

<div class="oppia-facebook-follow">
<a href="https://www.facebook.com/oppiaorg" target="_blank">
<a href="https://www.facebook.com/oppiaorg" target="_blank" rel="noopener">
<i class="oppia-follow-icons fa fa-facebook"></i>
<span class="oppia-icon-accessibility-label">Facebook</span>
</a>
</div>

<div class="oppia-twitter-follow">
<a href="https://twitter.com/oppiaorg" target="_blank">
<a href="https://twitter.com/oppiaorg" target="_blank" rel="noopener">
<i class="oppia-follow-icons fa fa-twitter"></i>
<span class="oppia-icon-accessibility-label">Twitter</span>
</a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@
<li><a ng-keydown="onMenuKeypress($event, 'aboutMenu', {shiftTab: ACTION_CLOSE})" class="oppia-navbar-tab-content protractor-test-about-link" href="/about" translate="I18N_TOPNAV_ABOUT_OPPIA"></a></li>
<li><a class="oppia-navbar-tab-content protractor-test-get-started-link " href="/get_started" translate="I18N_TOPNAV_GET_STARTED"></a></li>
<li><a class="oppia-navbar-tab-content protractor-test-playbook-link " href="/teach#playbook" translate="I18N_TOPNAV_PARTICIPATION_PLAYBOOK"></a></li>
<li><a class="oppia-navbar-tab-content" href="https://medium.com/oppia-org" target="_blank" translate="I18N_TOPNAV_BLOG">Blog</a></li>
<li><a class="oppia-navbar-tab-content" href="http://oppiafoundation.org" target="_blank" translate="I18N_TOPNAV_OPPIA_FOUNDATION"></a></li>
<li><a ng-keydown="onMenuKeypress($event, 'aboutMenu', {tab: ACTION_CLOSE})" class="oppia-navbar-tab-content" href="https://oppiafoundation.org/volunteer" target="_blank" translate="I18N_TOPNAV_GET_INVOLVED"></a></li>
<li><a class="oppia-navbar-tab-content" href="https://medium.com/oppia-org" target="_blank" rel="noopener" translate="I18N_TOPNAV_BLOG">Blog</a></li>
<li><a class="oppia-navbar-tab-content" href="http://oppiafoundation.org" target="_blank" rel="noopener" translate="I18N_TOPNAV_OPPIA_FOUNDATION"></a></li>
<li><a ng-keydown="onMenuKeypress($event, 'aboutMenu', {tab: ACTION_CLOSE})" class="oppia-navbar-tab-content" href="https://oppiafoundation.org/volunteer" target="_blank" rel="noopener" translate="I18N_TOPNAV_GET_INVOLVED"></a></li>
</ul>
</li>
<li ng-mouseover="blurNavigationLinks($event)" ng-show="navElementsVisibilityStatus.I18N_TOPNAV_DONATE">
Expand Down Expand Up @@ -145,12 +145,12 @@
</a>
</li>
<li ng-if="isModerator">
<a ng-click="closeSubmenuIfNotMobile($event)" href="/moderator" target="_blank">
<a ng-click="closeSubmenuIfNotMobile($event)" href="/moderator" target="_blank" rel="noopener">
<span translate="I18N_TOPNAV_MODERATOR_PAGE"></span>
</a>
</li>
<li ng-if="isSuperAdmin">
<a class="protractor-test-admin-link" ng-click="closeSubmenuIfNotMobile($event)" href="/admin" target="_blank">
<a class="protractor-test-admin-link" ng-click="closeSubmenuIfNotMobile($event)" href="/admin" target="_blank" rel="noopener">
<span translate="I18N_TOPNAV_ADMIN_PAGE"></span>
</a>
</li>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,18 @@
describe('States object factory', function() {
beforeEach(angular.mock.module('oppia'));

var oldValueForNewStateTemplate = null;

describe('StatesObjectFactory', function() {
var scope, sof, ssof, statesDict, statesWithAudioDict, atof;

beforeEach(angular.mock.inject(function($injector) {
ssof = $injector.get('StatesObjectFactory');
sof = $injector.get('StateObjectFactory');
atof = $injector.get('AudioTranslationObjectFactory');

oldValueForNewStateTemplate = constants.NEW_STATE_TEMPLATE;

constants.NEW_STATE_TEMPLATE = {
classifier_model_id: null,
content: {
Expand Down Expand Up @@ -294,6 +299,10 @@ describe('States object factory', function() {
};
}));

afterEach(inject(function() {
constants.NEW_STATE_TEMPLATE = oldValueForNewStateTemplate;
}));

it('should create a new state given a state name', function() {
var newStates = ssof.createFromBackendDict(statesDict);
newStates.addState('new state');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,22 @@

describe('Learner dashboard activity ids object factory', function() {
var LearnerDashboardActivityIdsObjectFactory = null;
var learnerDashboardActivityIdsDict = null;

beforeEach(angular.mock.module('oppia'));

beforeEach(angular.mock.inject(function($injector) {
LearnerDashboardActivityIdsObjectFactory = $injector.get(
'LearnerDashboardActivityIdsObjectFactory');
learnerDashboardActivityIdsDict = {
incomplete_exploration_ids: ['0', '1'],
incomplete_collection_ids: ['2', '3'],
completed_exploration_ids: ['4', '5'],
completed_collection_ids: ['6', '7'],
exploration_playlist_ids: ['8', '9'],
collection_playlist_ids: ['10', '11']
};
}));

var learnerDashboardActivityIdsDict = {
incomplete_exploration_ids: ['0', '1'],
incomplete_collection_ids: ['2', '3'],
completed_exploration_ids: ['4', '5'],
completed_collection_ids: ['6', '7'],
exploration_playlist_ids: ['8', '9'],
collection_playlist_ids: ['10', '11']
};

it('should check if activity id is present among learner dashboard ' +
' activity ids', function() {
var learnerDashboardActivityIds = (
Expand Down Expand Up @@ -86,11 +85,10 @@ describe('Learner dashboard activity ids object factory', function() {

learnerDashboardActivityIds.removeFromExplorationLearnerPlaylist('9');
expect(learnerDashboardActivityIds.explorationPlaylistIds).toEqual(
['8', '12', '13']);
['8']);

learnerDashboardActivityIds.removeFromExplorationLearnerPlaylist('8');
expect(learnerDashboardActivityIds.explorationPlaylistIds).toEqual(
['12', '13']);
expect(learnerDashboardActivityIds.explorationPlaylistIds).toEqual([]);
});

it('should remove collection from learner playlist', function() {
Expand All @@ -100,11 +98,10 @@ describe('Learner dashboard activity ids object factory', function() {

learnerDashboardActivityIds.removeFromCollectionLearnerPlaylist('11');
expect(learnerDashboardActivityIds.collectionPlaylistIds).toEqual(
['10', '12', '13']);
['10']);

learnerDashboardActivityIds.removeFromCollectionLearnerPlaylist('10');
expect(learnerDashboardActivityIds.collectionPlaylistIds).toEqual(
['12', '13']);
expect(learnerDashboardActivityIds.collectionPlaylistIds).toEqual([]);
});

it('should fetch the learner dashboard activity ids domain object from the ' +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ describe('Question Player backend Api service', function() {
beforeEach(
angular.mock.module('oppia', GLOBALS.TRANSLATOR_PROVIDER_FOR_TESTS));

beforeEach(inject(function($injector) {
beforeEach(angular.mock.inject(function($injector) {
QuestionPlayerBackendApiService = $injector.get(
'QuestionPlayerBackendApiService');
$httpBackend = $injector.get('$httpBackend');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ describe('PlaythroughImprovementCardObjectFactory', function() {
});

describe('Discard Action Button', function() {
beforeEach(inject(function($injector) {
beforeEach(angular.mock.inject(function($injector) {
this.$uibModal = $injector.get('$uibModal');
}));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
<a ng-click="onMouseoutProfilePictureOrDropdown($event)"
href="/moderator"
target="_blank"
rel="noopener"
style="color: #00376d">
Moderator Page
</a>
Expand All @@ -98,6 +99,7 @@
<a ng-click="onMouseoutProfilePictureOrDropdown($event)"
href="/admin"
target="_blank"
rel="noopener"
style="color: #00376d">
Admin Page
</a>
Expand Down
2 changes: 1 addition & 1 deletion core/templates/dev/head/pages/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ <h2>
</div>

<a ng-if="siteFeedbackFormUrl" ng-href="<[siteFeedbackFormUrl]>" target="_blank"
class="oppia-site-feedback oppia-transition-200">
rel="noopener" class="oppia-site-feedback oppia-transition-200">
<i class="material-icons md-18">&#xE87F;</i>
<span translate="I18N_SPLASH_SITE_FEEDBACK"></span>
</a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

<!-- Player -->
<li>
<a ng-href="/collection/<[collectionId]>" target="_blank" uib-tooltip="Player (new tab)" tooltip-placement="bottom">
<a ng-href="/collection/<[collectionId]>" target="_blank" rel="noopener" uib-tooltip="Player (new tab)" tooltip-placement="bottom">
<i class="material-icons">&#xE037;</i>
</a>
</li>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<md-card class="collection-editor-node">
<div class="collection-editor-node-title">
<a ng-href="/create/<[getCollectionNode().getExplorationId()]>" target="_blank">
<a ng-href="/create/<[getCollectionNode().getExplorationId()]>" target="_blank" rel="noopener">
<[getCollectionNode().getExplorationTitle()]>
</a>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
</select>
<span class="help-block" style="font-size: smaller">
<em>
Don't see the language you want? <a href="https://github.com/oppia/oppia/issues/new?title=Please%20add%20a%20new%20language%20choice%20to%20the%20exploration%20settings%20tab&body=Please%20add%20the%20language%20choice%20%7B%7BYOUR_LANGUAGE_HERE%7D%7D%20to%20the%20exploration%20settings%20tab.%0A%0AHere%20is%20a%20link%20to%20an%20exploration%20that%20uses%20it:%20%7B%7BINSERT_LINK_HERE%7D%7D" target="_blank">Tell us.</a>
Don't see the language you want? <a href="https://github.com/oppia/oppia/issues/new?title=Please%20add%20a%20new%20language%20choice%20to%20the%20exploration%20settings%20tab&body=Please%20add%20the%20language%20choice%20%7B%7BYOUR_LANGUAGE_HERE%7D%7D%20to%20the%20exploration%20settings%20tab.%0A%0AHere%20is%20a%20link%20to%20an%20exploration%20that%20uses%20it:%20%7B%7BINSERT_LINK_HERE%7D%7D" target="_blank" rel="noopener">Tell us.</a>
</em>
</span>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@
{% block local_top_nav_options %}
<ul class="nav navbar-nav oppia-navbar-nav navbar-right" style="margin-right: 0px;" ng-controller="CollectionLocalNav">
<li ng-if="canEdit">
<a ng-href="/collection_editor/create/{{collection_id}}" uib-tooltip="Edit" tooltip-placement="bottom" target="_blank">
<a ng-href="/collection_editor/create/{{collection_id}}" uib-tooltip="Edit" tooltip-placement="bottom" target="_blank" rel="noopener">
<i class="material-icons">&#xE254;</i>
<span class="oppia-icon-accessibility-label">Edit</span>
</a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,7 @@ <h2 class="activity-title protractor-test-exp-summary-tile-title">
</div>
<md-card class="oppia-subscription-card protractor-test-subscription-card"
ng-repeat="subscriber in subscribersList | orderBy:sortSubscriptionFunction:isCurrentSubscriptionSortDescending">
<a class="oppia-subscription-profile-link" href="/profile/<[subscriber.subscriber_username]>" target="_blank">
<a class="oppia-subscription-profile-link" href="/profile/<[subscriber.subscriber_username]>" target="_blank" rel="noopener">
<img ng-src="<[subscriber.subscriber_picture_data_url]>" class="oppia-subscription-card-profile-picture img-circle">
<span class="oppia-subscription-card-summary">
<div style="margin-bottom: 5px; font-size: 17.5px;">
Expand Down
2 changes: 1 addition & 1 deletion core/templates/dev/head/pages/error/error_iframed.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ <h3>Exploration Not Found</h3>
<br>
<p>
To find similar explorations, visit the
<a href="https://www.oppia.org/library" target="_blank">Oppia.org library</a>.
<a href="https://www.oppia.org/library" target="_blank" rel="noopener">Oppia.org library</a>.
</p>
</md-card>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
<div class="col-lg-12 col-md-12 col-sm-12">
<div class="oppia-align-center uib-alert alert-warning" style="padding: 2px; width: 90%;">
<strong>Note:</strong> This is a private, unpublishable copy of a
<a ng-href="<[getExplorationUrl(ExplorationRightsService.clonedFrom())]>" target="_blank">public exploration</a>.
<a ng-href="<[getExplorationUrl(ExplorationRightsService.clonedFrom())]>" target="_blank" rel="noopener">public exploration</a>.
</div>
</div>
</div>
Expand Down
Loading

0 comments on commit ba1b79a

Please sign in to comment.