Merge pull request #6250 from HabitRPG/sabrecat/costume-awards

Costume Contest awards 2015
This commit is contained in:
Sabe Jones 2015-11-16 17:08:26 -06:00
commit 29c4e21b67
10 changed files with 280 additions and 87 deletions

View file

@ -1,342 +1,348 @@
.2014_Fall_HealerPROMO2 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -637px -955px;
background-position: -731px -995px;
width: 90px;
height: 90px;
}
.2014_Fall_Mage_PROMO9 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -452px -347px;
background-position: -306px -417px;
width: 120px;
height: 90px;
}
.2014_Fall_RoguePROMO3 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -573px -347px;
background-position: -808px -621px;
width: 105px;
height: 90px;
}
.2014_Fall_Warrior_PROMO {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -590px -461px;
background-position: -1095px -995px;
width: 90px;
height: 90px;
}
.promo_backtoschool {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -970px -342px;
background-position: -943px -522px;
width: 150px;
height: 150px;
}
.promo_burnout {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -220px;
background-position: -452px 0px;
width: 219px;
height: 240px;
}
.promo_classes_fall_2014 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -326px -760px;
background-position: -326px -724px;
width: 321px;
height: 100px;
}
.promo_classes_fall_2015 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -660px;
background-position: -430px -621px;
width: 377px;
height: 99px;
}
.promo_dilatoryDistress {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -955px;
background-position: -367px -995px;
width: 90px;
height: 90px;
}
.promo_enchanted_armoire {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -378px -660px;
background-position: -499px -525px;
width: 374px;
height: 76px;
}
.promo_enchanted_armoire_201507 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -970px -641px;
background-position: -943px -673px;
width: 217px;
height: 90px;
}
.promo_enchanted_armoire_201508 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -723px -342px;
background-position: -648px -724px;
width: 180px;
height: 90px;
}
.promo_enchanted_armoire_201509 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -273px -955px;
background-position: -458px -995px;
width: 90px;
height: 90px;
}
.promo_enchanted_armoire_201511 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1111px -493px;
background-position: -306px -326px;
width: 122px;
height: 90px;
}
.promo_habitica {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -723px -166px;
background-position: -452px -241px;
width: 175px;
height: 175px;
}
.promo_habitica_sticker {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -220px;
width: 305px;
height: 304px;
}
.promo_haunted_hair {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1127px -194px;
background-position: -1094px -522px;
width: 100px;
height: 137px;
}
.customize-option.promo_haunted_hair {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1152px -209px;
background-position: -1119px -537px;
width: 60px;
height: 60px;
}
.promo_item_notif {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -970px -91px;
background-position: -943px -271px;
width: 249px;
height: 102px;
}
.promo_mystery_201405 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -546px -955px;
background-position: -1004px -995px;
width: 90px;
height: 90px;
}
.promo_mystery_201406 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -311px -220px;
background-position: -91px -995px;
width: 90px;
height: 96px;
}
.promo_mystery_201407 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -876px -433px;
background-position: -628px -241px;
width: 42px;
height: 62px;
}
.promo_mystery_201408 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1188px -641px;
background-position: -1161px -764px;
width: 60px;
height: 71px;
}
.promo_mystery_201409 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -182px -955px;
background-position: -640px -995px;
width: 90px;
height: 90px;
}
.promo_mystery_201410 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1169px -823px;
background-position: -1161px -673px;
width: 72px;
height: 63px;
}
.promo_mystery_201411 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -364px -955px;
background-position: -822px -995px;
width: 90px;
height: 90px;
}
.promo_mystery_201412 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -904px -342px;
background-position: -1195px -592px;
width: 42px;
height: 66px;
}
.promo_mystery_201501 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -899px -166px;
background-position: -1193px -271px;
width: 48px;
height: 63px;
}
.promo_mystery_201502 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -499px -461px;
background-position: -276px -995px;
width: 90px;
height: 90px;
}
.promo_mystery_201503 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -728px -955px;
background-position: 0px -1101px;
width: 90px;
height: 90px;
}
.promo_mystery_201504 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1188px -732px;
background-position: -874px -525px;
width: 60px;
height: 69px;
}
.promo_mystery_201505 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -91px -955px;
background-position: -549px -995px;
width: 90px;
height: 90px;
}
.promo_mystery_201506 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -899px -230px;
background-position: -1195px -522px;
width: 42px;
height: 69px;
}
.promo_mystery_201507 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -220px -220px;
background-position: 0px -995px;
width: 90px;
height: 105px;
}
.promo_mystery_201508 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -314px -326px;
background-position: -829px -724px;
width: 93px;
height: 90px;
}
.promo_mystery_201509 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -455px -955px;
background-position: -913px -995px;
width: 90px;
height: 90px;
}
.promo_mystery_201510 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -220px -326px;
background-position: -182px -995px;
width: 93px;
height: 90px;
}
.promo_mystery_3014 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -970px -732px;
background-position: -943px -764px;
width: 217px;
height: 90px;
}
.promo_orca {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1121px -342px;
background-position: -306px -220px;
width: 105px;
height: 105px;
}
.promo_partyhats {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -1111px -584px;
background-position: -943px -855px;
width: 115px;
height: 47px;
}
.promo_pastel_skin {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -331px -871px;
background-position: 0px -835px;
width: 330px;
height: 83px;
}
.customize-option.promo_pastel_skin {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -356px -886px;
background-position: -25px -850px;
width: 60px;
height: 60px;
}
.promo_pet_skins {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -970px -493px;
background-position: -1100px -374px;
width: 140px;
height: 147px;
}
.customize-option.promo_pet_skins {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -995px -508px;
background-position: -1125px -389px;
width: 60px;
height: 60px;
}
.promo_shimmer_hair {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -871px;
background-position: -331px -835px;
width: 330px;
height: 83px;
}
.customize-option.promo_shimmer_hair {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -25px -886px;
background-position: -356px -850px;
width: 60px;
height: 60px;
}
.promo_splashyskins {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -970px -823px;
background-position: -452px -417px;
width: 198px;
height: 91px;
}
.customize-option.promo_splashyskins {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -995px -838px;
background-position: -477px -432px;
width: 60px;
height: 60px;
}
.promo_springclasses2014 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -970px 0px;
background-position: -943px -180px;
width: 288px;
height: 90px;
}
.promo_springclasses2015 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -430px -557px;
background-position: -943px -89px;
width: 288px;
height: 90px;
}
.promo_summer_classes_2014 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -557px;
background-position: 0px -621px;
width: 429px;
height: 102px;
}
.promo_summer_classes_2015 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -648px -760px;
background-position: -943px 0px;
width: 300px;
height: 88px;
}
.promo_updos {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -970px -194px;
background-position: -943px -374px;
width: 156px;
height: 147px;
}
.promo_veteran_pets {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -723px -509px;
background-position: 0px -919px;
width: 146px;
height: 75px;
}
.promo_winterclasses2015 {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -760px;
background-position: 0px -724px;
width: 325px;
height: 110px;
}
.promo_winteryhair {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -723px -433px;
background-position: -662px -835px;
width: 152px;
height: 75px;
}
.customize-option.promo_winteryhair {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -748px -448px;
background-position: -687px -850px;
width: 60px;
height: 60px;
}
.avatar_variety {
background-image: url(spritesmith-largeSprites-0.png);
background-position: 0px -461px;
background-position: 0px -525px;
width: 498px;
height: 95px;
}
@ -348,19 +354,19 @@
}
.welcome_basic_avatars {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -452px -181px;
background-position: -672px -347px;
width: 246px;
height: 165px;
}
.welcome_promo_party {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -452px 0px;
background-position: -672px 0px;
width: 270px;
height: 180px;
}
.welcome_sample_tasks {
background-image: url(spritesmith-largeSprites-0.png);
background-position: -723px 0px;
background-position: -672px -181px;
width: 246px;
height: 165px;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -69,8 +69,9 @@
"habiticaDayPluralText": "Celebrated <%= number %> Naming Days! Thanks for being a fantastic user.",
"achievementDilatory": "Savior of Dilatory",
"achievementDilatoryText": "Helped defeat the Dread Drag'on of Dilatory during the 2014 Summer Splash Event!",
"costumeContest": "2014 Costume Contest",
"costumeContestText": "Participated in the 2014 Halloween Costume Contest. See some of the entries at blog.habitica.com/tagged/cosplay!",
"costumeContest": "Costume Contestant",
"costumeContestText": "Participated in the Habitoween Costume Contest. See some of the entries <a href='http://blog.habitrpg.com/tagged/cosplay' target='_blank'>on the Habitica blog</a>!",
"costumeContestTextPlural": "Participated in <%= number %> Habitoween Costume Contests. See some of the entries <a href='http://blog.habitrpg.com/tagged/cosplay' target='_blank'>on the Habitica blog</a>!",
"memberSince": "- Member since",
"lastLoggedIn": "- Last logged in",
"notPorted": "This feature is not yet ported from the original site.",

View file

@ -1,4 +1,4 @@
var migrationName = 'new_stuff.js';
var migrationName = '20151013_jackolanterns.js';
var authorName = 'Sabe'; // in case script author needs to know when their ...
var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done

View file

@ -0,0 +1,102 @@
var migrationName = '20151116_costume_contest.js';
var authorName = 'Sabe'; // in case script author needs to know when their ...
var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done
/*
* Award Costume Contest achievement to 2015 winners
*/
var dbserver = 'localhost:27017'; // FOR TEST DATABASE
// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE
var dbname = 'habitrpg';
var mongo = require('mongoskin');
var _ = require('lodash');
var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users');
// specify a query to limit the affected users (empty for all users):
var query = {
_id: {
$in: [
'e411dab3-a4ca-414d-bdbd-b6940b3bdeb3',
'35ced5cc-c33a-45c8-93dc-16000ee66fde',
'ab3f0549-7247-4fd5-975b-efcff98c79c3',
'b1261fd2-eb25-46b4-97a9-ae7a0dc8a131',
'1f27893f-3808-4724-9725-f46dab93faca',
'216a0c23-6afd-4a5e-b434-d386a10862a2',
'2d6ef231-50b4-4a22-90e7-45eb97147a2c',
'98b8cf4f-89bd-4b0a-988d-02629a217232',
'c5183dfa-c741-43ce-935e-c6d89b41a030',
'262a7afb-6b57-4d81-88e0-80d2e9f6cbdc',
'33991e0a-de55-4986-ac81-af78491a84de',
'7adf6ada-3c05-4054-b5df-fa7d49d3b9eb',
'235a1cbd-48c5-41b1-afb4-59d2f8645c57',
'b7617a61-188b-4332-bf4d-32268fa77f2b',
'672c1ce0-9f47-44f0-a3f3-8cc3c6c5a9cb',
'd0a3217a-7b92-48d6-b39a-b1b1be96702e',
'5ef910dc-1d22-47d9-aa38-a60132c60679',
'370a44c8-e94a-4a2c-91f2-33166926db1f',
'1b0b3ef3-28bd-4046-a49b-e1c83e281baf',
'75b93321-66b9-49bd-9076-052499c1d2bf',
'd97516e4-81d0-4f60-bf03-95f7330925ab',
'3e13cc79-de38-420d-822e-9e9da309ce6b',
'0e471dc1-ecb0-4388-a891-b873a237d2cf',
'ca3da398-4f73-4304-b838-af3669ed4cbb',
'44cdf105-8bda-4197-9d1a-1bcb83b4dc84',
'5419830c-b837-4573-ae82-4718ab95b7f1',
'ac6fbe37-b0dc-40d8-ba14-77dde66fbfa8',
'8789ba18-a498-46b9-b367-3b929a0acb94',
'52fce1a9-9b0a-4e26-95dc-adc12f52e752',
'21bf71ac-399c-470b-abe0-cc49a03b6a8b',
'f1618ce2-552e-4f23-bc76-e73d63ebedd0',
'4cc0c749-d943-4090-b529-42bc665b7244',
'e259682e-cb5c-4d94-b472-ceedc66d7484',
'fa197a4b-e065-4551-803a-c8a5b9970f9d'
]
}
};
// specify fields we are interested in to limit retrieved data (empty if we're not reading data):
var fields = {
};
console.warn('Updating users...');
var progressCount = 1000;
var count = 0;
dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) {
if (err) { return exiting(1, 'ERROR! ' + err); }
if (!user) {
console.warn('All appropriate users found and modified.');
return displayData();
}
count++;
// specify user data to change:
var set = {'migration':migrationName};
var inc = {'achievements.costumeContests':1};
dbUsers.update({_id:user._id}, {$set:set});
dbUsers.update({_id:user._id}, {$inc:inc});
if (count%progressCount == 0) console.warn(count + ' ' + user._id);
if (user._id == authorUuid) console.warn(authorName + ' processed');
});
function displayData() {
console.warn('\n' + count + ' users processed\n');
return exiting(0);
}
function exiting(code, msg) {
code = code || 0; // 0 = success
if (code && !msg) { msg = 'ERROR!'; }
if (msg) {
if (code) { console.error(msg); }
else { console.log( msg); }
}
process.exit(code);
}

View file

@ -0,0 +1,64 @@
var migrationName = '20151116_costume_contest_to_number.js';
var authorName = 'Sabe'; // in case script author needs to know when their ...
var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done
/*
* Change Costume Contest achievement from Boolean to Number, so people can win repeatedly
*/
var dbserver = 'localhost:27017'; // FOR TEST DATABASE
// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE
var dbname = 'habitrpg';
var mongo = require('mongoskin');
var _ = require('lodash');
var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users');
// specify a query to limit the affected users (empty for all users):
var query = {
'achievements.costumeContest':true
};
// specify fields we are interested in to limit retrieved data (empty if we're not reading data):
var fields = {
'achievements.costumeContest':1
};
console.warn('Updating users...');
var progressCount = 1000;
var count = 0;
dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) {
if (err) { return exiting(1, 'ERROR! ' + err); }
if (!user) {
console.warn('All appropriate users found and modified.');
return displayData();
}
count++;
// specify user data to change:
var set = {'achievements.costumeContests':1};
dbUsers.update({_id:user._id}, {$set:set});
if (count%progressCount == 0) console.warn(count + ' ' + user._id);
if (user._id == authorUuid) console.warn(authorName + ' processed');
});
function displayData() {
console.warn('\n' + count + ' users processed\n');
return exiting(0);
}
function exiting(code, msg) {
code = code || 0; // 0 = success
if (code && !msg) { msg = 'ERROR!'; }
if (msg) {
if (code) { console.error(msg); }
else { console.log( msg); }
}
process.exit(code);
}

View file

@ -53,11 +53,12 @@ var UserSchema = new Schema({
perfect: Number,
habitBirthdays: Number,
valentine: Number,
costumeContest: Boolean,
costumeContest: Boolean, // Superseded by costumeContests
nye: Number,
habiticaDays: Number,
greeting: Number,
thankyou: Number
thankyou: Number,
costumeContests: Number
},
auth: {
blocked: Boolean,

View file

@ -1,31 +1,48 @@
h2 11/11/2015 - NOVEMBER PET QUEST, SHARE SUCCESS, AND HABITICA T-SHIRTS
h2 11/16/2015 - HABITICA STICKERS AND COSTUME CONTEST BADGES!
hr
tr
td
.Pet-Snake-Base.pull-right
h3 November Pet Quest
p There's a new pet quest in the <a href='/#/options/inventory/quests'>Quest Shop</a>! A slithering foe awaits you among the shimmering sand dunes. Can you defeat the Serpent of Distraction? If so, you'll get some slithering snake pets.
p.small.muted Art by EmeraldOx, Painter Prophet, and Lord Darkly
p.small.muted Writing by Daniel the Bard and felipena
tr
td
.achievement-triadbingo2x.pull-right
h3 Share Success
p Now you can share your success on social media when you hatch a pet, complete a quest, or more! (As always, your task details remain private.) Show off your victories to your friends and bask in some well-deserved praise.
p.small.muted by SabreCat and Lemoness
tr
td
.promo_habitica.pull-right(style='border-radius:25px;margin-left:1em')
h3 Habitica T-Shirts
p Exciting news - for the next three weeks, we are offering <a href='https://teespring.com/stores/habitica' target='_blank'>Habitica T-shirts via Teespring</a>! Show your Habitica pride in purple or black. We are also offering an <a href='https://teespring.com/habitica-gryphon-t-shirt_eu' target='_blank'>EU run for cheaper shipping to Europe</a>!
.achievement-costumeContest2x.pull-right
h3 Costume Contest Badges
p We've awarded all the costume contest badges! Over the coming months, we'll be posting the costumes <a href='http://blog.habitrpg.com/tagged/cosplay' target='_blank'>on our blog</a>, so be sure to follow along.
br
p Whether you're getting them for yourself or as a holiday gift, we hope you enjoy these limited-run T-shirts! As always, thanks for supporting Habitica.
p Important: if you submitted a photo but did NOT receive your badge, it probably means that we were unable to view your entry due to privacy restrictions or other issues. Email your photo to <a href='mailto:leslie@habitica.com' target='_blank'>leslie@habitica.com</a> and she will make sure that you get your badge!
br
p Thanks again to all the participants. We were very impressed by your creativity!
tr
td
.promo_habitica_sticker.pull-right
h3 Habitica Stickers
p In addition to our <a href='https://teespring.com/stores/habitica' target='_blank'>Habitica T-shirts</a>, we are now also selling <a href='https://www.stickermule.com/uk/marketplace/9317-habitica-gryphon-sticker' target='_blank'>Habitica Stickers</a>! Display Melior anywhere for extra motivation.
p.small.muted by Redphoenix and Sara Olson
if menuItem !== 'oldNews'
hr
a(href='/static/old-news', target='_blank') Read older news
mixin oldNews
h2 11/11/2015 - NOVEMBER PET QUEST, SHARE SUCCESS, AND HABITICA T-SHIRTS
tr
td
.Pet-Snake-Base.pull-right
h3 November Pet Quest
p There's a new pet quest in the <a href='/#/options/inventory/quests'>Quest Shop</a>! A slithering foe awaits you among the shimmering sand dunes. Can you defeat the Serpent of Distraction? If so, you'll get some slithering snake pets.
p.small.muted Art by EmeraldOx, Painter Prophet, and Lord Darkly
p.small.muted Writing by Daniel the Bard and felipena
tr
td
.achievement-triadbingo2x.pull-right
h3 Share Success
p Now you can share your success on social media when you hatch a pet, complete a quest, or more! (As always, your task details remain private.) Show off your victories to your friends and bask in some well-deserved praise.
p.small.muted by SabreCat and Lemoness
tr
td
.promo_habitica.pull-right(style='border-radius:25px;margin-left:1em')
h3 Habitica T-Shirts
p Exciting news - for the next three weeks, we are offering <a href='https://teespring.com/stores/habitica' target='_blank'>Habitica T-shirts via Teespring</a>! Show your Habitica pride in purple or black. We are also offering an <a href='https://teespring.com/habitica-gryphon-t-shirt_eu' target='_blank'>EU run for cheaper shipping to Europe</a>!
br
p Whether you're getting them for yourself or as a holiday gift, we hope you enjoy these limited-run T-shirts! As always, thanks for supporting Habitica.
h2 11/5/2015 - HUGE IOS UPDATE AND ANDROID MAILING LIST
tr
td

View file

@ -229,11 +229,13 @@ div(ng-if='::profile.achievements.quests.burnout')
=env.t('achievementBurnoutText')
hr
div(ng-if='::profile.achievements.costumeContest')
div(ng-if='::profile.achievements.costumeContests')
.achievement.achievement-costumeContest
h5=env.t('costumeContest')
small
=env.t('costumeContestText')
small(ng-if='::profile.achievements.costumeContests === 1')
!=env.t('costumeContestText')
small(ng-if='::profile.achievements.costumeContests > 1')
!=env.t('costumeContestTextPlural', {number: "{{::profile.achievements.costumeContests}}"})
hr
each card in ['greeting', 'thankyou', 'nye', 'valentine']