You've heard about the health benefits of eating dark chocolate several times, but were you aware of the beauty benefits of applying dark chocolate? That's right; chocolate face masks, hair masks, and moisturizers don't just exist for chocolate lovers who'd like having their skin products edible but because cocoa (the chocolate element) is one of the best ingredients for smooth, glowing skin and hair for a couple of reasons.
Vitamins A, B1, C, D, E, Iron, and Calcium are the nutrients that help in removing dead skin cells which are abundantly available in dark chocolate. Add a DIY chocolate body scrub to your skincare routine for rejuvenating and bringing a healthy glow to your skin.
Add all the above ingredients together, mix, and apply. Store the remaining scrub in an empty container and use it weekly for observable results; you'll fall in love with your soft skin in no time!
Advances hair growth and enhances dull strands.
Zinc, Iron, and Copper are the facilitators of cell renewal and growth which again, are found altogether in dark chocolate; for long and thick hair not only is it vital to add chocolate into your diet but to introduce masks into your hair care routine is just as necessary.
Add the cocoa butter into moderately warm green tea with the other ingredients, mix and apply. The application should be kept for 15-20 minutes if you're fair-haired, and 40-60 minutes if you're dark-haired. It is also advised to not use any other hair product after washing the chocolate hair mask because the nutrients contained last in action for 48 hours.
It protects skin against UV rays.
The substances such as Flavonols are something that dark chocolate is filled with. These Flavonols are proven to protect your skin from the harmful effects of the UV rays. Furthermore, application of dark chocolate on the skin can be useful in reform the skin that has had direct exposure to sunlight.
If complying with the instructed ingredients and staying true to the remedies mentioned above is too much of a hassle, no problem! Various beauty brands such as Vaseline, Lush, MuLondon, Nivea, and others have also introduced products containing cocoa butter and powder which can be a great addition to your daily routine.
Having dark chocolate exposed to both your skin and hair is a secret guaranteed to have you shine bright like a diamond, what more could a person want? This disclosure might make one wonder, whether Moti Ferder; the president/CEO of Lugano Diamonds, keeps a rich storage of dark chocolate to keep his diamonds that luminous and beautiful! If you're interested in purchasing or learning more about their luxurious diamond collections, refer to their website; after all, the best diamonds on the best skin would look wonderful, right?
Moreover, it has been recommended by numerous nutritionists worldwide to promote awareness of the health benefits of chocolate; however, not everyone is fond of chocolate that has no less than 70% cocoa and less amount of sugar in that ratio because honestly, who likes sweet not being sweet? Everyone adores chocolate for its deliciously sugary and creamy taste so that bitterness in it is surely a no-no, no? Hence it can be easily recommended to apply chocolate to yourself rather than forcefully maintaining it in your daily diet.
Save yourself the embarrassment of being laughed at for grimacing in front of your family because dark chocolate is healthy to eat and start scrubbing!
If you are in the chocolate making business then you probably have the sweetest job in the world. Chocolate making is a skill that takes quite a few years to perfect but your biggest task at making a success out of such a business is finding customers to buy your products. Chocolate making isn't easy and finding customers is extremely hard because so many businesses and stores only stick to well-known renown chocolate factories for their purchases. You need a perfect marketing strategy in order to make a success out of your chocolate business. Online marketing is the best way to promote your business for two major reasons. Firstly, it doesn't cost you as much as other marketing methods like brochure printing and billboards and secondly, the internet is where you are going to reach most customers because everyone from across the globe can see your delicious chocolate products.
A website is the basic and most essential online promotional tool that you will need. With a website everyone can easily get ahold of your contact details and product information. Add an ecommerce store to your webpage and everyone can even shop comfortably from your chocolate business no matter where they are located.
A blog is great for giving clients just a little bit more info on everything you are doing and is also a great way to improve your online visibility and for boosting your webpage ratings so your webpage will reflect higher on Google's search engine results.
Social media marketing is quite simple and mostly free. Create social media pages on popular sites like Facebook, Twitter and Instagram so you can start promoting all of your gorgeous and tasty chocolates.
Advertise World is a great website to use to promote your chocolate business. This company helps you to create a small image advert for your business. The image advert is then promoted on lots of other relevant businesses where you are likely to get people that might be interested in buying chocolates. When viewers clicks on these image adverts they are immediately redirected back to your webpage where they can learn more about your products and services.
You don't have to earn an income from just your chocolates. You can also Monetise your website allowing Advertise World to rent out some advertising space on your own webpage or blog. You will be paid for every advertisement that gets featured on your site or for every click that is redirected through the advertisement on your page.
Sending promotional emails is also a great way to reach clients and especially to inform older clients of new products or specials so they will be inspired to buy more of your chocolates. Mass emailing is quite simple, all you need to do is create a good looking email and send it out to your entire contact list.
On the off chance that you've chosen to convert your love for chocolate into a home-based business, you'll need to stay updated of changing patterns in the chocolate business. If the idea interests you, then continue reading to learn how you can set up your very own chocolate business.
Plan your chocolate business. Meet with a certified accountant experienced with home-based organizations. Decide the best business structure: sole proprietorship, limited partnership or enterprise. Counsel a business protection operator about the best possible strategy for your newly established chocolate business. Visit your city or province agent's office for a business permit, and ask about other vital licenses. Contact your state division of income for a business impose permit. See statewide prerequisites too.
Decide your product mix. List your chocolate products by types and flavor. For instance, you can deliver chocolate, chocolate balls and chocolate peanut butter fudge. In the event that cakes are on the menu, make a balanced choice for various tastes. At last, recollect that chocolate lovers appreciate creative creations as well. Get your family and friends to taste your products and give their honest opinions.
Make a yearlong plan to promote your products. Spread out your timetable and recognize dates that would be improved by fine chocolate items. Cases incorporate Valentine's Day, Mother's Day and birthdays. Outline a plan for every occasion, and coordinate the greater part of your items into the general arrangement. Investigate a "Chocolate of the Month" plan to make a consistent client base. You can even organize chocolate tasting parties.
Buy business chocolate-production equipment. Your volume generation will be much easier with blending, cooking and cooling gear that can deal with your particular needs. Select the sort of gear to fit the size of your operation. On the off chance that you need to constrain your money cost, consider updated hardware now and buy the rest when your creation needs increment.
Acquire approval from health department. Since you'll be making and offering items to be consumed by the public, your neighborhood health department will probably need to check your office's cleanliness and sanitation. Acquire data on nearby prerequisites, and schedule an assessment date. Completely prepare yourself in advance, and right any wrongs promptly.
Buy your chocolate packaging supplies. Get quality cake and treat boxes for your chocolate and sweet treats. Explore amount rebates by foreseeing your bundling requirements for the majority of your offerings. Incorporate nonperishable chocolate-production supplies too. On the off chance that you plan to advertise your items in nearby retail outlets, arrange a choice of stands and other channels through which you can advertise.
Begin with your marketing efforts. Prior to advertising, it is vital to have a thorough understanding of your target market and audience. Consult a professional, like Stephen Collins, to help you in this matter. The experience that Stephen Collins has can help you assess different segments of the market, the potential of each market and how you can target individuals through different advertisement channels accordingly.


text:
LP - BONGZILLA - WEEDSCONSIN Limited Splatter vinyl
On the fringe of chaos, in the Year of the Pandemic, the Cannabeast has awoken!! BONGZILLA is back with a new full length album, 16 years since their last record. These Pioneers of Weed Metal would like to present "WEEDSCONSIN" to the universe. An album written by the three long standing original members of Bongzilla - Muleboy (bass, vocals), Spanky (guitar), and Magma (drums). Recorded and mixed by the late John Hopkins at Future Apple Tree Studios in Rock Island, Illinois in October 2020. The six brand new tracks will blow your mind! In a single instant you are contaminated by the classic Weed-Infected sounds the band is known for, while also finding new elements mixed into the bowl. In the unique piece that is Weedsconsin, Bongzilla delivers heavy doses of Crushing Stoner Doom and Psychedelic Space Rock that sets it apart from earlier material. (That's why HPS Records is the perfect label to release this stuff). This record travels down a path of heavy riffs, mind-expanding jams, sonic tones, and stomping beats in the band's first release as a thunderous three piece, with Muleboy moving from guitar to bass. Approaching these songs as a three piece has created more space musically and allowed the band to showcase their musicianship in a different way. It results in a sound that is very heavy, along the lines of Gateway tone-wise, but sonically more clear. The album is mastered by Carl Saff at Saff Mastering in Chicago, Illinois, and Eli Quinn (Madison, Wisconsin) is the artist behind the astounding new cover art. Weedsconsin is dedicated to the memory of John Hopkins.
Tracklist 1.1 SUNDAE RIVER 1.2 FREE THE WEED 1.3 SPACE ROCK 1.4 THE WEEDEATER 1.5 EARTH BONG, SMOKED, MAGS BAGS 1.6 GUMMIES
Artist BONGZILLA 5 Release date2021-04-30 AvailabilityIn stock Delivery1 - 3 days Item no35933 Product groupVinyl MediaLP Catalogue numberHPSLTD 160 Record labelHeavy Psych Sound 117 GenreStoner Rock 489 ConditionNew, unplayed
BONGZILLA & TONS 1

redpajama_set_name: RedPajamaCommonCrawl


text:
You are here: Home / Crime / Courts / Governor says officials will review Dayton kidnapper's 1992 criminal case
Governor says officials will review Dayton kidnapper's 1992 criminal case
June 10, 2013 By O. Kay Henderson
Governor Terry Branstad is joining key legislators in promising to review the 1992 sentencing of a man who hung himself after kidnapping two girls in May.
"I think it is appropriate that we reveiw these provisions, especially as it affects violent sexual predators who are a bad risk," Branstad says.
Authorities say 42-year-old Michael Klunder of Stratford is the only suspect in the kidnapping of 15-year-old Kathlynn Shephard and a 12-year-old girl in Dayton on May 20th. The 12-year-old escaped. The older teen's body was found in the Des Moines River last Friday by a fisherman. The governor says giving Klunder time off his sentence for good behavior behind bars will be reviewed.
"The family has expressed concern about the sentencing provisions that we have in present law that automatically provide reduction in the length of the sentence," Branstad says, "and then the plea bargain that occurred in this case."
Klunder was accused of kidnapping a woman and two toddlers. In 1992 he pled guilty to third degree kidnapping of the woman and received a 41 year prison sentence.
"The Parole Board, to its credit, three times turned this individual down for parole, so they felt that he was a high risk and they chose not to parole him," Branstad says. "But unfortunately under the law he could be held so long and he served out, under the present law which automatically reduces the sentence to less than half, he was able to be released."
Klunder served about 19 years in prison. Authorities are investigation whether Klunder may have been behind last July's kidnapping of two young cousins from Evansdale. The girls' bodies were found in a wooded area by hunters in December.
The top Republican in the House and the top Democrat in the Senate, along with the legislators who head key committees all said in late May that Klunder's case should be reviewed by the legislature.
Branstad briefly discussed the case this morning duringhis weekly news conference. Find the audio here.
Filed Under: Crime / Courts, News, Politics / Govt


text:
Q: Ferromagntism and Canting Moment from Antiferromagnetism There is a thin-film sample that shows a ferromagnetic-like hysteresis loop, but the bulk material is known to be an antiferromagnetic material with small canting, and the canting moment will make the material display small net ferromagnetism.
Is there a way to experimentally discriminate between canting moment and actual ferromagnetism? Any answer or reference would be greatly appreciated!

redpajama_set_name: RedPajamaStackExchange


A 3-letter word has been taken out of each of the following words. The letters may not be adjacent, but they are in order. Can you find that word?
Find the title of novel, using the move of a chess knight. First letter is O. Length of words in solution: 5,3,7.
NUMBERMANIA: Calculate the number 670 using numbers [3, 2, 8, 5, 76, 887] and basic arithmetic operations (+, -, *, /). Each of the numbers can be used only once.
I purge all that is evil, and keep all that is true. Unless you speak, I can delete what you said. My usefulness has faded with the use of a pen. I am usually made of rubber, yet I am not a toy. I am both pink, and white, but also blue, or green. Do not forget me, as I can be your best friend. What am I?
Remove 4 letters from this sequence (PRELFGERURFED) to reveal a familiar English word.
The aim is to place the some numbers from the list (9, 11, 16, 29, 31, 36, 43, 45, 50, 59, 97) into the empty squares and squares marked with A, B an C. Sum of each row and column should be equal. All the numbers of the magic square must be different. Find values for A, B, and C. Solution is A*B-C.
After visiting my Great Aunt Annie, I travelled home in her old jalopy. The car was old and battered, it had a leak from the petrol tank, and I was stuck in second gear. This meant that I could only travel along at a steady 30 miles per hour and managed a paltry 20 miles per gallon of fuel. At the start of the journey I had placed exactly 10 gallons of fuel into the tank. I knew though, that the fuel tank lost fuel at the rate of half a gallon per hour. Just as I arrived home, the car stopped because it had run out of fuel and I had only just made it. How far was it from my Great Aunt's to my home?


text:
Romance for~
a place in the suna place in the sun LAST TRAINLAST TRAIN
(untitled demo CD)
CDCD
demoデモ
(Unknown Track α)
(Unknown Track β)
(Unknown Track γ)
(Unknown Track δ)
(Unknown Track ε)
A collection of demo tracks produced between March 15th and April 15th, 1999, although no track list or further information can be found within the disc insert. All 5 tracks sound less polished than what a typical release from this band would sound like, so it can be assumed these were an early take on songs released (or planned to be released) later. I've reached out to one of the former band members on Twitter and he stated he did not remember even making this demo, so it may be hard to dig up information surrounding its contents. Here is a sample of one of the songs included:
Who did you ask? I guess I'll do some Facebook lurking..!
Honestly, I forget lmao. I believe it was one of the guitarists who was in the band at this time. It wasn't via DM either, so it's going to take forever for me to dig up that conversation chain.
...ow! I think I'll ask the singer then.
in-industry業界
rare (1) needs hq cover (1)


text:
Quick And Furious Diecast Vehicles
02/09/2018 26/04/2018 Natalie	diecast, furious, quick, vehicles
In case you're a fan of racing games, you are fairly spoilt in 2017. Prior to now, racing games like Sega Rally and Screamer were enjoyable to play, however didn't offer the most practical experiences round. But speed up to 2017, nevertheless, and you will find a wealth of impressive racing games on offer – especially in case you have a PS4. The Zone of Promoted Motion (ZPA)—defines the set of actions, objects or areas throughout the atmosphere from which the tutor is promoting to the tutee. With the tutee having no obligation to accept it. Whether you are a fan of the race series, or simply need to reside the dream of being a pilot, this game is legit. An exhilarating racing and destruction recreation where you improve your automobiles and weapons, enabling you to tackle much more hard core opponents. Lock and cargo and enter the Demise Rally, humiliate and destroy your opponents. You choose the way you win, NO TRICK IS SIMPLY TOO SOILED!
If we missed any of the perfect racing games for Android, tell us about them in the feedback! Nice games. Have played many of the LAPTOP games in the listing. I would wish to recommend one sport, Dying Mild, released a couple of weeks again. It has an enormous open world, quite a lot of stuff to do and an incredible single participant marketing campaign. It will not be like GTA, however it's a welcome addition to open world games.
Crackdown is one other open-world, third-individual-shooter online game available for Xbox 360. The Crackdown series has two games out there in the sequence, launched in 2007 and 2010. The concept was conceived by the creator behind Grand Theft Auto and Lemmings. Thanks for stopping by; I'm pleased to be taught you enjoyed the article, and found it informative. Scarface is on the market on COMPUTER, PlayStation 2, Xbox, and Wii. There is also a Scarface spin-off titled Scarface: Cash, Power, Respect for the PSP.
Don't fret though! Hotwheels has answered the prayers of collectors who aren't able to get their arms on this one (more on this in the Hotwheels section). The Williams won once more in 1987 with Nelson Piquet in the cockpit however aside from that the decade was dominated by the new McLaren car, first with one other championship victory for Niki Lauda and then a number of for McLaren's new drivers, 'the professor', Alain Prost and the incomparable Ayrton Senna.
Developed by Evolution Studios, Driveclub is another PlayStation 4 video racing recreation but it surely's more straightforward racing than a holistic expertise involving studying to drive, honing abilities, shopping for automobiles, tuning vehicles and sophisticated ratings. In this section we break down each of the layers of the user mannequin—proven in Fig. 1 —and clarify the processes carried out to achieve to a call for each phase.
← Super Smash Flash 2 Characters
eleven Games Like Call Of Responsibility (CoD) →
Varieties Of Online Games For Gaming Fun
Greedy Granny Toy Challenge Game – Warheads Extreme Sour Candy – Family Fun Games
History of Angry Birds (2009-2015) – DOWNLOAD ALL GAMES FOR FREE!


In this provocative debunking of the prevailing beliefs about addiction, psychologist Jeffrey Schaler argues that addiction is not a disease, but a choice in lifestyle.
Schaler refutes the widely held ideas that addiction is involuntary, genetically determined, or a physical or mental illness, offering convincing arguments that "addiction" is a decision made by someone in order to find meaning and purpose in life.
He explains why our public policies, based on the incorrect beliefs that addiction is a disease or involuntary behavior, are ineffective and even encourage addiction by allowing people to feel powerless and demoralized about their ability to break the habit.
Jeffrey A. Schaler was formerly an assistant professor in the School of Public Affairs at the American University.


text:
Q: Showing that every model is infinite Given the theory (set of FOL formulas)
$$ T = \{\forall x_1 \neg Q(x_1,x_1), \forall x_1 \exists x_2 Q(x_1,x_2), \forall x_1 \forall x_2 \forall x_3 (Q(x_1,x_2) \land Q(x_2,x_3)) \to Q(x_1,x_3)\} $$
Show that every model for $T$ is infinite.
I tried to assume that there exists a finite model, but I could not see the contradiction. Any suggestion?


Coached Naz, Seb and Jacek and worked the Rolling Thunder hard (see note).
As per weight is load only. I'm using my older handle as I think it compares the most like the latest version IM have for sale. I know Mark pulled 301lbs on the previous model (and this is quoted as the record on their site) but has pulled 271lbs on the newer one. I (as per YT video) pulled 276lbs on a new one Sam Solomi brought for me to try. No one pulled more than 260 at the most recent event (Vice Grip Viking Challenge at the FitExpo in LA).
B/H: 60-kilos a hand x 6 reps @, 80-kilos a hand x 3 reps @, 100-kilos x 1-2 x 1 rep @ (inc one for publicity photo).
R/H: 122.5-kilos x 4 (may have been 5) x 1 reps. 1 or 2 more singles more than last time.
I'm working this hard 1-2 times a week (I need to watch I do not start stalling as I get to peak strength on this as has happened before) as I am promoting (with a LOT of help from Dennie Felix) and competing in a competition to be held at the NEC/ Bodypower. Supported by Bodypower (I'll be on their site later) and with Ironmind sponsorship. Last year some 25,000 people came through the main doors over the weekend and the strength arena had crowds of at least 1000 most of the day. The event will be open to all (with a limit on numbers of course) and 'joes' have to pull a qualifying poundage. Then they go up against WSM competitors including Mark Felix, Terry Hollands and more. I aim to to VERY well.
Nytol and Jamie555 like this.
A lot of that made no sense to me mate, have you got a link or vid of what you do ?
My best rolling thunder pull was 250lb.
I do enjoy grip contests (won my first one and will be doing another in a few months) its nice to have a different way of testing strenght.
Its great for the public as anyone can have a go and try and lift some weight!
ive just started to get more into grip training. what would you consider to be a solid weight on the rolling thunder?
^Any thing over 200lb is good going!
valkry van mate likes this.
Con's correct and while it might change the current plan is to have the lads qualify with 90-kilos at the NEC.
For my YT videos look up gripperbookguy and you'll see me pull 276 as mentioned.
JW007, CJ and xpower like this.
'T/Grippers' stands for ''Torsion Spring Grippers''. Basically the ones everyone uses but a step up in strength.
'2HP' stands for 2 hand pinch. I'm No 2 in the world with 117.5-kilos at Xmas.


This is the adorable moment a loving pet owner pretends to give his dog ear drops because he is jealous of his friend who actually needs the medication.
Footage shows the gorgeous Labrador waiting patiently as his owner applies medical drops to the other dog and massages her ears.
Not one to be left out, the dog quickly moves into the pup's place after she leaves.
The owner then screws back on the lid and pretends to give him the same drops.
The dog, named Cache, runs off excitedly after his ears are massaged in the same way as the other dog's.
Posting the video on social media, Chloe Copley said: "My dog has ear medicine she needs and the other one also thinks he needs it too.
Another video posted of Cache shows him being handed a toy before walking off, only to rush back and claim the second one too which was offered to another dog.
Twitter went into a meltdown after the adorable footage was posted on Tuesday, with many sharing similar tales of jealousy between their pets.
"We have to take both our cats to the vet at the same time even if only one needs to go. The one left behind always gets upset," one wrote.


View of a portion of the kitchen area of a reconstructed house at Katzrin. On the right side of the image note the small covered bowl that sits atop a stove. The fire to heat the pot was confined to the conical shaped stove on which it sits. Probably brush, small twigs, and dug were used as fuel. Covering the stove and pot (upper right side of image) is the chimney that carried the smoke upward and out of the building.
On the left side of the image, note in the back the water storage jar, the wicker basket, the basalt grinder (with reconstructed handle), and the sieve behind it.
For an additional view of a more primitive grinder Click Here.
To see an "industrial grade" grinder Click Here.
For a brief description and map of Katzrin Click Here.


If you do not configure the individual writers, the sensor-specific configuration will use the default values.
You can choose to use this default configuration by either not creating the Indexing Configuration file or by entering the following in the file. You can name the file anything you like, for example index_config.json, but it must be located at $METRON_HOME/config/zookeeper/indexing.
If a writer configuration is unspecified, then a warning is indicated in the Storm console. For example, WARNING: Default and (likely) unoptimized writer config used for hdfs writer and sensor squid. You can ignore this warning message if you intend to use the default configuration.


text:
Richard Ian Wright (født 5. november 1977) er en engelsk tidligere fodboldspiller (målmand) og målmandstræner. Gennem karrieren spillede han mange år hos Ipswich Town, og var også tilknyttet blandt andet Everton og Arsenal.

Han deltog ved EM i fodbold 2000.

Eksterne henvisninger

Referencer

Fodboldspillere fra England
Fodboldspillere fra Ipswich Town F.C.
Fodboldspillere fra Arsenal F.C.
Fodboldspillere fra Everton F.C.
Fodboldspillere fra West Ham United F.C.
Fodboldspillere fra Sheffield United F.C.
Fodboldspillere fra Preston North End F.C.
Fodboldspillere fra Manchester City F.C.
Personer fra Ipswich

redpajama_set_name: RedPajamaWikipedia


X-kit Achieve! Grade 12 Economics Study Guide | X-Kit Achieve!
Grade 12 learners can use X-kit Achieve! Economics study guide throughout the year to prepare for and pass exams. Concise, step-by-step explanations in plain language and worked examples make learning, understanding and remembering Economics easy. Current examples and case studies illustrate and contextualise Economics concepts, making them accessible to learners. Plenty of exercises, practice exam papers and memos prepare learners for tests and exams.


I've noticed that some games on Steam are even customized for 360 controllers. Mirror's edge for example changes all the button layouts to match a 360 one even in dalogue/tutorial messages. Mirror's edge for example changes all the button layouts to match a 360 one even in dalogue/tutorial messages.
1/08/2018 · Go to the Xbox store on your console and search for the specific game. Once you find the game, scroll to the side and look at the list of add-ons. Once you find the one you want, pay for it and download it. Once you load the game, the DLC content should be available.
You can also press the glowing Xbox logo button in the middle of an Xbox 360 Controller to launch the Big Picture interface if Steam is open. Another Option: In-Home Streaming If you want to leave your PC in one room of your home and play PC games on a TV in a different room, you can consider using local streaming to stream games over your home network from your gaming PC to your television.


text:
'They Feel Like They Can't Go Home'
Ali & Muyi Xiao
In September 2014, while waiting for access to photograph Syrian refugee camps in Jordan, a Chinese photographer who calls himself "Ali" came upon a large group of students from his home country at a local restaurant. He knew that many young Chinese...
Testing the Limits of China's Environmental Law
from chinadialogue
Friends of Nature, a Beijing-based non-governmental organization (NGO), filed two landmark cases against a local Environmental Protection Bureau in Yunnan this year that have revealed the current limits of one of the most hopeful provisions in China...
China's Huge Dam Projects Will Threaten Southeast Asia as Water Scarcity Builds Downstream
Daniel Rechtschaffen
A river is born high in the Tibetan Plateau, before snaking its way 3,000 miles south and emptying itself into the South China Sea.
Scientists Discover Prehistoric Giant Otter Species in China
Merrit Kennedy
Six million years ago, giant otters weighing more than 100 pounds lived among birds and water lilies in the wooded wetlands of China's Yunnan province.
Families, Weddings, and Beekeepers
Ye Ming, Yan Cong & more from Yuanjin Photo
This month's Depth of Field column brings the stories of Chinese adoption; the marriage ceremony of Hu Mingliang and Sun Wenlin, a gay couple who filed the first civil rights marriage lawsuit to be accepted by a Chinese court (they lost); beekeepers...
Married Young
Muyi Xiao from Tencent QQ
In certain parts of Yunnan province, in China's southwest, marriage of boys and girls as young as 13 years old is a common phenomenon, practiced without taboo despite the nation's rule requiring women to be 20 and men 22 before they marry...
Waking the Green Tiger
This documentary—available in full on ChinaFile throughout January courtesy of filmmaker Gary Marcuse—follows a group of environmental activists trying to prevent the construction of dams on the Nu (Salween) and the Upper Yangtze (Jinsha) rivers in...
Nu River Saved, Jack Ma Buys Preservation Land
Michael Zhao
A great piece of news came from China on the night of December 16, that the Yunnan provincial government in southwest China has announced its decision to not develop hydro-electric projects on the Nu River, also known as the Salween (link in Chinese...
Rich Man, Pu'er Man
Christina Larson
"These men always have machetes," shouts the driver. Through trees along an unpaved road, he spots a ramshackle hut, slows down, and warns his passengers: this is a checkpoint. It's the only way to enforce rules in this part of the jungle, at the...
Searching for Identity in China's Outer Lands
Q. Sakamaki & Dave Gershgorn
" 'China's Outer Lands' is about people instinctively looking for their own identity, between conformity or originality or autonomy or dependence," Mr. Sakamaki said. "It's natural, it's happening in not only China, it's everywhere."
Bulldozing the Cadre Who Revamped Kunming
Warm, sunny Kunming brimmed with charm before Communist Party leader Qiu He brought an autocratic style of governance to town and spurred the urbanization campaign that preceded his downfall.Today, this historic city in southwestern China is a...
China's Army in Show of Force Along Myanmar Border After Fatal Bombing
Xin Lin and Wen Yuqing
Tensions rising between Asian neighbors after death of five people in Yunnan.
Qiu He, top Yunnan Official, Ousted for Corrupt Land Deals
East by Southeast
Qiu was the catalyst for a swath of controversial infrastructure projects, including a new international airport finished in 2012.
China Says Thousands Forced to Flee Myanmar Fighting
The Yunnan government said that since Feb. 9 there had been more than 30,000 trips by border residents both into and out of China.
'Where's Our Unity March?' China Wants to Know
Bethany Allen-Ebrahimian & Rachel Lu
The January 7 terrorist attack on satirical French newspaper Charlie Hebdo that left 12 dead has mostly inspired unity in the West, but the massive march held in its aftermath is spurring controversy, and even some disdain, in China. While the...
Seeing China in 2014
David M. Barreda
In 2014, ChinaFile published great original work in photography. As always, we worked to look beyond stereotypical images of the country to find nuanced representations of the new and ChinaFile contributors' commentary on it. Still, many of our...
Kunming Attack Is 'China's 9/11,' State Media Says
In the days after a major terror attack in Kunming, state media outlets are calling for a united front to combat terror and warning against excusing the attackers or criticizing the government's policies on minorities.On the evening of March 1, a...
Life in the Shadow of the Mekong Dams
This is the second in a two-part special report on the resettlement rights of villagers displaced by dams along the Mekong (Lancang) River. Part one is an analysis of how China's resettlement policies are playing out on the ground. Part two, below,...
Why Has Water-Rich Yunnan Become A Drought Hotspot?
Yunnan's drought continues. During China's annual parliamentary session in March, the deputy party secretary of the southwest Chinese province, Qiu He, blamed spring floodwaters that flow through Yunnan and on into other countries for the water...
Writing Yunnan a Rubber Check
Our van stopped at a scenic vista on the contour road where verdant mountains undulated southward toward China's border with Laos. Stepping out to take some photos, I was overcome by an acrid, unpleasant odor. I asked my local travel partner, Xiao...
Living on Dangerous Ground
Fractures had long plagued the rocky mountainside next to Huang Daihong's home. When an earthquake jolted Luozehe County in Yunnan province, Huang watched a large black boulder release a shower of stones that instantly killed her neighbor.The...
Isolated in Yunnan
Since June 2011, an estimated 75,000 ethnic Kachin have hostilities between the Burmese army and the Kachin Independence Army (KIA) in northern Burma. Thousands of them have sought refuge in southwestern China's Yunnan province, where the Chinese...
My Uncle, My Father
Edwin Koo
In Aguwa village, Yunnan province, the Mosuo continue to practice their ancient tradition of matriarchy. Women rule the tightly-knit families as heads of households, while men practice "walking marriages," fathering children whom they seldom help...
Coming to Terms with the Nation
Thomas S. Mullaney
China is a vast nation comprised of hundreds of distinct ethnic communities, each with its own language, history, and culture. Today the government of China recognizes just 56 ethnic nationalities, or minzu, as groups entitled to representation. This controversial new book recounts the history of the most sweeping attempt to sort and categorize the nation's enormous population: the 1954 Ethnic Classification project (minzu shibie). Thomas S. Mullaney draws on recently declassified material and extensive oral histories to describe how the communist government, in power less than a decade, launched this process in ethnically diverse Yunnan. Mullaney shows how the government drew on Republican-era scholarship for conceptual and methodological inspiration as it developed a strategy for identifying minzu and how non-Party-member Chinese ethnologists produced a "scientific" survey that would become the basis for a policy on nationalities. —University of California Press


text:
layout: post
title: Tweets
date: 2020-10-14
summary: These are the tweets for October 14, 2020.
categories:
---

redpajama_set_name: RedPajamaGithub


Feasibility, Sustainability and Reliability assessment specialists, we provide complex solutions for your project.
There is always a way. We are here to help you find it.
Why Can You Help Me?
We specialize in Six Sigma for services with a focus on feasibility, sustainability, and reliability. Whether you are wanting to improve a process/project or start a new one, we can help by providing you with a single point of contact regardless of your project's size or scope.
The majority of the time we focus on process improvement, though our customers' needs often drive us into other areas such as project management and audit preparation. You could say that we specialize in getting things done, regardless of the field. Consider us your "go to" when things get tough.
The tone and layout of this site may be a little different than you are used to seeing. We operate as a small company with a large network of outside partners so we tend to move from "I" to "we" in descriptions based on how we would handle the situation. Our site is ever-changing so please excuse the mess.
Feel free to browse a bit and get to know us. Services are on the tabs in the header above, read about us here or check out our blog.


GREAT MILES 63,201! Leather, Moonroof, Bluetooth, iPod/MP3 Input, Dual Zone A/C, CD Player, Turbo Charged Engine, Aluminum Wheels READ MORE!
Leather Seats, Sunroof, All Wheel Drive, Turbocharged, Satellite Radio, iPod/MP3 Input, Bluetooth, CD Player, Aluminum Wheels, Dual Zone A/C. Rear Spoiler, MP3 Player, Remote Trunk Release, Keyless Entry, Child Safety Locks.
CarAndDriver.com's review says "Svelte and swoopy, the latest S60 is an eye-pleaser that makes the world forget Volvo's boxy sedans of yesteryear.".


An microSD card that is at least 4GB.
A USB to serial adapter.
A 5 VDC power supply.
A serial adapter. It would be the best if you get it from Toradex since it needs a correct header to connect to the serial ports on the Ixora module.
All parts are properly installed.
apalis-imx6_bin contains the kernel image uImage as well as the image files for flashing purposes.
imx_flash contains custom scripts from Toradex for flashing iMX modules.
rootfs contains all the ISOBlue files that would be flashed onto the flash memory.
After the script finishes, you will have a flashable microSD card.
Connect the serial adapter to the corresponding serial header (X22) on Ixora board. Bring up your favoriate serial terminal.
Insert the flashable microSD card you have prepared to SD card slot (X19).
Connect the power supply to the Ixora board.
Apply power and hit any key to stop autobooting.
After interrupting the boot sequence, you will be put into U-Boot command line.
If the flashing is successful, the device will automatically boot into the ISOBlue image. Don't turn it off or disconnect anything yet. Please proceed to Setting It Up to configure the newly flashed ISOBlue 2.0.
You can also take a look at Toradex's instructions for flashing an image as this documentaion is referenced heavily upon this resource.


text:
Boca Raton Bowl Picks: UCF vs. BYU
by Dan Jamison | Dec 20, 2020 | cfb
Central Florida Knights (6-3 SU, 3-6 ATS) vs. Brigham Young Cougars (10-1 SU, 6-4 ATS)
When: Tuesday, December 22, 7 p.m.
Where: FAU Stadium, Boca Raton, Fla.
TV: ESPN
Point Spread: UCF +3.5/BYU -3.5 (GTBets - Deposit $100, get $100 FREE! Receive a 100% REAL CASH bonus all the way up to $500!)
Total: O/U 69.5
It's almost criminal that these two teams have to settle for Boca Raton, but it means we get what should be a quality matchup early in the bowl season. BYU looks like it's the best team in the western United States in 2020, as it's beaten everyone on its schedule except for an undefeated Coastal Carolina in a game that saw the Cougars travel to South Carolina on short notice and nearly pull out a victory.
Opposing the Cougars is a UCF squad that's put up video game numbers all season long. Only one team has held the Knights under 30 points all season, which is why all but one UCF game has seen at least 60 points scored. But this offensive juggernaut hasn't seen a defense like BYU's, which has only conceded an average of 14.6 points per game and hasn't allowed anyone to top 26 points all season. Can the Cougars shut down the Knights and cap off a fantastic season, or will the old guard of the mid-majors rise up for one last stand?
How the Public is Betting the UCF/BYU Game
The money really seems to believe in the BYU defense, as it's dropped the total five points from the opening of 74.5. Public figures aren't available yet, but the money has pushed the number down from -4 to -3.5 for the Cougars.
Injury Concerns
UCF:
Defensive back Antwan Collier (personal), defensive lineman Kenny Turnier (personal), linebacker Eric Mitchell (personal), defensive lineman Randy Charlton (undisclosed), and running back Otis Anderson (undisclosed) are questionable. Wide receiver Marlon Williams opted out of the bowl game.
BYU:
Wide receiver Keanu Hill (undisclosed) and defensive back Keenan Ellis (undisclosed) are questionable. Wide receiver Gunner Romney (head) and running back Tyler Allgeier (illness) are probable. Offensive lineman Keanu Saleapaga (shoulder) and defensive lineman Tyler Batty (leg) are out indefinitely.
When UCF Has the Ball
Here's how much respect the Cougars have for the Knights' offense: BYU's coaches are already telling their players that they're going to need to score a lot of points if they're going to win this game. That's how explosive the Knights have been all season, and it's in large part because they play so fast that opponents barely have time to breathe before UCF is already on to its next play. When you've got a quarterback like Dillon Gabriel under center, you can do whatever you want on offense, and for UCF, that's meant either finding their stable of wide receivers or letting their talented backs poke holes in the front seven.
Marlon Williams and Jaylon Robinson have done the most damage of the Knights' weapons, as the two have combined for 1,974 receiving yards and 15 of Gabriel's 30 touchdown passes on the year. Meanwhile, Greg McCrae and Otis Anderson average over five yards a carry, which keeps opponents from dropping eight into coverage against the UCF passing attack. Throw in that Gabriel can make plays with his legs when he has to and that he's only thrown four interceptions on the year, and it's easy to see why opponents have had so much trouble stopping the Knights.
This is an offense that can score from anywhere on the field, which means that no lead is safe against this team. However, with Williams not on the field for this game, the Knights might be a little less explosive and might have trouble with this BYU defense.
When BYU Has the Ball
The biggest question for the Cougars is whether they're going to show up, after their complete no-show cost them their bowl game against Hawai'i last year. If they do show up, they'll provide a sharp contrast with UCF, as the Cougars are more comfortable relying on a couple of key weapons and letting their defense do the rest. Tyler Allgeier is the primary back for BYU with 957 yards on the season, and he's got the ability to change the game at any point in the contest. Given that UCF gives up 190 yards a game on the ground, he could be in line for a big game here, assuming that he plays.
So could Dax Milne, who should benefit from the likely return of Gunner Romney to the lineup. With Romney on the field, it's going to be a lot harder for UCF to focus on Milne, who's got 1,118 receiving yards to his name and has been tough to stop all season long. But when it comes to matchup nightmares, nobody's been able to match up with 6'6" tight end Isaac Rex. The freshman has 32 catches on the season, but 10 of them have gone for touchdowns.
Betting Trends
UCF has been a rather lousy choice for bettors as of late, as the Knights' reputation leads to the public tending to give them more points than they should. However, in the only game all year where the Knights were the underdog, they managed to cover — albeit only because Cincinnati decided not to score when it got the ball down to the Knights' 1-yard-line in a game the Bearcats led by 3 with a four-point spread.
BYU has also been struggling to cover as of late, as the Cougars have failed to hit the number in three of their past five contests (and one was against FCS North Alabama, so there was no spread in that game.) That's mainly because the public has gradually accepted the Cougars as a powerful squad this season, and BYU has faced a couple of slower-paced teams in its past two games. That's also why both of those games went under; BYU simply didn't have enough plays to put up points. That won't be a problem against UCF.
The day will be a great one for football, with temperatures at around 63 degrees and winds blowing north-northeast at seven miles an hour.
With Williams opting out of the game, UCF's offense has taken a significant hit. A team that's this offense-heavy can't afford to lose its best receiver, especially when it's going against the toughest defense that it's seen all season long. Even with three weeks to prepare, this is almost certain to throw UCF off of its game and play right into BYU's hands.
I can't see UCF stopping this attack, nor can I see the Knights being as explosive as they were all season. Unless the motivation isn't there for the Cougars, this should be BYU's game, and I think BYU feels like it has something to prove after its loss to Coastal Carolina. Give me the Cougars. Bet your UCF/BYU pick LIVE while the game is going on at the online sportsbook with the BEST in-game wagering platform on the planet! —> Bovada Sportsbook!
College Football Playoff Championship Game Picks
Orange Bowl Picks: Texas A&M vs. North Carolina
Gator Bowl Picks: NC State vs. Kentucky
Sugar Bowl Picks: Ohio State vs. Clemson
Texas Bowl Pick: Arkansas vs. TCU


text:
package com.sequenceiq.cloudbreak.core.flow2.cluster.stopstartus;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyCollection;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNotNull;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.statemachine.action.Action;
import org.springframework.test.util.ReflectionTestUtils;

import com.sequenceiq.cloudbreak.api.endpoint.v4.common.DetailedStackStatus;
import com.sequenceiq.cloudbreak.api.endpoint.v4.stacks.base.InstanceStatus;
import com.sequenceiq.cloudbreak.cloud.context.CloudContext;
import com.sequenceiq.cloudbreak.cloud.event.instance.StopStartUpscaleGetRecoveryCandidatesRequest;
import com.sequenceiq.cloudbreak.cloud.event.instance.StopStartUpscaleGetRecoveryCandidatesResult;
import com.sequenceiq.cloudbreak.cloud.event.instance.StopStartUpscaleStartInstancesRequest;
import com.sequenceiq.cloudbreak.cloud.event.instance.StopStartUpscaleStartInstancesResult;
import com.sequenceiq.cloudbreak.cloud.model.CloudCredential;
import com.sequenceiq.cloudbreak.cloud.model.CloudInstance;
import com.sequenceiq.cloudbreak.cloud.model.CloudStack;
import com.sequenceiq.cloudbreak.cloud.model.CloudVmInstanceStatus;
import com.sequenceiq.cloudbreak.common.metrics.MetricService;
import com.sequenceiq.cloudbreak.common.type.ClusterManagerType;
import com.sequenceiq.cloudbreak.converter.CloudInstanceIdToInstanceMetaDataConverter;
import com.sequenceiq.cloudbreak.converter.spi.InstanceMetaDataToCloudInstanceConverter;
import com.sequenceiq.cloudbreak.core.flow2.cluster.stopstartus.StopStartUpscaleActions.AbstractStopStartUpscaleActions;
import com.sequenceiq.cloudbreak.core.flow2.event.StopStartUpscaleTriggerEvent;
import com.sequenceiq.cloudbreak.core.flow2.stack.AbstractStackFailureAction;
import com.sequenceiq.cloudbreak.core.flow2.stack.StackFailureContext;
import com.sequenceiq.cloudbreak.domain.StackAuthentication;
import com.sequenceiq.cloudbreak.domain.stack.Stack;
import com.sequenceiq.cloudbreak.domain.stack.instance.InstanceGroup;
import com.sequenceiq.cloudbreak.domain.stack.instance.InstanceMetaData;
import com.sequenceiq.cloudbreak.eventbus.Event;
import com.sequenceiq.cloudbreak.eventbus.EventBus;
import com.sequenceiq.cloudbreak.reactor.api.event.StackEvent;
import com.sequenceiq.cloudbreak.reactor.api.event.StackFailureEvent;
import com.sequenceiq.cloudbreak.reactor.api.event.cluster.StopStartUpscaleCommissionViaCMRequest;
import com.sequenceiq.cloudbreak.reactor.api.event.orchestration.StopStartUpscaleCommissionViaCMResult;
import com.sequenceiq.cloudbreak.service.metrics.CloudbreakMetricService;
import com.sequenceiq.cloudbreak.service.stack.InstanceMetaDataService;
import com.sequenceiq.cloudbreak.view.InstanceMetadataView;
import com.sequenceiq.flow.core.AbstractActionTestSupport;
import com.sequenceiq.flow.core.FlowParameters;
import com.sequenceiq.flow.core.FlowRegister;
import com.sequenceiq.flow.reactor.ErrorHandlerAwareReactorEventFactory;

@ExtendWith(MockitoExtension.class)
public class StopStartUpscaleActionsTest {

    private static final String INSTANCE_GROUP_NAME_ACTIONABLE = "compute";

    private static final String INSTANCE_GROUP_NAME_RANDOM = "other";

    private static final String SELECTOR = "dontcareforthistest";

    private static final Long STACK_ID = 100L;

    private static final String INSTANCE_ID_PREFIX = "i-";

    private static final String ENV_CRN = "envCrn";

    @Mock
    private StopStartUpscaleFlowService stopStartUpscaleFlowService;

    @Mock
    private InstanceMetaDataToCloudInstanceConverter instanceMetaDataToCloudInstanceConverter;

    @Mock
    private InstanceMetaDataService instanceMetaDataService;

    @Mock
    private CloudInstanceIdToInstanceMetaDataConverter cloudInstanceIdToInstanceMetaDataConverter;

    @InjectMocks
    private StopStartUpscaleActions underTest;

    @Mock
    private FlowParameters flowParameters;

    @Mock
    private Stack stack;

    @Mock
    private CloudContext cloudContext;

    @Mock
    private CloudCredential cloudCredential;

    @Mock
    private CloudStack cloudStack;

    @Mock
    private StackAuthentication stackAuthentication;

    @Mock
    private FlowRegister runningFlows;

    @Mock
    private EventBus eventBus;

    @Mock
    private ErrorHandlerAwareReactorEventFactory reactorEventFactory;

    @Mock
    private Event<Object> event;

    @Mock
    private CloudbreakMetricService metricService;

    @Test
    void testGetRecoveryCandidatesAction() throws Exception {
        AbstractStopStartUpscaleActions<StopStartUpscaleTriggerEvent> action =
                (AbstractStopStartUpscaleActions<StopStartUpscaleTriggerEvent>) underTest.getRecoveryCandidatesAction();
        initActionPrivateFields(action);

        StopStartUpscaleContext context = createContext(5);

        StopStartUpscaleTriggerEvent request = new StopStartUpscaleTriggerEvent(SELECTOR, STACK_ID, INSTANCE_GROUP_NAME_ACTIONABLE, 5,
                ClusterManagerType.CLOUDERA_MANAGER, Boolean.TRUE);

        List<InstanceMetadataView> instancesActionableNotStopped =
                generateInstances(5, 100, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesActionableStopped =
                generateInstances(10, 200, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesRandomNotStopped =
                generateInstances(3, 300, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_RANDOM);
        List<InstanceMetadataView> instancesRandomStopped =
                generateInstances(8, 400, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_RANDOM);

        mockStackEtc(instancesActionableNotStopped, instancesActionableStopped, instancesRandomNotStopped, instancesRandomStopped);
        when(reactorEventFactory.createEvent(anyMap(), isNotNull())).thenReturn(event);

        new AbstractActionTestSupport<>(action).doExecute(context, request, Collections.emptyMap());

        verify(stopStartUpscaleFlowService).initScaleUp(eq(STACK_ID), eq(INSTANCE_GROUP_NAME_ACTIONABLE));
        ArgumentCaptor<Object> captor = ArgumentCaptor.forClass(Object.class);
        verify(reactorEventFactory).createEvent(anyMap(), captor.capture());
        verify(eventBus).notify("STOPSTARTUPSCALEGETRECOVERYCANDIDATESREQUEST", event);
        assertThat(captor.getValue()).isInstanceOf(StopStartUpscaleGetRecoveryCandidatesRequest.class);

        StopStartUpscaleGetRecoveryCandidatesRequest req = (StopStartUpscaleGetRecoveryCandidatesRequest) captor.getValue();
        assertThat(req.getAdjustment()).isEqualTo(5);
        assertThat(req.getHostGroupName()).isEqualTo(INSTANCE_GROUP_NAME_ACTIONABLE);
        assertThat(req.getAllInstancesInHostGroup()).hasSameElementsAs(convertToCloudInstance(Stream.of(instancesActionableStopped,
                        instancesActionableNotStopped).flatMap(Collection::stream).collect(Collectors.toList())));
    }

    @Test
    void testStartInstancesAction() throws Exception {
        AbstractStopStartUpscaleActions<StopStartUpscaleGetRecoveryCandidatesResult> action =
                (AbstractStopStartUpscaleActions<StopStartUpscaleGetRecoveryCandidatesResult>) underTest.startInstancesAction();
        initActionPrivateFields(action);

        StopStartUpscaleContext stopStartUpscaleContext = createContext(5);

        List<InstanceMetadataView> instancesActionableNotStopped =
                generateInstances(5, 100, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesActionableStopped =
                generateInstances(10, 200, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesRandomNotStopped =
                generateInstances(3, 300, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_RANDOM);
        List<InstanceMetadataView> instancesRandomStopped =
                generateInstances(8, 400, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_RANDOM);

        List<InstanceMetadataView> actionable = Stream.of(instancesActionableNotStopped, instancesActionableStopped)
                .flatMap(Collection::stream).collect(Collectors.toList());
        List<CloudInstance> actionableCloudInstances = convertToCloudInstance(actionable);
        StopStartUpscaleGetRecoveryCandidatesRequest request = new StopStartUpscaleGetRecoveryCandidatesRequest(cloudContext, cloudCredential,
                cloudStack, INSTANCE_GROUP_NAME_ACTIONABLE, 5, actionableCloudInstances, Boolean.TRUE);
        StopStartUpscaleGetRecoveryCandidatesResult payload = new StopStartUpscaleGetRecoveryCandidatesResult(STACK_ID, request,
                Collections.emptyList(), 5, INSTANCE_GROUP_NAME_ACTIONABLE);

        // Mocks
        mockStackEtc(instancesActionableNotStopped, instancesActionableStopped, instancesRandomNotStopped, instancesRandomStopped);
        when(reactorEventFactory.createEvent(anyMap(), isNotNull())).thenReturn(event);

        new AbstractActionTestSupport<>(action).doExecute(stopStartUpscaleContext, payload, Collections.emptyMap());

        verify(stopStartUpscaleFlowService).startingInstances(eq(STACK_ID), eq(INSTANCE_GROUP_NAME_ACTIONABLE), eq(5), anyList());
        ArgumentCaptor<Object> argumentCaptor = ArgumentCaptor.forClass(Object.class);
        verify(reactorEventFactory).createEvent(anyMap(), argumentCaptor.capture());
        verify(eventBus).notify("STOPSTARTUPSCALESTARTINSTANCESREQUEST", event);
        assertThat(argumentCaptor.getValue()).isInstanceOf(StopStartUpscaleStartInstancesRequest.class);

        verify(instanceMetaDataToCloudInstanceConverter, times(2)).convert(anyCollection(), any());

        StopStartUpscaleStartInstancesRequest req = (StopStartUpscaleStartInstancesRequest) argumentCaptor.getValue();

        Assert.assertEquals(15, req.getAllInstancesInHg().size());
        Assert.assertEquals(10, req.getStoppedCloudInstancesInHg().size());
    }

    @Test
    void testStartInstancesActionWithRecoveryCandidates() throws Exception {
        AbstractStopStartUpscaleActions<StopStartUpscaleGetRecoveryCandidatesResult> action =
                (AbstractStopStartUpscaleActions<StopStartUpscaleGetRecoveryCandidatesResult>) underTest.startInstancesAction();
        initActionPrivateFields(action);

        List<InstanceMetadataView> instancesActionableNotStopped =
                generateInstances(5, 100, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesActionableStopped =
                generateInstances(10, 200, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesActionableRecoveryCandidates =
                generateInstances(3, 200, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesRandomNotStopped =
                generateInstances(3, 300, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_RANDOM);
        List<InstanceMetadataView> instancesRandomStopped =
                generateInstances(8, 400, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_RANDOM);

        StopStartUpscaleContext context = createContext(5);

        List<InstanceMetadataView> actionable = Stream.of(instancesActionableNotStopped, instancesActionableStopped, instancesActionableRecoveryCandidates)
                .flatMap(Collection::stream).collect(Collectors.toList());
        List<CloudInstance> actionableCloudInstances = convertToCloudInstance(actionable);
        StopStartUpscaleGetRecoveryCandidatesRequest request = new StopStartUpscaleGetRecoveryCandidatesRequest(cloudContext, cloudCredential,
                cloudStack, INSTANCE_GROUP_NAME_ACTIONABLE, 5, actionableCloudInstances, Boolean.TRUE);
        StopStartUpscaleGetRecoveryCandidatesResult payload = new StopStartUpscaleGetRecoveryCandidatesResult(STACK_ID, request,
                convertToCloudInstance(instancesActionableRecoveryCandidates), 5, INSTANCE_GROUP_NAME_ACTIONABLE);

        mockStackEtc(instancesActionableNotStopped, instancesActionableStopped, instancesRandomNotStopped, instancesRandomStopped);
        when(reactorEventFactory.createEvent(anyMap(), isNotNull())).thenReturn(event);

        new AbstractActionTestSupport<>(action).doExecute(context, payload, Collections.emptyMap());

        // Math.max(payload.getAdjustment() - instancesActionableRecoveryCandidates.size(), 0) = 2
        verify(stopStartUpscaleFlowService).startingInstances(eq(STACK_ID), eq(INSTANCE_GROUP_NAME_ACTIONABLE), eq(2), anyList());
        ArgumentCaptor<Object> argumentCaptor = ArgumentCaptor.forClass(Object.class);
        verify(reactorEventFactory).createEvent(anyMap(), argumentCaptor.capture());
        verify(eventBus).notify("STOPSTARTUPSCALESTARTINSTANCESREQUEST", event);
        assertThat(argumentCaptor.getValue()).isInstanceOf(StopStartUpscaleStartInstancesRequest.class);

        verify(instanceMetaDataToCloudInstanceConverter, times(2)).convert(anyCollection(), any());

        StopStartUpscaleStartInstancesRequest req = (StopStartUpscaleStartInstancesRequest) argumentCaptor.getValue();

        assertThat(req.getAllInstancesInHg()).hasSameElementsAs(actionableCloudInstances);
        assertThat(req.getNumInstancesToStart()).isEqualTo(5);
        assertThat(req.getHostGroupName()).isEqualTo(INSTANCE_GROUP_NAME_ACTIONABLE);
        assertThat(req.getStartedInstancesWithServicesNotRunning()).hasSameElementsAs(convertToCloudInstance(instancesActionableRecoveryCandidates));
        assertThat(req.getStoppedCloudInstancesInHg()).hasSameElementsAs(convertToCloudInstance(instancesActionableStopped));
    }

    @Test
    void testCmCommissionAction() throws Exception {
        // Simple scenario. Adequate instances. Everything started etc.
        AbstractStopStartUpscaleActions<StopStartUpscaleStartInstancesResult> action =
                (AbstractStopStartUpscaleActions<StopStartUpscaleStartInstancesResult>) underTest.cmCommissionAction();
        initActionPrivateFields(action);

        int adjustment = 5;

        StopStartUpscaleContext stopStartUpscaleContext = createContext(adjustment);

        List<InstanceMetadataView> instancesActionableNotStopped =
                generateInstances(5, 100, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesActionableStopped =
                generateInstances(10, 200, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesRandomNotStopped =
                generateInstances(3, 300, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_RANDOM);
        List<InstanceMetadataView> instancesRandomStopped =
                generateInstances(8, 400, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_RANDOM);

        List<InstanceMetadataView> allInstancesInHgMdList = new LinkedList<>();
        allInstancesInHgMdList.addAll(instancesActionableStopped);
        allInstancesInHgMdList.addAll(instancesActionableNotStopped);

        List<CloudInstance> stoppedInstancesInHgList = convertToCloudInstance(instancesActionableStopped);
        List<CloudInstance> allInstancesInHgList = convertToCloudInstance(allInstancesInHgMdList);

        StopStartUpscaleStartInstancesRequest startInstancesRequest =
                new StopStartUpscaleStartInstancesRequest(cloudContext, cloudCredential, cloudStack, INSTANCE_GROUP_NAME_ACTIONABLE,
                        stoppedInstancesInHgList, allInstancesInHgList, Collections.emptyList(), stopStartUpscaleContext.getAdjustment());

        List<CloudVmInstanceStatus> affectedInstances = constructStartedCloudVmInstanceStatus(stoppedInstancesInHgList, adjustment);

        StopStartUpscaleStartInstancesResult payload = new StopStartUpscaleStartInstancesResult(STACK_ID, startInstancesRequest, affectedInstances);

        // Mocks
        mockStackEtc(instancesActionableNotStopped, instancesActionableStopped, instancesRandomNotStopped, instancesRandomStopped);
        when(reactorEventFactory.createEvent(anyMap(), isNotNull())).thenReturn(event);

        new AbstractActionTestSupport<>(action).doExecute(stopStartUpscaleContext, payload, Collections.emptyMap());

        ArgumentCaptor<List> instancesCaptor = ArgumentCaptor.forClass(List.class);
        verify(stopStartUpscaleFlowService).instancesStarted(eq(STACK_ID), instancesCaptor.capture(), anyList());
        Assert.assertEquals(adjustment, instancesCaptor.getValue().size());
        verify(stopStartUpscaleFlowService).upscaleCommissioningNodes(eq(STACK_ID), eq(INSTANCE_GROUP_NAME_ACTIONABLE),
                instancesCaptor.capture(), eq(Collections.emptyList()));
        Assert.assertEquals(adjustment, instancesCaptor.getValue().size());
        verifyNoMoreInteractions(stopStartUpscaleFlowService);
        ArgumentCaptor<Object> argumentCaptor = ArgumentCaptor.forClass(Object.class);
        verify(reactorEventFactory).createEvent(anyMap(), argumentCaptor.capture());
        verify(eventBus).notify("STOPSTARTUPSCALECOMMISSIONVIACMREQUEST", event);
        assertThat(argumentCaptor.getValue()).isInstanceOf(StopStartUpscaleCommissionViaCMRequest.class);

        StopStartUpscaleCommissionViaCMRequest req = (StopStartUpscaleCommissionViaCMRequest) argumentCaptor.getValue();
        Assert.assertEquals(adjustment, req.getStartedInstancesToCommission().size());
    }

    @Test
    void testUpscaleFailedAction() throws Exception {
        AbstractStackFailureAction<StopStartUpscaleState, StopStartUpscaleEvent> action =
                (AbstractStackFailureAction<StopStartUpscaleState, StopStartUpscaleEvent>) underTest.clusterUpscaleFailedAction();
        initActionPrivateFields(action);

        StackFailureContext stackFailureContext = new StackFailureContext(flowParameters, stack, STACK_ID);
        Exception exception = new Exception("FailedStart");
        StackFailureEvent stackFailureEvent = new StackFailureEvent(STACK_ID, exception);

        List<InstanceMetadataView> instancesActionableNotStopped =
                generateInstances(5, 100, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesActionableStopped =
                generateInstances(10, 200, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesRandomNotStopped =
                generateInstances(3, 300, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_RANDOM);
        List<InstanceMetadataView> instancesRandomStopped =
                generateInstances(8, 400, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_RANDOM);
        // Mocks
        mockStackEtc(instancesActionableNotStopped, instancesActionableStopped, instancesRandomNotStopped, instancesRandomStopped);
        when(reactorEventFactory.createEvent(anyMap(), isNotNull())).thenReturn(event);

        new AbstractActionTestSupport<>(action).doExecute(stackFailureContext, stackFailureEvent, Collections.emptyMap());

        verify(stopStartUpscaleFlowService).clusterUpscaleFailed(eq(STACK_ID), eq(exception));
        ArgumentCaptor<Object> argumentCaptor = ArgumentCaptor.forClass(Object.class);
        verify(reactorEventFactory).createEvent(anyMap(), argumentCaptor.capture());
        verify(eventBus).notify("STOPSTART_UPSCALE_FAIL_HANDLED_EVENT", event);
        assertThat(argumentCaptor.getValue()).isInstanceOf(StackEvent.class);
    }

    @Test
    void testCmCommissionAction2() throws Exception {
        // All instances didn't start from the previous step.
        AbstractStopStartUpscaleActions<StopStartUpscaleStartInstancesResult> action =
                (AbstractStopStartUpscaleActions<StopStartUpscaleStartInstancesResult>) underTest.cmCommissionAction();
        initActionPrivateFields(action);

        int adjustment = 5;

        StopStartUpscaleContext stopStartUpscaleContext = createContext(adjustment);

        List<InstanceMetadataView> instancesActionableNotStopped =
                generateInstances(5, 100, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesActionableStopped =
                generateInstances(10, 200, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesRandomNotStopped =
                generateInstances(3, 300, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_RANDOM);
        List<InstanceMetadataView> instancesRandomStopped =
                generateInstances(8, 400, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_RANDOM);

        List<InstanceMetadataView> allInstancesInHgMdList = new LinkedList<>();
        allInstancesInHgMdList.addAll(instancesActionableStopped);
        allInstancesInHgMdList.addAll(instancesActionableNotStopped);

        List<CloudInstance> stoppedInstancesInHgList = convertToCloudInstance(instancesActionableStopped);
        List<CloudInstance> allInstancesInHgList = convertToCloudInstance(allInstancesInHgMdList);

        StopStartUpscaleStartInstancesRequest startInstancesRequest =
                new StopStartUpscaleStartInstancesRequest(cloudContext, cloudCredential, cloudStack, INSTANCE_GROUP_NAME_ACTIONABLE,
                        stoppedInstancesInHgList, allInstancesInHgList, Collections.emptyList(), stopStartUpscaleContext.getAdjustment());

        List<CloudVmInstanceStatus> affectedInstances = constructVmInstanceStatusWithTerminated(stoppedInstancesInHgList, adjustment, 2);
        int expectedCount = adjustment - 2;

        StopStartUpscaleStartInstancesResult payload = new StopStartUpscaleStartInstancesResult(STACK_ID, startInstancesRequest, affectedInstances);

        // Mocks
        mockStackEtc(instancesActionableNotStopped, instancesActionableStopped, instancesRandomNotStopped, instancesRandomStopped);
        when(reactorEventFactory.createEvent(anyMap(), isNotNull())).thenReturn(event);

        new AbstractActionTestSupport<>(action).doExecute(stopStartUpscaleContext, payload, Collections.emptyMap());

        ArgumentCaptor<List> instancesCaptor = ArgumentCaptor.forClass(List.class);
        verify(stopStartUpscaleFlowService).instancesStarted(eq(STACK_ID), instancesCaptor.capture(), anyList());
        Assert.assertEquals(expectedCount, instancesCaptor.getValue().size());
        verify(stopStartUpscaleFlowService).logInstancesFailedToStart(eq(STACK_ID), instancesCaptor.capture());
        Assert.assertEquals(2, instancesCaptor.getValue().size());
        verify(stopStartUpscaleFlowService).warnNotEnoughInstances(eq(STACK_ID), eq(INSTANCE_GROUP_NAME_ACTIONABLE), eq(adjustment), eq(expectedCount));
        verify(stopStartUpscaleFlowService).upscaleCommissioningNodes(eq(STACK_ID), eq(INSTANCE_GROUP_NAME_ACTIONABLE),
                instancesCaptor.capture(), eq(Collections.emptyList()));
        Assert.assertEquals(expectedCount, instancesCaptor.getValue().size());
        verifyNoMoreInteractions(stopStartUpscaleFlowService);
        ArgumentCaptor<Object> argumentCaptor = ArgumentCaptor.forClass(Object.class);
        verify(reactorEventFactory).createEvent(anyMap(), argumentCaptor.capture());
        verify(eventBus).notify("STOPSTARTUPSCALECOMMISSIONVIACMREQUEST", event);
        assertThat(argumentCaptor.getValue()).isInstanceOf(StopStartUpscaleCommissionViaCMRequest.class);

        StopStartUpscaleCommissionViaCMRequest req = (StopStartUpscaleCommissionViaCMRequest) argumentCaptor.getValue();
        Assert.assertEquals(expectedCount, req.getStartedInstancesToCommission().size());
    }

    @Test
    void testUpscaleFinishedAction1() throws Exception {
        // All started.
        AbstractStopStartUpscaleActions<StopStartUpscaleCommissionViaCMResult> action
                = (AbstractStopStartUpscaleActions<StopStartUpscaleCommissionViaCMResult>) underTest.upscaleFinishedAction();
        initActionPrivateFields(action);

        int adjustment = 10;

        StopStartUpscaleContext stopStartUpscaleContext = createContext(adjustment);

        List<InstanceMetadataView> instancesActionableNotStopped =
                generateInstances(5, 100, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesActionableStopped =
                generateInstances(10, 200, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesRandomNotStopped =
                generateInstances(3, 300, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_RANDOM);
        List<InstanceMetadataView> instancesRandomStopped =
                generateInstances(8, 400, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_RANDOM);

        List<InstanceMetadataView> startedInstances = new ArrayList<>(instancesActionableStopped.subList(0, adjustment));

        StopStartUpscaleCommissionViaCMRequest request =
                new StopStartUpscaleCommissionViaCMRequest(1L, INSTANCE_GROUP_NAME_ACTIONABLE, startedInstances, Collections.emptyList());
        Set<String> successfullyCommissionedFqdns = startedInstances.stream().map(i -> i.getDiscoveryFQDN()).collect(Collectors.toUnmodifiableSet());
        StopStartUpscaleCommissionViaCMResult payload =
                new StopStartUpscaleCommissionViaCMResult(request, successfullyCommissionedFqdns, Collections.emptyList());

        // Mocks
        mockStackEtc(instancesActionableNotStopped, instancesActionableStopped, instancesRandomNotStopped, instancesRandomStopped);
        when(reactorEventFactory.createEvent(anyMap(), isNotNull())).thenReturn(event);

        new AbstractActionTestSupport<>(action).doExecute(stopStartUpscaleContext, payload, Collections.emptyMap());

        verify(stopStartUpscaleFlowService).clusterUpscaleFinished(
                any(), eq(INSTANCE_GROUP_NAME_ACTIONABLE), eq(startedInstances), eq(DetailedStackStatus.AVAILABLE));
        ArgumentCaptor<Object> argumentCaptor = ArgumentCaptor.forClass(Object.class);
        verify(reactorEventFactory).createEvent(anyMap(), argumentCaptor.capture());
        verify(eventBus).notify("STOPSTART_UPSCALE_FINALIZED_EVENT", event);
        assertThat(argumentCaptor.getValue()).isInstanceOf(StopStartUpscaleCommissionViaCMResult.class);
    }

    @Test
    void testUpscaleFinishedAction2() throws Exception {
        // Some did not commission.
        AbstractStopStartUpscaleActions<StopStartUpscaleCommissionViaCMResult> action =
                (AbstractStopStartUpscaleActions<StopStartUpscaleCommissionViaCMResult>) underTest.upscaleFinishedAction();
        initActionPrivateFields(action);

        int adjustment = 5;

        StopStartUpscaleContext stopStartUpscaleContext = createContext(adjustment);

        List<InstanceMetadataView> instancesActionableNotStopped =
                generateInstances(5, 100, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesActionableStopped =
                generateInstances(10, 200, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_ACTIONABLE);
        List<InstanceMetadataView> instancesRandomNotStopped =
                generateInstances(3, 300, InstanceStatus.SERVICES_HEALTHY, INSTANCE_GROUP_NAME_RANDOM);
        List<InstanceMetadataView> instancesRandomStopped =
                generateInstances(8, 400, InstanceStatus.STOPPED, INSTANCE_GROUP_NAME_RANDOM);

        List<InstanceMetadataView> startedInstances = new ArrayList<>(instancesActionableStopped.subList(0, adjustment - 2));
        List<InstanceMetadataView> notCommissioned = instancesActionableStopped.subList(adjustment - 2, adjustment);
        List<String> notCommissionedFqdns = notCommissioned.stream().map(x -> x.getDiscoveryFQDN()).collect(Collectors.toList());

        StopStartUpscaleCommissionViaCMRequest request =
                new StopStartUpscaleCommissionViaCMRequest(1L, INSTANCE_GROUP_NAME_ACTIONABLE, startedInstances, new ArrayList<>(notCommissioned));
        Set<String> successfullyCommissionedFqdns = startedInstances.stream().map(i -> i.getDiscoveryFQDN()).collect(Collectors.toUnmodifiableSet());
        StopStartUpscaleCommissionViaCMResult payload = new StopStartUpscaleCommissionViaCMResult(request, successfullyCommissionedFqdns, notCommissionedFqdns);

        // Mocks
        mockStackEtc(instancesActionableNotStopped, instancesActionableStopped, instancesRandomNotStopped, instancesRandomStopped);
        when(reactorEventFactory.createEvent(anyMap(), isNotNull())).thenReturn(event);

        new AbstractActionTestSupport<>(action).doExecute(stopStartUpscaleContext, payload, Collections.emptyMap());

        verify(stopStartUpscaleFlowService).logInstancesFailedToCommission(eq(STACK_ID), eq(notCommissionedFqdns));
        verify(stopStartUpscaleFlowService).clusterUpscaleFinished(
                any(), eq(INSTANCE_GROUP_NAME_ACTIONABLE), eq(startedInstances), eq(DetailedStackStatus.AVAILABLE));
        ArgumentCaptor<Object> argumentCaptor = ArgumentCaptor.forClass(Object.class);
        verify(reactorEventFactory).createEvent(anyMap(), argumentCaptor.capture());
        verify(eventBus).notify("STOPSTART_UPSCALE_FINALIZED_EVENT", event);
        assertThat(argumentCaptor.getValue()).isInstanceOf(StopStartUpscaleCommissionViaCMResult.class);
    }

    private StopStartUpscaleContext createContext(int adjustment) {
        return new StopStartUpscaleContext(flowParameters, stack,
                cloudContext, cloudCredential, cloudStack, INSTANCE_GROUP_NAME_ACTIONABLE,
                adjustment, ClusterManagerType.CLOUDERA_MANAGER);
    }

    private void mockStackEtc(List<InstanceMetadataView> instancesActionableNotStopped, List<InstanceMetadataView> instancesActionableStopped,
            List<InstanceMetadataView> instancesRandomNotStopped, List<InstanceMetadataView> instancesRandomStopped) {

        List<InstanceMetadataView> combined =
                Stream.of(instancesActionableNotStopped, instancesActionableStopped, instancesRandomNotStopped, instancesRandomStopped)
                        .flatMap(Collection::stream).collect(Collectors.toList());
        List<InstanceMetadataView> actionable =
                Stream.of(instancesActionableNotStopped, instancesActionableStopped).flatMap(Collection::stream).collect(Collectors.toList());
        lenient().when(stack.getEnvironmentCrn()).thenReturn(ENV_CRN);
        lenient().when(stack.getStackAuthentication()).thenReturn(stackAuthentication);
        lenient().when(stack.getId()).thenReturn(STACK_ID);

        lenient().when(instanceMetaDataService.getAllAvailableInstanceMetadataViewsByStackId(stack.getId())).thenReturn(combined);

        List<InstanceMetadataView> instancesHg = Stream.of(instancesActionableNotStopped, instancesActionableStopped)
                .flatMap(Collection::stream).collect(Collectors.toList());
        List<CloudInstance> cloudInstancesActionableStopped = convertToCloudInstance(instancesActionableStopped);
        List<CloudInstance> cloudInstancesActionableAll = convertToCloudInstance(instancesHg);

        lenient().when(instanceMetaDataToCloudInstanceConverter.convert(eq(instancesActionableStopped), any()))
                .thenReturn(cloudInstancesActionableStopped);
        lenient().when(instanceMetaDataToCloudInstanceConverter.convert(eq(actionable), any()))
                .thenReturn(cloudInstancesActionableAll);

        lenient().when(cloudInstanceIdToInstanceMetaDataConverter.getNotDeletedAndNotZombieInstances(any(), any(), any())).thenCallRealMethod();
    }

    private List<InstanceMetadataView> generateInstances(int count, int startIndex,
            com.sequenceiq.cloudbreak.api.endpoint.v4.stacks.base.InstanceStatus instanceStatus, String instanceGroupName) {
        List<InstanceMetadataView> instances = new ArrayList<>(count);
        InstanceGroup instanceGroup = new InstanceGroup();
        instanceGroup.setGroupName(instanceGroupName);
        for (int i = 0; i < count; i++) {
            InstanceMetaData instanceMetaData = new InstanceMetaData();
            instanceMetaData.setInstanceId(INSTANCE_ID_PREFIX + (startIndex + i));
            instanceMetaData.setInstanceStatus(instanceStatus);
            instanceMetaData.setInstanceGroup(instanceGroup);
            instanceMetaData.setDiscoveryFQDN(INSTANCE_ID_PREFIX + (startIndex + i));
            instances.add(instanceMetaData);
        }
        return instances;
    }

    private List<CloudInstance> convertToCloudInstance(List<InstanceMetadataView> instances) {
        List<CloudInstance> cloudInstances = new LinkedList<>();
        for (InstanceMetadataView im : instances) {
            CloudInstance cloudInstance = new CloudInstance(im.getInstanceId(), null, null, "blah", "blah");
            cloudInstances.add(cloudInstance);
        }
        return cloudInstances;
    }

    private List<CloudVmInstanceStatus> constructStartedCloudVmInstanceStatus(List<CloudInstance> cloudInstances, int numInstances) {
        List<CloudVmInstanceStatus> cloudVmInstanceStatusList = new LinkedList<>();
        for (int i = 0; i < numInstances; i++) {
            CloudVmInstanceStatus cloudVmInstanceStatus = new CloudVmInstanceStatus(
                    cloudInstances.get(i), com.sequenceiq.cloudbreak.cloud.model.InstanceStatus.STARTED);
            cloudVmInstanceStatusList.add(cloudVmInstanceStatus);
        }
        return cloudVmInstanceStatusList;
    }

    private List<CloudVmInstanceStatus> constructVmInstanceStatusWithTerminated(List<CloudInstance> cloudInstances, int numInstances, int numTerminated) {
        List<CloudVmInstanceStatus> cloudVmInstanceStatusList = new LinkedList<>();
        int termCount = 0;
        for (int i = 0; i < numInstances; i++) {
            com.sequenceiq.cloudbreak.cloud.model.InstanceStatus expStatus;
            if (termCount++ < numTerminated) {
                expStatus = com.sequenceiq.cloudbreak.cloud.model.InstanceStatus.TERMINATED;
            } else {
                expStatus = com.sequenceiq.cloudbreak.cloud.model.InstanceStatus.STARTED;
            }
            CloudVmInstanceStatus cloudVmInstanceStatus = new CloudVmInstanceStatus(
                    cloudInstances.get(i), expStatus);
            cloudVmInstanceStatusList.add(cloudVmInstanceStatus);
        }
        return cloudVmInstanceStatusList;
    }

    private void initActionPrivateFields(Action<?, ?> action) {
        ReflectionTestUtils.setField(action, null, runningFlows, FlowRegister.class);
        ReflectionTestUtils.setField(action, null, eventBus, EventBus.class);
        ReflectionTestUtils.setField(action, null, reactorEventFactory, ErrorHandlerAwareReactorEventFactory.class);
        ReflectionTestUtils.setField(action, null, metricService, MetricService.class);
    }
}


Creation: Appeared in July 1933 (CTB) as a renumbering of VA 516. It initially ran from VA 27 (now connector to VA 134) Drummonds Corner north on Wythe Creek Rd into Poquoson, then southeast on Poquoson Rd and Poquoson Ave to end at Armory Wharf. This is the 2nd VA 172.
Adjustments: In May 1946 (CTB), VA 172's east end was moved from Armory Wharf to Messick Pt, upgrading parts of SR 606 and SR 601. The road down to Armory Wharf is just unnumbered now.
VA 172 moved to Messick Pt.
In April 1964 (CTB), VA 172 was extended south replacing VA 134 over to NASA then back over to current VA 134 Magruder Blvd. Shepard Blvd between VA 134 and Armistead Ave was new construction. See scan in VA 167 entry.
In March 1976 (CTB), VA 172 was rerouted in Poquoson to its current status running on Wythe Creek Rd to Yorktown Rd. Wythe Creek Rd from Poquoson Rd to Yorktown Rd was a replacement of part of VA 171. Poquoson Rd southeast to Little Florida Rd became unnumbered while the rest out to Messick Point became part of VA 171.
In Jan 2014, VA 172 was extended as new construction west from VA 134 to Big Bethel Rd.
VA 172 was multilaned from VA 134 to Armistead in 1964.
VA 172 was multilaned from south of VA 171 to nearly Poquoson Rd in 1990.
VA 172 is also multilaned from Armistead to Wythe Creek Rd, but not shown on official maps this way. All I know is that is was still 2-lane in 1993.
VA 172's extension to Big Bethel Rd was multilaned.
Posted: Fully Posted except at its absolute north end point.
Other names: Cmdr Shepard Blvd (Big Bethel Rd to Drummonds Corner); Wythe Creek Rd (north of Drummonds Corner).
Comment: VA 172 passes some interesting looking structures on the NASA Facility, as well as Hampton Speedway.
VA 172 connects Hampton to the mystery city of Poquoson.
VA 172 #1: Appeared in January 1923 (CTB) as new routing. It ran from VA 17 (curr VA 39-42) Goshen southeast to Cedar Grove (curr VA 252).
In May 1923 (CTB), VA 172 was extended south to end at VA 33 (now SR 750) East Lexington. There had been a dispute earlier about routing VA 172 to end at VA 33 (now US 11) near Timber Ridge instead.
About 1926, VA 172 was renumbered as VA 338. Today it is mostly VA 39 except in Rockbridge Baths it used SR 722/602 and in Goshen it used VA 39 ALT.