Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/karma.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ module.exports = function (config) {
__dirname + '/wwwroot/env/development.js',
__dirname + '/wwwroot/lib/svgxuse/svgxuse.js',
__dirname + '/wwwroot/lib/autofill-directive/autofill-directive.js',
__dirname + '/wwwroot/test-helpers/clerk-mock.js',
__dirname + '/wwwroot/**/*.spec.js'
],

Expand Down
2 changes: 1 addition & 1 deletion src/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,6 @@
"postinstall": "bower --allow-root install && webdriver-manager update",
"start": "gulp",
"build": "gulp build",
"test": "exit 0"
"test": "gulp test"
}
}
31 changes: 26 additions & 5 deletions src/spec/login_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,39 @@ describe('Login page', () => {
// Assert
expect(loginPage.getSwitchLanguageMessage()).toBe(inEnglish);

// Act
// Act - Test English page shows Spanish message
browser.addMockModule('descartableModule', () => angular
.module('descartableModule', ['ngMockE2E'])
.run($httpBackend => {
$httpBackend.whenGET(/\/accounts\/[\w|-]*\/status\/limits/).respond(200, {
"data" : ""
});
}));
loginPage.get('lang=en');
// Assert
expect(loginPage.getSwitchLanguageMessage()).toBe(inSpanish);

// Act
loginPage.clickEsFlag();
// Act - Test switching back to Spanish
browser.addMockModule('descartableModule', () => angular
.module('descartableModule', ['ngMockE2E'])
.run($httpBackend => {
$httpBackend.whenGET(/\/accounts\/[\w|-]*\/status\/limits/).respond(200, {
"data" : ""
});
}));
loginPage.get('lang=es');
// Assert
expect(loginPage.getSwitchLanguageMessage()).toBe(inEnglish);

// Act
loginPage.clickEnFlag();
// Act - Test switching back to English
browser.addMockModule('descartableModule', () => angular
.module('descartableModule', ['ngMockE2E'])
.run($httpBackend => {
$httpBackend.whenGET(/\/accounts\/[\w|-]*\/status\/limits/).respond(200, {
"data" : ""
});
}));
loginPage.get('lang=en');
// Assert
expect(loginPage.getSwitchLanguageMessage()).toBe(inSpanish);

Expand Down
19 changes: 10 additions & 9 deletions src/spec/settings_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -385,22 +385,23 @@ describe('Settings Page', () => {

it('should change the language correctly', () => {
// Arrange
beginAuthenticatedSession();
var profilePage = new ProfilePage();

//Act
browser.get('/#/settings/my-profile?lang=es');
var userTextInSpanish = "LENGUAJE";
var userTextInEnglish = "LANGUAGE";
profilePage.clickChangeLangToEn();

//Assert
beginAuthenticatedSession();
browser.get('/#/settings/my-profile?lang=es');

expect(profilePage.getLanguageLabelMessage()).toBe(userTextInSpanish);

beginAuthenticatedSession();
browser.get('/#/settings/my-profile?lang=en');

expect(profilePage.getLanguageLabelMessage()).toBe(userTextInEnglish);

//Act
profilePage.clickChangeLangToEs();
beginAuthenticatedSession();
browser.get('/#/settings/my-profile?lang=es');

//Assert
expect(profilePage.getLanguageLabelMessage()).toBe(userTextInSpanish);
});

Expand Down
10 changes: 9 additions & 1 deletion src/wwwroot/acceptanceTests/login.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,21 @@ describe('Login', () => {
localStorage.clear();

module('dopplerRelay');

var mockClerkService = window.ClerkTestHelpers.createClerkMock();

module(function($provide) {
$provide.value('clerk', mockClerkService);
});

var context;
inject(function ($controller, $location, $rootScope, auth, $httpBackend) {

var errors = [];
$rootScope.addError = err => errors.push(err);
$rootScope.addAuthorizationError = $rootScope.addError;
$rootScope.loadLimits = () => {};
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

context = {
errors: errors,
Expand Down Expand Up @@ -60,7 +68,7 @@ describe('Login', () => {
$httpBackend.flush();

// Assert
expect($location.path()).toBe('/'); // then it will redirect to `/reports` because of _otherwise_ route, I do not know how to test it
expect($location.path()).toBe('/reports');
expect(auth.isAuthed()).toBe(true);
expect(auth.isTemporarilyAuthed()).toBe(false);
expect(auth.getUserName()).toBe('amoschini@makingsense.com');
Expand Down
53 changes: 38 additions & 15 deletions src/wwwroot/acceptanceTests/routing.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ describe('Routing', () => {
localStorage.clear();

module('dopplerRelay');

var mockClerkService = window.ClerkTestHelpers.createClerkMock();

module(function($provide) {
$provide.value('clerk', mockClerkService);
});

var context;
inject(function ($controller, $location, $rootScope, auth, $httpBackend, jwtHelper) {

Expand Down Expand Up @@ -38,9 +45,10 @@ describe('Routing', () => {

it('should start auth session when temporalToken parameter is set (no previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
expect(auth.isAuthed()).toBe(false);
jwtHelper.isTokenExpired = () => false;
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// Act
$location.path('/reset-password');
Expand All @@ -56,8 +64,9 @@ describe('Routing', () => {

it('should start auth session when temporalToken parameter is set (already previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => false;
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// set a global (localStorage) token
auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ');
Expand All @@ -79,9 +88,10 @@ describe('Routing', () => {

it('should redirect to error when temporal token is not set (no previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
expect(auth.isAuthed()).toBe(false);
jwtHelper.isTokenExpired = () => false;
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// Act
$location.path('/reset-password');
Expand All @@ -95,8 +105,9 @@ describe('Routing', () => {

it('should redirect to error when temporal token is not set (already previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => false;
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// set a global (localStorage) token
auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ');
Expand All @@ -116,9 +127,10 @@ describe('Routing', () => {

it('should redirect to error when temporal token is invalid (no previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => false;
expect(auth.isAuthed()).toBe(false);
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// Act
$location.path('/reset-password');
Expand All @@ -133,8 +145,9 @@ describe('Routing', () => {

it('should redirect to error when temporal token is invalid (already previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => false;
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// set a global (localStorage) token
auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ');
Expand All @@ -155,9 +168,10 @@ describe('Routing', () => {

it('should redirect to error when temporal token is expired (no previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => true;
expect(auth.isAuthed()).toBe(false);
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// Act
$location.path('/reset-password');
Expand All @@ -172,8 +186,10 @@ describe('Routing', () => {

it('should redirect to error when temporal token is expired (already previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => true;
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// set a global (localStorage) token
auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ');
expect(auth.isAuthed()).toBe(true);
Expand All @@ -198,6 +214,7 @@ describe('Routing', () => {
auth.loginByToken('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE0ODQ2MjAxMjEsImV4cCI6MTUyODIwNDk3NywiaWF0IjoxNDg0NjIwMTIxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwidW5pcXVlX25hbWUiOiJhbW9zY2hpbmkrMUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9vbl9wYXNzd29yZF9yZXNldCI6dHJ1ZSwicmVsYXlfdGVtcG9yYWxfdG9rZW4iOnRydWV9.VJJgYPgb7fKcKTvfylCmwh34s934iBoeEYZApOr5kgk', true);
$scope.form = {};
var controller = createController('ResetPasswordCtrl');
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

$httpBackend.expect(
'PUT',
Expand Down Expand Up @@ -226,7 +243,7 @@ describe('Routing', () => {

// Assert
//after this it will redirect to reports
expect($location.path()).toBe('/');
expect($location.path()).toBe('/reports');
expect(auth.isAuthed()).toBe(true);
expect(auth.isTemporarilyAuthed()).toBe(false);
});
Expand All @@ -237,10 +254,11 @@ describe('Routing', () => {

it('should redirect to login when temporalToken parameter is set (no previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => false;
expect(auth.getUserName()).toBe(null);
expect(auth.isAuthed()).toBe(false);
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// Act
$location.path('/reports');
Expand All @@ -255,8 +273,9 @@ describe('Routing', () => {

it('should redirect to login when temporalToken parameter is set (already previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => false;
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// set a real stored token
auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ');
Expand All @@ -277,10 +296,11 @@ describe('Routing', () => {

it('should redirect to error when temporalToken parameter is invalid (no previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => false;
expect(auth.getUserName()).toBe(null);
expect(auth.isAuthed()).toBe(false);
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// Act
$location.path('/reports');
Expand All @@ -295,8 +315,9 @@ describe('Routing', () => {

it('should redirect to error when temporalToken parameter is invalid (already previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => false;
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// set a real stored token
auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ');
Expand All @@ -317,10 +338,11 @@ describe('Routing', () => {

it('should redirect to error when temporalToken parameter is expired (no previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => true;
expect(auth.getUserName()).toBe(null);
expect(auth.isAuthed()).toBe(false);
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// Act
$location.path('/reports');
Expand All @@ -335,8 +357,9 @@ describe('Routing', () => {

it('should redirect to error when temporalToken parameter is expired (already previous authenticated session)', () => {
// Arrange
var { $location, $scope, auth, jwtHelper } = createContext();
var { $location, $scope, auth, jwtHelper, $httpBackend } = createContext();
jwtHelper.isTokenExpired = () => true;
$httpBackend.whenGET(/partials\/.*\.html/).respond(200, '');

// set a real stored token
auth.loginByToken('eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0ODQ2MzAzMTgsImV4cCI6MTQ4NzIyMjMxOCwiaWF0IjoxNDg0NjMwMzE4LCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjM0NzUxIiwic3ViIjoxMDAzLCJ1bmlxdWVfbmFtZSI6ImFtb3NjaGluaUBtYWtpbmdzZW5zZS5jb20iLCJyZWxheV9hY2NvdW50cyI6WyJhbW9zY2hpbmktbWFraW5nc2Vuc2UiXSwicmVsYXlfdG9rZW5fdmVyc2lvbiI6IjEuMC4wLWJldGE1In0.dQh20ukVSCP0rNXMWBh2DlPQXbP0uTaYzadRDNPXECI9lvCsgDKNXc2bToXAUQDeXw90kbHliVF-kCueW4gQLPBtMJOcHQFv6LfgspsG2jue2iMwoBC1q6UB_4xFlGoyhkRjldnQUV0oqBTzhFdXuTvQz53kRPiqILCHkd4FLl4KliBgdaDRwWz-HIjJwinMpnv_7V38CNvHlHo-q2XU0MnE3CsGXmWGoAgzN7rbeQPgI9azHXpbaUPh9n_4zjCydOSBC5tx7MtEAx3ivfFYImBPp2T2vUM-F5AwRh7hl_lMUvyQLal0S_spoT0XMGy8YhnjxXLoZeVRisWbxBmucQ');
Expand Down
Loading