Best JavaScript code snippet using storybook-root
script.js
Source:script.js
1/*button color*/2$(".one").hover(function() {3 $(this).css("background-color", "#ffcf00");4}, function() {5 $(this).css("background-color", "#00cdff");6});7$(".two").mouseenter(function() {8 $(this).css("background-color", "#ffcf00");9});10$(".two").mouseleave(function() {11 $(this).css("background-color", "#00cdff");12});13/* top button*/14$(".bimi").hover(function() {15 $(this).css("background-color", "#9bacb6");16}, function() {17 $(this).css("background-color", "inherit");18});19$("#colorchange").dblclick(function() {20 $("body").toggleClass("green");21 $("body").toggleClass("purple");22 $("button").toggleClass("three");23 $(this).removeClass("three");24});25/*button functions*/26$(".play-again").click(function() {27 $(".end-message").hide();28 $(".entry").show();29 $(".story1").text("Yay, we're on the final stage! Let's do this!");30 $(".story2").text("");31 $(".toRoom").show();32});33$(".toRoom").click(function() {34 $(".story1").text("We're in a big room now, but... Oh my god!");35 $(".story2").text("There's a big ferocious beast to our right! Should we fight it?");36 $(".toRoom").hide();37 $(".decision1").show();38});39/*decision 1*/40$(".fight").click(function() {41 $(".story1").text("Let's do it! Should we use our sword our our magic wand?");42 $(".story2").text("");43 $(".decision1").hide();44 $(".decisionMS2").show();45});46$(".no-fight").click(function() {47 $(".story1").text("Okay, let's be peaceful. Hopefully the monster is as well.");48 $(".story2").text("Should we run away and hide or stay and hope it doesn't kill us?");49 $(".decisionP2").show();50 $(".decision1").hide();51});52/*decision magic/sword-2*/53$(".sword").click(function() {54 $(".instructions").show();55 $(".instructions").text("(Double click the sword to pick it up!)");56 $(".story1").text("");57 $(".story2").text("");58 $(".story1").hide();59 $(".story2").hide();60 $(".decisionMS2").hide();61 $(".imgsword").show();62});63$(".no-sword").click(function() {64 $(".story1").text("Let's use our magic wand then!");65 $(".story2").text("Should we stun it or damage it?");66 $(".decisionMS2").hide();67 $(".decisionM3").show();68});69/*MAGIC*/70/*decision magic-3*/71$(".stun").click(function() {72 $(".instructions").show();73 $(".instructions").text("(Double click the wand to stun the monster!)");74 $(".story1").text("");75 $(".story2").text("");76 $(".story1").hide();77 $(".story2").hide();78 $(".decisionM3").hide();79 $(".wand").show();80});81$(".no-stun").click(function() {82 $(".story1").text("Uh oh, the spell wasn't enough! IT'S STILL MOVING, IT'S-");83 $(".story2").text("Our bodies have been ripped to shreds! :)");84 $(".end-message").show();85 $(".win-message").hide();86 $(".lose-message").show();87 $(".decisionM3").hide();88});89/*wand*/90$(".wand").dblclick(function() {91 $(".wand").fadeOut();92 $(".instructions").fadeOut();93 $(".star1").delay(500).fadeIn();94 $(".star1").delay(500).fadeOut();95 $(".star2").delay(2000).fadeIn();96 $(".star2").delay(500).fadeOut();97 $(".star3").delay(3500).fadeIn();98 $(".star3").delay(500).fadeOut();99 $(".story1").text("We've done it! The monster is stunned!");100 $(".story2").text("Now, should we run away? Or should we run towards it and finish it off?");101 $(".story1").delay(5000).fadeIn();102 $(".story2").delay(5000).fadeIn();103 $(".decisionM4").delay(5000).fadeIn();104});105/*decision magic-4*/106$(".runaway").click(function() {107 $(".story1").text("Quick! Before the monster catches up!");108 $(".story2").text("Should we go behind the column or towards the burning door?");109 $(".decisionM4").hide();110 $(".decisionM5").show();111});112$(".no-runaway").click(function() {113 $(".story1").text("We run towards it, but! IT'S UNSTUNNED AHHHHHHH");114 $(".story2").text("That was a dumb choice. Now we're dead. :(");115 $(".end-message").show();116 $(".win-message").hide();117 $(".lose-message").show();118 $(".decisionM4").hide();119});120/*decision magic-5*/121$(".column").click(function() {122 $(".story1").text("The monster isn't stupid. It saw us go behind the column.");123 $(".story2").text("The beast pounced on us and ripped us apart limb by limb!");124 $(".end-message").show();125 $(".win-message").hide();126 $(".lose-message").show();127 $(".decisionM5").hide();128});129$(".no-column").click(function() {130 $(".story1").text("When we reach the door, we see two power-ups, a half-burnt doll and a telescope.");131 $(".story2").text("Which item should we use?");132 $(".decisionM5").hide();133 $(".decisionM6").show();134});135/*decision magic-6*/136$(".fish").click(function() {137 $(".story1").text("We launch the flamin' fish into the monster!");138 $(".story2").text("The monster disintegrates into ashes.");139 $(".end-message").show();140 $(".win-message").show();141 $(".lose-message").hide();142 $(".decisionM6").hide();143});144$(".no-fish").click(function() {145 $(".story1").text("We peer into the future and see ourselves dying ");146 $(".story2").text("as we wasted time looking into the telescope.");147 $(".end-message").show();148 $(".win-message").hide();149 $(".lose-message").show();150 $(".decisionM6").hide();151});152/*SWORD*/153/*sword image*/154$(".imgsword").dblclick(function() {155 $(".imgsword").slideUp();156 $(".instructions").hide();157 $(".story1").text("Ok! Now, should we wait for the monster to come to us?");158 $(".story2").text("Or should we run up to it instead?");159 $(".story1").delay(500).fadeIn();160 $(".story2").delay(500).fadeIn();161 $(".decisionS3").delay(500).fadeIn();162});163/*decision sword-3*/164$(".stay").click(function() {165 $(".story1").text("We'll wait for it to come to us then.");166 $(".story2").text("The monster runs up and slaps the life out of us.");167 $(".end-message").show();168 $(".win-message").hide();169 $(".lose-message").show();170 $(".decisionS3").hide();171});172$(".no-stay").click(function() {173 $(".story1").text("We're right in front of it now.");174 $(".story2").text("Quick, should we go for its leg or neck?");175 $(".decisionS3").hide();176 $(".decisionS4").show();177});178/*decision sword-4*/179$(".leg").click(function() {180 $(".story1").text("Great! The monster is losing it's balance!");181 $(".story2").text("Now should we go for the neck or another leg?");182 $(".decisionS4").hide();183 $(".decisionS5").show();184});185$(".no-leg").click(function() {186 $(".story1").text("The monster sees us running towards it's neck.");187 $(".story2").text("It turns its head and gobbles us up instead. Yum.");188 $(".end-message").show();189 $(".win-message").hide();190 $(".lose-message").show();191 $(".decisionS4").hide();192});193/*decision sword-5*/194$(".neck").click(function() {195 $(".story1").text("We successfully sliced its head off!");196 $(".story2").text("I can see the exit now!");197 $(".end-message").show();198 $(".win-message").show();199 $(".lose-message").hide();200 $(".decisionS5").hide();201});202$(".no-neck").click(function() {203 $(".story1").text("We slice off another leg causing the monster to fall down.");204 $(".story2").text("Unfortunately, it fell on top of us. :(");205 $(".end-message").show();206 $(".win-message").hide();207 $(".lose-message").show();208 $(".decisionS5").hide();209});210/*PEACEFUL*/211/*decision peaceful-2*/212$(".hide").click(function() {213 $(".story1").text("Good idea. We don't know if it's hositle or not yet.");214 $(".story2").text("Let's hide first. Should we go left or right?");215 $(".decisionP2").hide();216 $(".decisionP3").show();217});218$(".no-hide").click(function() {219 $(".story1").text("Alrigh- AHHHHHHHHH BEHIND YOU!");220 $(".story2").text("We were mauled by the monster. :'(");221 $(".end-message").show();222 $(".win-message").hide();223 $(".lose-message").show();224 $(".decisionP2").hide();225});226/*decision peaceful-3*/227$(".left").click(function() {228 $(".story1").text("This wasn't the right choice! It was the left!");229 $(".story2").text("The monster follows you and bites your head off. :(");230 $(".end-message").show();231 $(".lose-message").show();232 $(".win-message").hide();233 $(".decisionP3").hide();234});235$(".no-left").click(function() {236 $(".story1").text("This was the right choice! I don't see the monster behind us.");237 $(".story2").text("Hey, there's book here. Why don't we check it out?");238 $(".decisionP3").hide();239 $(".continue").show();240});241/*continue and image*/242$(".continue").click(function() {243 $(".story1").text("");244 $(".story2").text("");245 $(".story1").hide();246 $(".story2").hide();247 $(".continue").hide();248 $(".closed-book").show();249 $(".instructions").text("Double click the item to open it!");250 $(".instructions").show();251});252$(".closed-book").dblclick(function() {253 $(".story1").text("The book opens and reveals a giant yellow door--the exit!");254 $(".story2").text("We can escape this dark place now!");255 $(".instructions").hide();256 $(".closed-book").hide();257 $(".open-book").delay(500).fadeIn();258 $(".open-book").delay(500).fadeOut();259 $(".story1").delay(2000).fadeIn();260 $(".story2").delay(2000).fadeIn();261 $(".end-message").delay(2000).fadeIn();262 $(".win-message").delay(2000).fadeIn();263 $(".lose-message").hide();...
StoryWin.ts
Source:StoryWin.ts
1/*2 * @Author: zhoulanglang 3 * @Date: 2020-07-14 11:14:29 4 * @Last Modified by: zhoulanglang5 * @Last Modified time: 2020-07-17 21:02:496 */7class StoryWin extends BaseEuiView {8 private img: eui.Image9 private arr1 = ["story2_00_png", "story2_01_png", "story2_03_png", 'story2_04_png', 'story2_06_png', 'story2_07_png', 'story2_09_png', 'story2_10_png', 'story2_12_png', 'story2_13_png', 'story2_15_png', 'story2_16_png', 'story2_18_png', 'story2_19_png', 'story2_21_png', 'story2_22_png', 'story2_24_png', 'story2_25_png', 'story2_27_png', 'story2_28_png', 'story2_30_png', 'story2_31_png', 'story2_33_png', 'story2_34_png',]10 private arr2 = ['story3_00_png', 'story3_02_png', 'story3_03_png', 'story3_05_png', 'story3_06_png', 'story3_08_png', 'story3_09_png', 'story3_11_png', 'story3_12_png', 'story3_14_png', 'story3_15_png', 'story3_17_png', 'story3_18_png', 'story3_20_png', 'story3_21_png', 'story3_23_png', 'story3_24_png', 'story3_26_png', 'story3_27_png', 'story3_29_png', 'story3_30_png', 'story3_32_png', 'story3_33_png', 'story3_35_png', 'story3_36_png', 'story3_38_png', 'story3_39_png', 'story3_41_png', 'story3_42_png', 'story3_44_png', 'story3_45_png', 'story3_47_png', 'story3_48_png']11 private arr3 = [12 'story4_00_png', 'story4_01_png', 'story4_02_png', 'story4_03_png', 'story4_04_png', 'story4_05_png', 'story4_06_png', 'story4_07_png', 'story4_08_png', 'story4_09_png', 'story4_10_png', 'story4_11_png', 'story4_12_png', 'story4_13_png', 'story4_14_png', 'story4_15_png', 'story4_16_png', 'story4_17_png', 'story4_18_png', 'story4_19_png', 'story4_20_png', 'story4_21_png', 'story4_22_png', 'story4_23_png', 'story4_24_png', 'story4_25_png', 'story4_26_png', 'story4_27_png', 'story4_28_png', 'story4_29_png', 'story4_30_png', 'story4_31_png', 'story4_32_png', 'story4_33_png', 'story4_34_png', 'story4_35_png', 'story4_36_png', 'story4_37_png', 'story4_38_png', 'story4_39_png', 'story4_40_png', 'story4_41_png', 'story4_42_png', 'story4_43_png', 'story4_44_png', 'story4_45_png', 'story4_46_png', 'story4_47_png', 'story4_48_png', 'story4_49_png', 'story4_50_png', 'story4_51_png', 'story4_52_png', 'story4_53_png', 'story4_54_png', 'story4_55_png', 'story4_56_png', 'story4_57_png', 'story4_58_png', 'story4_59_png', 'story4_60_png', 'story4_61_png', 'story4_62_png', 'story4_63_png', 'story4_64_png', 'story4_65_png', 'story4_66_png', 'story4_67_png', 'story4_68_png', 'story4_69_png', 'story4_70_png', 'story4_71_png', 'story4_72_png', 'story4_73_png', 'story4_74_png', 'story4_75_png'13 ]14 cur = 015 next = 016 callBack: Function17 public constructor() {18 super();19 this.skinName = 'StorySkin'20 }21 public open(...param: any[]): void {22 this.addTouchEvent(this.img, this.onClick);23 this.callBack = param[0]24 this.upView()25 }26 private async upView() {27 // await RES.loadGroup('storyGroup')28 ViewManager.ins().close(LoadingUI)29 this.cur = 030 this.img.source = this.arr1[this.cur]31 TimerManager.ins().doTimer(1000 / 8, 0, this.fun, this)32 }33 fun() {34 this.cur++35 if (this.cur >= this.arr1.length) {36 TimerManager.ins().remove(this.fun, this)37 return38 }39 this.img.source = this.arr1[this.cur]40 }41 fun2() {42 this.cur++43 if (this.cur >= this.arr2.length) {44 TimerManager.ins().remove(this.fun2, this)45 return46 }47 this.img.source = this.arr2[this.cur]48 }49 fun3() {50 this.cur++51 if (this.cur >= this.arr3.length) {52 return53 }54 this.img.source = this.arr3[this.cur]55 }56 end() {57 TimerManager.ins().removeAll(this)58 this.callBack && this.callBack()59 ViewManager.ins().close(this)60 RES.destroyRes('storyGroup')61 }62 public close(...param: any[]): void {63 this.callBack = null64 }65 private onClick(e: egret.TouchEvent): void {66 switch (e.currentTarget) {67 case this.img:68 if (this.next == 0) {69 if (this.cur >= this.arr1.length) {70 this.next = 171 this.cur = 072 this.img.source = this.arr2[this.cur]73 TimerManager.ins().doTimer(1000 / 8, 0, this.fun2, this)74 }75 }76 else if (this.next == 1) {77 if (this.cur >= this.arr2.length) {78 this.next = 279 this.cur = 080 this.img.source = this.arr3[this.cur]81 TimerManager.ins().doTimer(1000 / 8, 0, this.fun3, this)82 }83 }84 else if (this.next == 2) {85 if (this.cur >= this.arr3.length || this.cur >= 60) {86 let obj = { isFinish: true }87 CacheUtil.set(Constant.STORY_DATA, JSON.stringify(obj))88 this.end()89 }90 }91 break;92 }93 }94}95ViewManager.ins().reg(StoryWin, LayerManager.UI_Popup);...
index.js
Source:index.js
1import { equal } from 'assert'2import tehanu from 'tehanu'3import sort from '../lib/index.js'4const test = tehanu('test/index.js')5test('exports a function', () => {6 equal(typeof sort, 'function')7})8test('sorts unnamed stories', () => {9 const story1 = [null, { kind: '', name: '' }]10 const story2 = [null, { kind: '', name: '' }]11 equal(sort(null, story1, story2), 0)12 equal(sort(null, story2, story1), 0)13})14test('sorts one unnamed and one named stories', () => {15 const story1 = [null, { kind: '', name: '' }]16 const story2 = [null, { kind: '', name: 'Story' }]17 equal(sort(null, story1, story2), -1)18 equal(sort(null, story2, story1), 1)19})20test('sorts one unnamed and one named stories with an explicit order', () => {21 const story1 = [null, { kind: '', name: '' }]22 const story2 = [null, { kind: '', name: 'Story' }]23 const order = { '': { story: {} } };24 equal(sort(order, story1, story2), 1)25 equal(sort(order, story2, story1), -1)26})27test('sorts without groups alphabetically without specific order', () => {28 const story1 = [null, { kind: '', name: 'Story1' }]29 const story2 = [null, { kind: '', name: 'Story2' }]30 equal(sort(null, story1, story2), -1)31 equal(sort(null, story2, story1), 1)32})33test('sorts without groups according to a specific order', () => {34 const story1 = [null, { kind: '', name: 'Story1' }]35 const story2 = [null, { kind: '', name: 'Story2' }]36 const order = { '': { story2: {}, story1: {} } };37 equal(sort(order, story1, story2), 1)38 equal(sort(order, story2, story1), -1)39})40test('sorts in a group alphabetically without specific order', () => {41 const story1 = [null, { kind: 'Test', name: 'Story1' }]42 const story2 = [null, { kind: 'Test', name: 'Story2' }]43 equal(sort(null, story1, story2), -1)44 equal(sort(null, story2, story1), 1)45})46test('sorts in a group according to a specific order', () => {47 const story1 = [null, { kind: 'Test', name: 'Story1' }]48 const story2 = [null, { kind: 'Test', name: 'Story2' }]49 const order = { test: { story2: {}, story1: {} } };50 equal(sort(order, story1, story2), 1)51 equal(sort(order, story2, story1), -1)52})53test('sorts groups at the second level', () => {54 const story1 = [null, { kind: 'First/Second1', name: 'Story' }]55 const story2 = [null, { kind: 'First/Second2', name: 'Story' }]56 const order = {57 first: {58 second2: {},59 second1: {}60 }61 };62 equal(sort(order, story1, story2), 1)63 equal(sort(order, story2, story1), -1)64})65test('sorts groups at the third level', () => {66 const story1 = [null, { kind: 'First/Second/Third1', name: 'Story' }]67 const story2 = [null, { kind: 'First/Second/Third2', name: 'Story' }]68 const order = {69 first: {70 second: {71 third2: {},72 third1: {}73 }74 }75 };76 equal(sort(order, story1, story2), 1)77 equal(sort(order, story2, story1), -1)78})79test('sorts stories at the third level', () => {80 const story1 = [null, { kind: 'First/Second', name: 'Story1' }]81 const story2 = [null, { kind: 'First/Second', name: 'Story2' }]82 const order = {83 first: {84 second: {85 story2: {},86 story1: {}87 }88 }89 };90 equal(sort(order, story1, story2), 1)91 equal(sort(order, story2, story1), -1)92})93test('sorts with a wildcard at the first level of groups', () => {94 const story1 = [null, { kind: 'Test', name: 'Story1' }]95 const story2 = [null, { kind: 'Test', name: 'Story2' }]96 const order = { '*': { story2: {}, story1: {} } };97 equal(sort(order, story1, story2), 1)98 equal(sort(order, story2, story1), -1)99})100test('sorts complex example', () => {101 const story1 = [null, { kind: 'Articles', name: 'Getting Started' }]102 const story2 = [null, { kind: 'Articles', name: 'Versioning' }]103 const story3 = [null, { kind: 'Components/Header', name: 'Collapsed' }]104 const story4 = [null, { kind: 'Components/Header', name: 'Default' }]105 const story5 = [null, { kind: 'Components/Header', name: 'Expanded' }]106 const story6 = [null, { kind: 'Elements/Button', name: 'Active' }]107 const story7 = [null, { kind: 'Elements/Button', name: 'Default' }]108 const story8 = [null, { kind: 'Elements/Link', name: 'Active' }]109 const story9 = [null, { kind: 'Elements/Link', name: 'Default' }]110 const order = {111 articles: {},112 elements: {113 '*': { default: null, },114 },115 components: {116 '*': { default: null, },117 },118 };119 equal(sort(order, story1, story2), -1)120 equal(sort(order, story1, story3), -1)121 equal(sort(order, story1, story6), -1)122 equal(sort(order, story2, story3), -1)123 equal(sort(order, story3, story4), 1)124 equal(sort(order, story4, story5), -1)125 equal(sort(order, story4, story7), 1)126 equal(sort(order, story5, story6), 1)127 equal(sort(order, story6, story7), 1)128 equal(sort(order, story6, story9), -1)129 equal(sort(order, story7, story8), -1)130 equal(sort(order, story8, story9), 1)...
Using AI Code Generation
1import React from 'react';2import { storiesOf } from '@storybook/react';3import { action } from '@storybook/addon-actions';4import Button from './Button';5storiesOf('Button', module)6 .add('with text', () => (7 <Button onClick={action('clicked')}>Hello Button</Button>8 .add('with some emoji', () => (9 <Button onClick={action('clicked')}>😀 😎 👍 💯</Button>10 ));11import { configure, addDecorator } from '@storybook/react';12import { withInfo } from '@storybook/addon-info';13const req = require.context('../src', true, /.stories.js$/);14function loadStories() {15 req.keys().forEach(filename => req(filename));16}17addDecorator(withInfo);18configure(loadStories, module);19import React from 'react';20import { storiesOf } from '@storybook/react';21import { action } from '@storybook/addon-actions';22import { withNotes } from '@storybook/addon-notes';23import Button from './Button';24storiesOf('Button', module)25 .add(26 withNotes('A very simple button')(() => (27 <Button onClick={action('clicked')}>Hello Button</Button>28 .add(29 withNotes('A very simple button')(() => (30 <Button onClick={action('clicked')}>😀 😎 👍 💯</Button>31 );32import React from 'react';33import { storiesOf } from '@storybook/react';34import { action } from '@storybook/addon-actions';35import { withNotes } from '@storybook/addon-notes';36import { withKnobs, text, boolean, number } from '@storybook/addon-knobs/react';37import Button from './Button';38storiesOf('Button', module)39 .addDecorator(withKnobs)40 .add(41 withNotes('
Using AI Code Generation
1import story2 from 'storybook-root';2import { story1 } from 'storybook-root';3import { story3 } from 'storybook-root';4import { story4 } from 'storybook-root';5{6}7Import your stories into the `storybook-root.js` file. You can import them using the following methods:8import { importAll } from 'storybook-root';9importAll(require.context('../src', true, /\.stories\.js$/));10import { importStory } from 'storybook-root';11importStory(require('../src/stories/Button.stories.js'));12import { importStory } from 'storybook-root';13importStory(require('../src/stories/Button.stories.js'), 'Primary');14import { importStory } from 'storybook-root';15importStory(require('../src/stories/Button.stories.js'), 'default');16import { importStory } from 'storybook-root';17importStory(require('../src/stories/Button.stories.js'), 'Primary', 'MyPrimaryStory');18import { importStory } from 'storybook-root';19importStory(require('../src/stories/Button.stories.js'), 'default', 'MyDefaultStory');
Using AI Code Generation
1import { story2 } from "storybook-root";2export { story2 } from "./story2";3export const story2 = () => "story2";4module.exports = {5};6module.exports = {7};8module.exports = {9 {10 options: {11 },12 },13};14module.exports = {15 {16 options: {17 },18 },19};20import { root } from "storybook-root";21export { root } from "./root";22export const root = () => "root";23import { resolve } from "storybook-root";24export { resolve } from "./
Using AI Code Generation
1import StorybookRoot from 'storybook-root';2import { storiesOf } from '@storybook/react';3import { withKnobs, text } from '@storybook/addon-knobs';4const story = storiesOf('Test', module);5story.addDecorator(withKnobs);6story.add('Test', () => {7 const label = text('Label', 'Hello World');8 return <StorybookRoot story2={label} />;9});10MIT © [Shubham Singh](
Using AI Code Generation
1const path = require('path');2const distDirectory = path.resolve(__dirname, 'dist');3const path = require('path');4const distDirectory = path.resolve(__dirname, './dist');5const path = require('path');6const distDirectory = require.resolve('dist');7const path = require('path');8const distDirectory = require.resolve('./dist');9const path = require('path');10const distDirectory = require.resolve('dist');11const path = require('path');12const distDirectory = require.resolve('./dist');
Using AI Code Generation
1import { storiesOf } from 'storybook-root';2storiesOf('test', module).add('test story', () => <div>test</div>);3module.exports = function override(config, env) {4 config.resolve.alias['storybook-root'] = require.resolve('storybook-root');5 return config;6};7 "scripts": {8 },9import { configure } from 'storybook-root';10configure(require.context('../src', true, /\.stories\.js$/), module);11import { storiesOf } from 'storybook-root';12import MyComponent from './MyComponent';13storiesOf('MyComponent', module).add('MyComponent story', () => <MyComponent />);
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!