Europe was an amazing adventure, and I am apologize for the delay since my last post. Some time was needed to reflect, and decide what I am doing with my life. For the past couple of months I have been working on a project coding software, and doing literary research that will allow me to create a custom dictionary for William Blake's Illuminated books in a kindle dictionary format. Similar to what the sight Fictionary.com is doing for fictional works. This project has required my full attention, and I set a milestone to reach before I could return to my photography.
While I was in Art School, I became infatuated with Blake's work. The visual works were readily accessible to me, but much of his writing I found impenetrable. Working through some of the shorter more accessible works I began to understand pieces of his personal mythology. This is where I learned of his masterpiece Jerusalem: The Emanation of the Giant Albion. At one point it was thought to be the writings of a madman, impossible to read comprehensively. The literary critic Northrop Frye in particular helped shed light on Blake's system behind his mythology. Now Jerusalem is often referred to as one of the most difficult literary texts in English language.
The difficulty of understanding Blake's mythology is characters have different forms. Sometimes they have physical forms, other times not. They merge and separate into masculine and feminine parts. They can also change back and forth between figures, and nations. There are multiple levels of existence. The images in the book often have little to do with the text, almost telling their own separate story instead of functioning as illustration. Time is non-linear, and characters appear without introduction as if intentionally demanding the reader's full attention. I have read it cover to cover and could not tell you what it is about. The feeling I have after reading Jerusalem is the feeling of waking after a dream with a sense of awe and wonder, but unable to remember anything about the dream. On some level I am determined to return from reading Jerusalem with pieces of Blake's dream.
In addition to the difficulties of Blake's mythology he often used grammar that has changed much in the last 200 years. Reading I feel as if my mind is a skipping stone just occasionally touching the surface. To illustrate the difficulties for me the word NOT can also be a contraction of the word NAUGHT, AWFUL was understood to be full of awe, and DEEP was another name for hell to name a few. Samuel Johnson published a dictionary in 1755, there is no clean digital version available, and the ones that exist are not in kindle dictionary format. So no highlighting a word with the definition popping up on the screen with a single touch. Part of the reason it doesn't exist is that software is not available to produce an e-book it the special dictionary format.


text:
Q: PHP Multidimensional array merge two trees inside an array How to? I want to merge two trees, in a multidimensional to one tree in the md array in php:
$array[1] = Array
            [0] => a
            [1] => b
            [2] => c

$array[2] = Array
            [0] => d
            [1] => e
            [2] => f

result:
$array[1] = Array
            [0] => ad
            [1] => be
            [2] => cf

A: You could try this:
<?php

foreach($array[1] as $key => $value)
{
  $array[1][$key] = $value.$array[2][$key];
}

?>

A: We can use array function to solve this Problem Like this :

$array = array('a','b','c');
$array2 = array('d','e','f');
$c = array_combine($array, $array2);
foreach($c as $key=>$value){
   $data[] = $key.$value;
}
print_r($data);

redpajama_set_name: RedPajamaStackExchange


ST. LOUIS, Oct. 26, 2015 – KellyMitchell Group, Inc. (KellyMitchell), launches its annual United Way campaign with a nationwide, virtual breakfast with KellyMitchell CEO Cassandra Sanford. Each year, KellyMitchell hosts a United Way week to inspire employee involvement and educate new employees on KellyMitchell's philanthropy of choice.
KellyMitchell chose to partner with the United Way because, like KellyMitchell, the United Way serves communities and helps people nationwide. The United Way's mission, Helping People Live their Best Possible Lives closely aligns with KellyMitchell's mission to Connect People with Opportunity and Clients with Success.
This week, KellyMitchell employees will participate in various fundraising activities including pumpkin carving contests, penny wars, and the auctioning off of KellyMitchell President, Mark LoCigno, who will serve as secretary for a day to the highest bidder.
Year-round, KellyMitchell employees have the opportunity to contribute a percentage of their pay at various levels, which is added to a larger sum donated by executives to meet KellyMitchell's corporate sponsorship goal.
For more information about the United Way, click here.


text:
Gretl Shapiro – Immigration
This section describes Gretl's arrival in England through the Kindertransport system and explains how she came to be placed with an English family.
Read the Transcript
INT: When you arrived do you remember how you felt? Were you frightened or bewildered?
G.S: Well, yes. My sister was already here and we arrived at Liverpool Street Station and I remember there was a sort of barrier and my sister was standing there waving madly, but we were rushed away because I think that we had to catch a train to Coventry. And so I never even kissed my sister or greeted her or anything but the following, I think it must have been the following week, the following weekend, she came to visit me from London.
INT: And you were pleased to see her?
G.S: Of course!
INT: Did you feel lost and did you feel foreign at that time?
G.S: Yes, a bit yes, because my English was practically non-existent and my guardian couldn't speak German. So it was difficult at first but it was such a wonderful household I went to – a fabulous woman.
INT: This is the lady that you eventually called your aunt?
G.S yes yes
INT: When you came to Britain and you arrived here, and you knew you were coming to a family did you know anything about the family at all?
G.S: I think I knew there were three sisters living together, all teachers – and that's about it. Really the, the connection was made originally by a cousin of mine – Ilona, who used to go to Bielefeldt and, on holiday. I'm not quite sure whether, what she did there but maybe she took English people around, I don't know. But she met there, the headmistress of that school I went to in Barrs Hill, Barrs Hill Grammar School, and this lady had said that she wanted to help somebody and she knew of somebody who wanted to help children out and my cousin Ilona had said 'Well I've got a small cousin who needs to get out'. And this is how it all started. That's how the names were exchanged.
INT: And this was the beginning?
G.S: Yeah
INT: But there was a, it was a large movement, there were a lot of children who came out at that time
G.S: Yes
INT: Through the Quakers weren't there?
G.S: Yes, over nine thousand children the Quakers took out. They arranged for.
INT: Did you speak any English at all?
G.S: I'd had one year at school – that's all.
INT: So it was very limited?
G.S: Yes, very limited yes.
INT: What was the full name of your adopted aunt?
G.S: Margaret Kershaw Scholes and she came from Oldham in Lancashire
INT: And you kept your own name? Your own family name which was?
G.S: Yes. Marle
INT: And how do you spell that?
G.S: M-A-R-L-E accente aigue. It's got an accent on it – it's French
INT: And then, when you came here you just kept your name right through?
G.S: Yes, oh yes. Well no, when I married then I changed it.
INT: And you came first of all to Coventry
INT: And what date did you arrive in the UK?
G.S: On the 22nd of June 1939
INT: May I ask how old you were then?
G.S: Fourteen
INT: Fourteen. And.if there's anything else I need. And you've been in Scotland since 1950? Is that right?
G.S: Yes, yes
Listen to the Testimony
https://gtvbeta.jacb.co.uk/wp-content/uploads/2017/03/gretl-shapiro-immigration.mp3Press the play button to listen
Links to Other Testimonies by Gretl Shapiro
Life Before The War
Reflection On Life

redpajama_set_name: RedPajamaCommonCrawl


We love Muddy Buddies! They are a favorite snack for ball games, picnics, or a fun day in the sun! We added our favorite candy bars and oreo cookies to this mix! We love Cookies and Cream candy bars. Your family will flip over this fun dessert!
A fun and delicious Muddy Buddy recipe loaded with cookies and cream candy bars and oreo cookies!
Crush 12 of the oreo cookies very fine. You could do it in a food processor or with a rolling pin. Then add 1 cup of powdered sugar. Then divide this mixture in half.
Melt the cookies and cream candy bars in a microwave safe bowl at 20 second intervals, stirring until smooth.
Pour the melted cookies and cream candy bars over half of the rice chex in one of the bowls. Stir gently until well blended. Then pour half of the powdered sugar/oreo crumb mixture over it and stir until it's completely coated.
Then melt the chocolate chips in microwave at 20 second intervals stirring until smooth. Pour the melted chocolate over the other remaining bowl of rice chex and stir until well blended. Then pour the other half of the powdered sugar/oreo crumb mixture over the chocolate coated chex and stir until coated.
In a big bowl combine both bowls of coated chex cereal and remaining oreos that have been broken into pieces or coarsely chopped.
Wow! These look so delicious! Oreos are perfect for something like this, I'll have to try it!


text:
Booué is a small town in central Gabon. It is situated in Lopé Department, southwest side of the Ogooué-Ivindo Province. The town lies just 6.6 miles to the south of the Equator and is the province's only Department capital in the Southern Hemisphere.

History
Booué is a bad transcription and a francization effort of the word "Mbue" or "Mboue" from the Shiwe language erroneously attributed to a town located in Ogooué-Ivindo province, Gabon by Pierre Savorgnan de Brazza in 1878. Booué is still referred to as "Mboue" by the Shiwe people who were the first settlers of this town and who named it Nangashiki, but was changed to Mboue and subsequently to Booué. From all historical accounts, this change resulted from a miscommunication between De Brazza and Mpami Nani Shui, a Shiwe Chief, during some negotiation talks between the two men. Many accounts from the Shiwe people indicate that while negotiating his passage to the upper Ogooué River, De Brazza asked Mpami Nani Shui the name of his village. Thinking that De Brazza was actually asking the name of an aquatic plant floating on the Ogooué River, he answered "Mboung" as the Shiwe people called it. De Brazza, thinking that he had been told the actual name of the village, wrote and recorded it as "Mboue", then Booué later on. Thus Mboue, as a village and later a town, was founded by the Shiwe people originating from the southeast of Cameroon between the eighteenth and nineteenth centuries; but the name Mboue itself and later its transcription "Booué" was mistakenly attributed to the village and later to the town by De Brazza.
During the French colonization, Mboue was the capital city of the then Ogooué-Ivindo region until 1953. Today, it is just one of the four Department capital cities of the Ogooué-Ivindo Province.

Transport
Visitors from other parts of Gabon and from overseas use generally the TRANSGABONAIS trains to get to Booué. It is perhaps the cheapest and safest way to travel to Booué, but it also can be very tiring and time-consuming. Booué does have an airfield; but it may not be very practical because it is not tarred. In addition, air tickets may be very expensive since there is no regular airline serving this town. Visitors from other cities in the Ogooué-Ivindo province generally use rented mini buses, cars, and trucks to travel to Booué. Once in Booué, there are some local cabs to get around. If one is interested in crossing the Ogooué River for an adventure in the bush, a ferry is available at no cost; but you will need a car for the ferry to make the trip!

See also
Railway stations in Gabon

References

Populated places in Ogooué-Ivindo Province

redpajama_set_name: RedPajamaWikipedia


Use an electric mixer to whisk egg whites in a clean dry bowl until soft peaks form. Gradually add sugar, 1 tablespoon at a time, beating well after each addition, until meringue is thick and glossy and sugar dissolved.... Our answer. Most meringue recipes are designed to dry out the meringue mixture in the oven. A pavlova is slightly different in that the baking time is shorter and the oven temperature is slightly higher so centre of the meringue remains soft but the outside shell should still be crisp.
6/11/2008 · Hi ya, yes try cream of tartar if you have some. But you can cook it like this, I have done the same myself. Put in a tray with edges so it doesn't leak all over, don't try to shape or pipe it.... Add 1 heaped tablespoon of the icing sugar. 3.Whisk the whites until the mixture holds "soft peaks". You should still be able to make out bubbles in the mixture. 4.Add the remaining icing sugar.
12/08/2011 · Hi. I'm Terri, a food blogger and a self-appointed food writer but I am NOT able to make a pavlova. That's right, I can make a 4-tier wedding cake and pizzas so good that you think only a pizzaiola can make but I can't make a silly pavlova.... A must try loaded berry pavlova. It's light, airy and filled with all the best summer berries. It is crisp on the outside and marshmallowy soft inside. It's light, airy and filled with all the best summer berries.
How long will a home-made pavlova keep?
Put the pavlova into the oven, immediately reduce the heat to 250°F, and bake for one hour and fifteen minutes. When the pavlova has finished baking it should be dry to the touch and sound hollow when gently tapped. Allow the pavlova to cool completely in the oven with the door slightly ajar, or overnight.
Use an electric mixer to whisk egg whites in a clean dry bowl until soft peaks form. Gradually add sugar, 1 tablespoon at a time, beating well after each addition, until meringue is thick and glossy and sugar dissolved.
To poach soft meringue: Drop spoonfuls of soft meringue into simmering water in large saucepan or deep skillet. Meringue will expand as it cooks so leave space between spoonfuls and poach in batches, if necessary. Simmer, uncovered, turning once, until firm, about 5 minutes. Remove with slotted spoon. Drain on paper towels. Serve warm or refrigerate.


Being a hard rock kid at heart, this was refreshing to see come up in the news feeds. As most Canadian rockers have known for awhile, Three Day Grace saw the loss of their distinct sound when vocalist Adam Gontier. The announcement was quite a shock for most of the TDG fans, but was for the better as Adam cited he had some non-life threatening problems that needed to be treated.
So the band moved on, promoting Matt Walst (My Darkest Days) to the front man spot of the group as they moved onto their next full length release. Adam continued to recover from his illness, and work on his solo material. But what happened next really caught my attention.
Out of (seemingly) nowhere, Adam announced that he, Staind guitarist Mike Mushok, bassist Corey Lowery, and ex-Finger Eleven drummer Rich Beddoe to form a new group titled Saint Asonia. What seems to be a mix of members looking for new projects, and other members just looking for something to do during their hiatuses.
While there isn't much to go on right now, I am very excited to hear what this group is going to sound like. So far, the music seems to work very well with these guys and the hard rock aspect was instantly appealing to myself, and other fans.
Given that Gontier has that distinct voice that Canadians are quick to recognize, combined with the hard edge writing approach of Mushok and Beddoe, will make this an easily popular outfit. Let's just hope the music compliments the members.
The band has uploaded a string of new tunes over the past few weeks, so be sure to check out all the links on this article, including "Fairy Tale", and "Blow Me Wide Open".
I have a feeling that this will be on many people's list for purchase once it hit stores. More information as it comes folks. Keep checking back, or post new information of your own!


Fly to Osaka, Japan, with United Airlines from over 200 airports within the United States and an additional 100 airports internationally.
Visit the impressive Osaka Castle and the Buddhist temple Shitennō-ji, both considered some of the oldest sites in Japan.
Experience traditional puppet art and theater at the National Bunraku Theatre.
Tour the Osaka Aquarium Kaiyukan, one of the largest aquariums in the world.
Admire the city views from the Tsutenkaku observation deck, one of Osaka's most popular tourist attractions, which also includes a museum, souvenir shops and a café.
Take the family for a fun-filled day at Universal Studios Japan.
Enjoy a night out at Dōtonbori, a street along the Dōtonbori Canal featuring theaters, shops and a variety of restaurants among hundreds of neon lights and billboards.
Spring is the best time to visit Osaka, when the famous cherry blossoms are in bloom. The Cherry Blossom Festival takes place during Golden Week, when the city celebrates a series of four national holidays, typically held at the end of April or beginning of May. BeerFes is a popular beer festival hosted during the summer. The best weather in Osaka is during fall or spring when temperatures cool down.


text:
Prof. dr. Matthias Heinemann studied engineering at the University of Stuttgart (Germany) and the University of Western Ontario (Canada), and in 2003 earned a PhD in biochemical engineering from the RWTH Aachen University (Germany). After a short postdoc in the bioprocess lab of the ETH Zurich (Switzerland), Matthias became group leader in the research unit of Uwe Sauer at the Institute of Molecular Systems Biology of ETH Zurich, where he mutated into a biologist. In 2010, Matthias moved to the University of Groningen (Netherlands) as an associate professor for molecular systems biology, where he was promoted to full professor in 2013. Matthias is recipient of the DuPont Young Professorship award and was granted a VIDI-grant from the Netherlands Organisation for Scientific Research (NWO).
Metabolism, systems biology, modeling, oscillations.
Our research group aims to understand how cellular metabolism works and how it controls other cellular functions. For instance, we recently found that cellular metabolism is constrained by the rate with which cells can dissipate Gibbs energy to the environment (Niebel et al. (2019) Nature Metabolism). We are now highly interested to the uncover the mechanistic basis of this limit, which likely will also have played a role during evolution of cells. Another key discovery of the lab was that yeast metabolism is an autonomous oscillator (Papagiannakis et al. (2017) Molecular Cell). We think that this metabolic oscillator might have an important function for the control of the cell growth and division process. In essence, we combine different experimental and modeling techniques to investigate intriguing (metabolic) questions about the very basics of "contemporary" cells in order to learn how they might have emerged and evolved.


Category Archives for "Vegetable Sides"
I have a bumper crop of arugula this year! I had to use it or lose it so I thought I might as well make arugula pesto and freeze it!
I am so excited that I finally found a tool that makes very very thin, gluten free and grain free, Paleo Angel Hair Pasta!
I was able to source organic rhubarb that looked very fresh. I was always curious about how fermented rhubarb would taste so that is what I decided to so with it.
Fennel has be one of my favorite vegetables. Roasted fennel adds a sweet/savory dimension to any meal! I love it roasted or cooked in soups or stews.
I love beets, but I used to throw the beet greens away or simply buy loose beets. Sometimes the greens can taste bitter – I have a solution for that!
It's a beautiful, clear, crisp fall day – one of those days that smell of the earth and soil. If you are eating seasonally this is the time for all those wonderful root vegetables!
If you have a home garden you must have an abundance of tomatoes coming in now – as I do. You can make this 3 ingredient tomato sauce can be in 12 minutes!
Here is a way to add a healthy condiment to any protein. This Mango Avocado Relish adds good fats, vitamins and minerals to any fish, chicken or beef dish.
I've grown to love Daikon radish and I've used it is various ways. Here is a grain free Daikon rice that has an interesting texture.


When it comes to running an efficient household, keeping my Sweet V healthy and heart filled, and my own sanity intact, I am a stickler for routines. We have a routine for just about everything. But one thing I do get loosey goosey with on special occasions is bedtime.
And by special occasion I mean summer.
Since she was a tiny tot, I've let her stay up late in the summer for a variety of things. I pay the price the next day, but I am okay with it. I just keep my next day expectations very low and give A LOT OF GRACE! Then back on track we go for a few more days. I do this because I want her to have the same kinds of memories I have from childhood.
Here are my top 5 bedtime busting bucket list items for the summer. These are the ones special to me that I want to pass down to her.
Of course we love to stay up late to watch them. It's a rite of passage. I took V out on her grandpa's boat at barely 4 weeks old to watch them and she has seen them every year on the Fourth of July since!
This summer, the full moons are tonight, June 27th but really the 28th at 12:58 am, so the Strawberry Moon can be seen the 28th. July 27th is the Full Buck Moon or Thunder Moon, and August 26th is the Sturgeon Moon.
I love the moon. I always have. When it is full and casts its glow across the lake or yard, I am filled with such a peace. It is another reminder to me that God made a perfectly orchestrated system of nature and I don't have to worry in this life. I want to share full moon moments with my girlie and have her blow The Man in the Moon a big kiss and say a little prayer of gratitude to God.
Lightning bug season is short. So when you start to see them, don't delay. They are not around much anymore and with a little research I have learned that all of the mosquito control sprays on our grass, weird weather, and perfectly manicured lawns are making their habitats more scarce. I grew up on a dirt road on a few acres surrounded by trees. Lightning bugs abound! I am back home at that very place for the summer and even now as I type this in the dark, I stopped to go wake up my girl so she could come see them. She caught one and named him Lloyd Lighting. But since we are a catch and release program around here, she bid him adieu, we snuggled under the night sky for a bit, and I tucked her back in bed.
I have some really awesome memories of summer nights at the drive in when I was little. I remember seeing Karate Kid, Weird Al Fat Music Video, Crocodile Dundee, and I think Big. Vanessa and I have yet to see a drive in movie, but now that she is 7, I think she might be able to stay up to watch one and make it worth the effort.
Would summer even be complete without a bonfire?! Whether you are camping or just making one in the backyard, a cool Michigan summer night is perfect for sending the littles off to grab the kindling and the bigs for some logs. I have great memories of finding the perfect marshmallow stick and my dad using his pocket knife to sharpen the end into a point. I have a few less fond memories of me swinging that same stick around with a fire ball of sugar and it melting right onto my brother's arm. Oops. So make sure you teach safety around the fire before you try to make the song singing, s'mores roasting memory this year.
Whatever your summer night memories are, make sure you find a few to pass down to your kiddos. And if you are childfree, make sure you get out of your work routine and under the stars a few times this summer. Our super creative God placed each one right up there, so it would be nice if we all just took a few moments to admire his handiwork.
Summer is great. Michigan summer nights are even better. Keep making your house a love-filled home.


I took a break from making ice cream and brownies, and decided to make...cookies! What can I say...I'm a creature of habit.
When it comes to comfort-baking and eating, you can't beat chocolate chip cookies. Even with temps in the 90's like it was here last week, I can't stop myself from turning on the oven to bake and cook (luckily, these cookies are done in 11 minutes). And I still crave a gooey chocolate chip cookie in the summer as much as I do in the winter.
I have a few recipes I make often but it's always fun to find something new to try. This time, I made brown butter chocolate chip cookies - a recipe I adapted slightly from Displaced Housewife. Since I associate brown butter with hazelnuts, and because I personally like nuts in most baked goods, I added toasted chopped hazelnuts to about half my batch of cookies (my fellas usually prefer their cookies without nuts).
If you remember, I made Displaced Housewife's olive oil chocolate chip cookie recipe not long ago and they were sensational. I had high hopes for these cookies - which is made with a combination of brown butter and a flavorless oil (I used canola), and a mix of bread and all-purpose flour. They didn't turn out as chewy as the olive oil cookies but these were solid cookies - sturdy and moist, happily devoured by all. I think it's hard to make a "bad" batch of chocolate chip cookies if you make sure to stuff it with enough good chocolate. You pretty much can't go wrong!
These cookies start with some brown butter. I made half the original recipe so I started by browning half a stick of unsalted butter. I have to admit that I usually try to push the limit to get the butter as dark as possible without being burnt. However, I was more conservative this time, taking the butter off just as I started to see golden bits form at the bottom of my pan.
Brown butter is incredibly fragrant (really does smell like toasted hazelnuts) and in certain uses, the flavor makes a huge impact. Can you taste the flavor of the brown butter in the final baked chocolate chip cookies here? Personally, I have to be honest and answer, "not really...", but it surely didn't hurt and I have a feeling it made up for the neutrality of the canola oil so maybe there's more of an impact than I'm giving it credit for.
These cookies are very easy to make. While you do have to brown the butter, it only takes a few minutes and it eliminates the need to remember to bring it to room temperature before starting the recipe. After the browned butter cools for a bit, stir in the oil, plus the sugars, a spoonful of milk, vanilla, and mix it together with the dry ingredients.
Mixing, stirring...it's pure baking therapy!
The dough is a bit sticky and tacky, with the melted butter and oil in them, so a little chill time is good. I like to prep chocolate chip cookie dough in advance and store it in the fridge for at least a day for them to firm up and for the flavors and texture to develop. Freeze the scooped cookie dough for a bit before baking if you like thicker, taller baked cookies.
My half batch makes about 16 cookies, about 2 tablespoons of dough each. I added chopped toasted hazelnuts to about half the batch so there's something for everyone.
You can never have too many chocolate chip cookies. Stow a few away in the freezer for an emergency because freshly-baked homemade chocolate chip cookies soothe the soul and help to make the day a little better!
First, brown the butter by placing it in a small saucepan over medium heat. Let butter melt, then continue to cook, gently swirling the pan, until small bits appear at the bottom of the pan. Stay close because this happens fast and you don't want the butter to burn. It will smell fragrant, like toasted hazelnuts, when done. Remove from the heat and pour brown butter into a heatproof bowl to cool slightly.
To the brown butter, add the oil, brown sugar, granulated sugar, egg, milk, and vanilla extract. Whisk to thoroughly combine.
In another bowl, whisk the bread flour, all-purpose flour, baking powder, baking soda, and salt together. Add the dry ingredients to the wet, stirring with a rubber spatula until combined. Add the chocolate and hazelnuts (if using) and fold in to combine. Transfer the dough to a bowl and cover with plastic wrap. Chill in the refrigerator for at least 30 minutes, or leave overnight and up to a few days.
When ready to bake, preheat oven to 375 degrees with a rack positioned in the upper third of the oven. Line baking sheet with parchment paper or a silicon mat. Scoop or roll dough into about 2-tablespoon balls, placing them about 2 inches apart on the baking sheet. For thicker, taller cookies, freeze dough for about 10 minutes before baking.
Bake for 11 minutes. Remove baking sheet from the oven and let sit on a wire rack about 5 minutes. Remove the cookies and set on to a wire rack to cool to room temperature (or eat some while warm!). Continue baking remaining cookie dough.
I can taste these cookies from Vancouver just by the sound and look of them, Monica. Fabulous!
Oh yum... I would totally gobble these up!!
Choc chip cookies are never wasted!
You have me at brown butter! These cookies sound and look fabulous.
These look like gourmet cookies you'd find in a fine bake shop! Perfect any day, any time. I love browned butter in baked good - so much flavor.
You're too sweet. I wish I could make them like the pastry shops - the ones that are big, crackly, deep brown, sturdy yet super moist - soft and chew in the center yet with crunchy edges! Can't quite get it at home.
Brown butter and chocolate...we could never stop at one. Decadent and delicious! Hope you are doing well and enjoying your summer.
That's why it's just 'safer' to make them smaller at home. haha. Yes, summer going by fast. Hope you are having a good one!
So glad that you made these chocolate chip hazelnut cookies. Brown butter and chocolate sound like a wonderful combo. I am very sure they taste divine.
haha - wish I could share! Hope you're enjoying the summer!
These cookies sound and look SO yummy.
haha! If I'm the "queen" of anything, it must be queen of finding little things to bake and mess around in the kitchen. We do love a warm choc chip cookie here...sometimes it's the simple things.
haha yeahhh it's been SO hot here lately but instead of keeping the oven off (our kitchen gets pretty hot from it due to zero air flow) I just bought myself a fan. lol Now I can keep baking away!! These cookies look just perfect - I wish I had one to enjoy after lunch!
We just crank up the AC. ; ) I really can't stop cooking and baking for long when I'm home. Keep enjoying the summer, Ashley.
When in doubt, chocolate chip cookies...? That should be a mantra. ; ) Enjoy all your fresh produce and all the sunshine, Cheri.
Time for some old-fashioned cookies, Juliana. ; ) Have a great weekend.


Download Drupal Website Templates download drupal website templates sports theme web template drupal download templates. download drupal website templates 8 best software drupal templates themes free premium templates free. download drupal website templates education drupal website templates themes free premium free download. Download Drupal Website Templates download drupal website templates drupal website templates templates. download drupal website templates free drupal magazine theme design download drupal magazine design printable. download drupal website templates theme project drupal ideas. Download Drupal Website Templates download drupal website templates 21 drupal website themes templates free premium templates download.
Download Drupal Website Templates download drupal website templates 8 best software drupal templates themes free premium templates free. download drupal website templates education drupal website templates themes free premium free download. download drupal website templates drupal website templates templates. download drupal website templates free drupal magazine theme design download drupal magazine design printable. download drupal website templates theme project drupal ideas.


text:
#include "mitkPropertyRelationRuleBase.h"

#include "mitkDataNode.h"
#include "mitkPointSet.h"
#include "mitkStringProperty.h"

#include "mitkTestFixture.h"
#include "mitkTestingMacros.h"

#include <regex>

/** This class is used to test PropertyRelationRuleBase and get access to internals where needed to test them as well.
 */
namespace mitk
{
  class TestRule : public mitk::PropertyRelationRuleBase
  {
  public:
    mitkClassMacro(TestRule, mitk::PropertyRelationRuleBase);
    itkFactorylessNewMacro(Self);
    itkCloneMacro(Self);

    using RuleIDType = PropertyRelationRuleBase::RuleIDType;
    using RelationUIDType = PropertyRelationRuleBase::RelationUIDType;
    using RelationUIDVectorType = PropertyRelationRuleBase::RelationUIDVectorType;

    RuleIDType GetRuleID() const override
    {
      if (m_AbstractMode)
      {
        return "TestRule";
      }
      else
      {
        return "TestRule_type1";
      }
    };

    std::string GetDisplayName() const override { return "TestDisplayName"; }
    std::string GetSourceRoleName() const override { return "source role"; }
    std::string GetDestinationRoleName() const override { return "destination role"; }

    bool m_AbstractMode;

    bool IsAbstract() const override { return m_AbstractMode; }

    using Superclass::GetRootKeyPath;
    using Superclass::Connect;

  protected:
    TestRule() : m_AbstractMode(false)
    {
    };

    ~TestRule() override = default;

    using InstanceIDType = PropertyRelationRuleBase::InstanceIDType;
    using InstanceIDVectorType = PropertyRelationRuleBase::InstanceIDVectorType;

    bool IsSupportedRuleID(const RuleIDType& ruleID) const override
    {
      if (m_AbstractMode)
      {
        return ruleID.find(this->GetRuleID()) == 0;
      }
      else
      {
        return Superclass::IsSupportedRuleID(ruleID);
      }
    };

    InstanceIDVectorType GetInstanceID_datalayer(const IPropertyProvider *source,
                                                         const IPropertyProvider *destination) const override
    {
      InstanceIDVectorType result;

      auto destProp = destination->GetConstProperty("name");

      if (destProp.IsNotNull())
      {
        auto destRegExStr =
          PropertyKeyPathToPropertyRegEx(Superclass::GetRootKeyPath().AddAnyElement().AddElement("dataHandle"));
        auto regEx = std::regex(destRegExStr);
        std::smatch instance_matches;

        auto keys = source->GetPropertyKeys();

        for (const auto &key : keys)
        {
          if (std::regex_search(key, instance_matches, regEx))
          {
            auto sourceProp = source->GetConstProperty(key);
            if (sourceProp->GetValueAsString() == destProp->GetValueAsString())
            {
              if (instance_matches.size()>1)
              {
                result.push_back(instance_matches[1]);
              }
            }
          }
        }
      }
      return result;
    };

    bool HasImplicitDataRelation(const IPropertyProvider *source,
                                         const IPropertyProvider *destination) const override
    {
      auto destProp = destination->GetConstProperty("name");
      auto sourceProp = source->GetConstProperty("referencedName");

      return destProp.IsNotNull() && sourceProp.IsNotNull() &&
             destProp->GetValueAsString() == sourceProp->GetValueAsString();
    };

    void Connect_datalayer(IPropertyOwner *source,
                                   const IPropertyProvider *destination,
                                   const InstanceIDType &instanceID) const override
    {
      auto destProp = destination->GetConstProperty("name");

      source->SetProperty("referencedName", StringProperty::New(destProp->GetValueAsString()));
      source->SetProperty(
        PropertyKeyPathToPropertyName(Superclass::GetRootKeyPath().AddElement(instanceID).AddElement("dataHandle")),
        StringProperty::New(destProp->GetValueAsString()));
    };

    void Disconnect_datalayer(IPropertyOwner *source, const InstanceIDType & /*instanceID*/) const override
    {
      source->RemoveProperty("referencedName");
    };
  };
} // namespace mitk

class mitkPropertyRelationRuleBaseTestSuite : public mitk::TestFixture
{
  CPPUNIT_TEST_SUITE(mitkPropertyRelationRuleBaseTestSuite);

  MITK_TEST(GetRootKeyPath);
  MITK_TEST(IsSourceCandidate);
  MITK_TEST(IsDestinationCandidate);
  MITK_TEST(IsSource);
  MITK_TEST(HasRelation);
  MITK_TEST(GetExistingRelations);
  MITK_TEST(GetRelationUIDs);
  MITK_TEST(GetSourceCandidateIndicator);
  MITK_TEST(GetDestinationCandidateIndicator);
  MITK_TEST(GetConnectedSourcesDetector);
  MITK_TEST(GetSourcesDetector);
  MITK_TEST(GetDestinationsDetector);
  MITK_TEST(GetDestinationDetector);
  MITK_TEST(Connect);
  MITK_TEST(Disconnect);
  MITK_TEST(Connect_abstract);
  MITK_TEST(Disconnect_abstract);

  CPPUNIT_TEST_SUITE_END();

private:
  mitk::TestRule::Pointer rule;
  mitk::TestRule::Pointer abstractRule;

  mitk::DataNode::Pointer unRelated;
  mitk::PointSet::Pointer unRelated_1_data;

  mitk::DataNode::Pointer source_implicit_1;
  mitk::DataNode::Pointer source_data_1;
  mitk::DataNode::Pointer source_idOnly_1;
  mitk::DataNode::Pointer source_1;

  mitk::DataNode::Pointer source_multi;

  mitk::DataNode::Pointer source_otherRule;

  mitk::DataNode::Pointer source_otherTypeRule; //relevant for abstract rule checks. Abstract rule should see it concrete rule not.

  mitk::DataNode::Pointer dest_1;
  mitk::PointSet::Pointer dest_1_data;
  mitk::DataNode::Pointer dest_2;
  mitk::PointSet::Pointer dest_2_data;

  bool hasRelationProperties(mitk::IPropertyProvider *provider, std::string instance = "") const
  {
    auto keyPath = mitk::PropertyRelationRuleBase::GetRootKeyPath();
    if (!instance.empty())
    {
      keyPath.AddElement(instance);
    }

    auto prefix = mitk::PropertyKeyPathToPropertyName(keyPath);
    auto keys = provider->GetPropertyKeys();

    for (const auto &key : keys)
    {
      if (key.find(prefix) == 0)
      {
        return true;
      }
    }

    return false;
  }

public:
  void setUp() override
  {
    rule = mitk::TestRule::New();

    abstractRule = mitk::TestRule::New();
    abstractRule->m_AbstractMode = true;

    unRelated = mitk::DataNode::New();
    unRelated->SetName("unRelated");
    unRelated_1_data = mitk::PointSet::New();
    unRelated->SetData(unRelated_1_data);

    dest_1 = mitk::DataNode::New();
    dest_1->SetName("dest_1");
    dest_1_data = mitk::PointSet::New();
    dest_1->SetData(dest_1_data);

    dest_2 = mitk::DataNode::New();
    dest_2->SetName("dest_2");
    dest_2_data = mitk::PointSet::New();
    dest_2->SetData(dest_2_data);

    source_implicit_1 = mitk::DataNode::New();
    source_implicit_1->AddProperty("referencedName", mitk::StringProperty::New(dest_1->GetName()));

    source_idOnly_1 = mitk::DataNode::New();
    std::string name = "MITK.Relations.1.relationUID";
    source_idOnly_1->AddProperty(name.c_str(), mitk::StringProperty::New("uid1"));
    name = "MITK.Relations.1.destinationUID";
    source_idOnly_1->AddProperty(name.c_str(), mitk::StringProperty::New(dest_1_data->GetUID()));
    name = "MITK.Relations.1.ruleID";
    source_idOnly_1->AddProperty(name.c_str(), mitk::StringProperty::New(rule->GetRuleID()));

    source_data_1 = source_implicit_1->Clone();
    name = "MITK.Relations.1.relationUID";
    source_data_1->AddProperty(name.c_str(), mitk::StringProperty::New("uid2"));
    name = "MITK.Relations.1.dataHandle";
    source_data_1->AddProperty(name.c_str(), mitk::StringProperty::New(dest_1->GetName()));
    name = "MITK.Relations.1.ruleID";
    source_data_1->AddProperty(name.c_str(), mitk::StringProperty::New(rule->GetRuleID()));
    name = "MITK.Relations.2.relationUID";
    source_data_1->AddProperty(name.c_str(), mitk::StringProperty::New("uid10"), nullptr, true);
    name = "MITK.Relations.2.destinationUID";
    source_data_1->AddProperty(name.c_str(), mitk::StringProperty::New(dest_1_data->GetUID()));
    name = "MITK.Relations.2.ruleID";
    source_data_1->AddProperty(name.c_str(), mitk::StringProperty::New("TestRule_othertype"));

    source_1 = source_data_1->Clone();
    name = "MITK.Relations.1.relationUID";
    source_1->AddProperty(name.c_str(), mitk::StringProperty::New("uid3"), nullptr, true);
    name = "MITK.Relations.1.destinationUID";
    source_1->AddProperty(name.c_str(), mitk::StringProperty::New(dest_1_data->GetUID()));
    name = "MITK.Relations.1.ruleID";
    source_1->AddProperty(name.c_str(), mitk::StringProperty::New(rule->GetRuleID()));
    name = "MITK.Relations.2.relationUID";
    source_1->AddProperty(name.c_str(), mitk::StringProperty::New("uid8"), nullptr, true);
    name = "MITK.Relations.2.destinationUID";
    source_1->AddProperty(name.c_str(), mitk::StringProperty::New(dest_2_data->GetUID()));
    name = "MITK.Relations.2.ruleID";
    source_1->AddProperty(name.c_str(), mitk::StringProperty::New("TestRule_othertype"));

    source_multi = source_1->Clone();
    name = "MITK.Relations.1.relationUID";
    source_multi->AddProperty(name.c_str(), mitk::StringProperty::New("uid4"), nullptr, true);
    name = "MITK.Relations.1.destinationUID";
    source_multi->AddProperty(name.c_str(), mitk::StringProperty::New(dest_1_data->GetUID()));
    name = "MITK.Relations.1.ruleID";
    source_multi->AddProperty(name.c_str(), mitk::StringProperty::New(rule->GetRuleID()));
    name = "MITK.Relations.4.relationUID";
    source_multi->AddProperty(name.c_str(), mitk::StringProperty::New("uid5"));
    name = "MITK.Relations.4.destinationUID";
    source_multi->AddProperty(name.c_str(), mitk::StringProperty::New(dest_2_data->GetUID()));
    name = "MITK.Relations.4.ruleID";
    source_multi->AddProperty(name.c_str(), mitk::StringProperty::New(rule->GetRuleID()));
    name = "MITK.Relations.2.relationUID";
    source_multi->AddProperty(name.c_str(), mitk::StringProperty::New("uid6"));
    name = "MITK.Relations.2.destinationUID";
    source_multi->AddProperty(name.c_str(), mitk::StringProperty::New("unknown"));
    name = "MITK.Relations.2.ruleID";
    source_multi->AddProperty(name.c_str(), mitk::StringProperty::New(rule->GetRuleID()));

    source_otherRule = mitk::DataNode::New();
    name = "MITK.Relations.1.relationUID";
    source_otherRule->AddProperty(name.c_str(), mitk::StringProperty::New("uid7"));
    name = "MITK.Relations.1.destinationUID";
    source_otherRule->AddProperty(name.c_str(), mitk::StringProperty::New(dest_1_data->GetUID()));
    name = "MITK.Relations.1.ruleID";
    source_otherRule->AddProperty(name.c_str(), mitk::StringProperty::New("otherRuleID"));

    source_otherTypeRule = mitk::DataNode::New();
    name = "MITK.Relations.1.relationUID";
    source_otherTypeRule->AddProperty(name.c_str(), mitk::StringProperty::New("uid9"));
    name = "MITK.Relations.1.destinationUID";
    source_otherTypeRule->AddProperty(name.c_str(), mitk::StringProperty::New(dest_1_data->GetUID()));
    name = "MITK.Relations.1.ruleID";
    source_otherTypeRule->AddProperty(name.c_str(), mitk::StringProperty::New("TestRule_othertype"));
  }

  void tearDown() override {}

  void GetRootKeyPath()
  {
    mitk::PropertyKeyPath ref;
    ref.AddElement("MITK").AddElement("Relations");
    CPPUNIT_ASSERT(mitk::PropertyRelationRuleBase::GetRootKeyPath() == ref);
  }

  void IsSourceCandidate()
  {
    CPPUNIT_ASSERT(rule->IsSourceCandidate(mitk::DataNode::New()));
    CPPUNIT_ASSERT(!rule->IsSourceCandidate(nullptr));
  }

  void IsDestinationCandidate()
  {
    CPPUNIT_ASSERT(rule->IsDestinationCandidate(mitk::DataNode::New()));
    CPPUNIT_ASSERT(!rule->IsDestinationCandidate(nullptr));
  }

  void IsSource()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE(
      "Violated precondition (nullptr) does not throw.", rule->IsSource(nullptr), itk::ExceptionObject);

    CPPUNIT_ASSERT(!rule->IsSource(unRelated));
    CPPUNIT_ASSERT(!rule->IsSource(source_implicit_1));
    CPPUNIT_ASSERT(rule->IsSource(source_data_1));
    CPPUNIT_ASSERT(rule->IsSource(source_idOnly_1));
    CPPUNIT_ASSERT(rule->IsSource(source_1));
    CPPUNIT_ASSERT(rule->IsSource(source_multi));

    CPPUNIT_ASSERT(!rule->IsSource(source_otherRule));
    CPPUNIT_ASSERT(!rule->IsSource(source_otherTypeRule));

    CPPUNIT_ASSERT(!abstractRule->IsSource(unRelated));
    CPPUNIT_ASSERT(!abstractRule->IsSource(source_implicit_1));
    CPPUNIT_ASSERT(abstractRule->IsSource(source_data_1));
    CPPUNIT_ASSERT(abstractRule->IsSource(source_idOnly_1));
    CPPUNIT_ASSERT(abstractRule->IsSource(source_1));
    CPPUNIT_ASSERT(abstractRule->IsSource(source_multi));

    CPPUNIT_ASSERT(!abstractRule->IsSource(source_otherRule));
    CPPUNIT_ASSERT(abstractRule->IsSource(source_otherTypeRule));
  }

  void HasRelation()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (source is nullptr) does not throw.",
                                 rule->HasRelation(nullptr, dest_1),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (destination is nullptr) does not throw.",
                                 rule->HasRelation(source_1, nullptr),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT(rule->HasRelation(source_1, unRelated) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(rule->HasRelation(unRelated, dest_1) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(rule->HasRelation(source_otherRule, dest_1) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(rule->HasRelation(source_otherTypeRule, dest_1) == mitk::PropertyRelationRuleBase::RelationType::None);

    CPPUNIT_ASSERT(rule->HasRelation(source_implicit_1, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Implicit_Data);
    CPPUNIT_ASSERT(rule->HasRelation(source_data_1, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_Data);
    CPPUNIT_ASSERT(rule->HasRelation(source_idOnly_1, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(rule->HasRelation(source_1, dest_1) == mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(rule->HasRelation(source_multi, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_ID);

    CPPUNIT_ASSERT(rule->HasRelation(source_1, dest_2) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(rule->HasRelation(source_multi, dest_2) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_ID);

    CPPUNIT_ASSERT(abstractRule->HasRelation(source_1, unRelated) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(abstractRule->HasRelation(unRelated, dest_1) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_otherRule, dest_1) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_otherTypeRule, dest_1) ==
      mitk::PropertyRelationRuleBase::RelationType::Connected_ID);

    CPPUNIT_ASSERT(abstractRule->HasRelation(source_implicit_1, dest_1) ==
      mitk::PropertyRelationRuleBase::RelationType::Implicit_Data);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_data_1, dest_1) ==
      mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_idOnly_1, dest_1) ==
      mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_1, dest_1) == mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_multi, dest_1) ==
      mitk::PropertyRelationRuleBase::RelationType::Connected_ID);

    CPPUNIT_ASSERT(abstractRule->HasRelation(source_1, dest_2) == mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_multi, dest_2) ==
      mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
  }

  void GetExistingRelations()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (source is nullptr) does not throw.",
                                 rule->GetExistingRelations(nullptr),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT(rule->GetExistingRelations(unRelated).empty());
    CPPUNIT_ASSERT(rule->GetExistingRelations(source_otherRule).empty());
    CPPUNIT_ASSERT(rule->GetExistingRelations(source_otherTypeRule).empty());
    CPPUNIT_ASSERT(rule->GetExistingRelations(source_implicit_1).empty());

    auto uids = rule->GetExistingRelations(source_idOnly_1);
    CPPUNIT_ASSERT(uids.size() == 1);
    CPPUNIT_ASSERT(uids.front() == "uid1");

    uids = rule->GetExistingRelations(source_data_1);
    CPPUNIT_ASSERT(uids.size() == 1);
    CPPUNIT_ASSERT(uids.front() == "uid2");

    uids = rule->GetExistingRelations(source_1);
    CPPUNIT_ASSERT(uids.size() == 1);
    CPPUNIT_ASSERT(uids.front() == "uid3");

    uids = rule->GetExistingRelations(source_multi);
    CPPUNIT_ASSERT(uids.size() == 3);
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid4") != uids.end());
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid5") != uids.end());
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid6") != uids.end());

    CPPUNIT_ASSERT(abstractRule->GetExistingRelations(unRelated).empty());
    CPPUNIT_ASSERT(abstractRule->GetExistingRelations(source_otherRule).empty());
    CPPUNIT_ASSERT(abstractRule->GetExistingRelations(source_implicit_1).empty());

    uids = abstractRule->GetExistingRelations(source_idOnly_1);
    CPPUNIT_ASSERT(uids.size() == 1);
    CPPUNIT_ASSERT(uids.front() == "uid1");

    uids = abstractRule->GetExistingRelations(source_data_1);
    CPPUNIT_ASSERT(uids.size() == 2);
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid2") != uids.end());
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid10") != uids.end());

    uids = abstractRule->GetExistingRelations(source_1);
    CPPUNIT_ASSERT(uids.size() == 2);
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid3") != uids.end());
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid8") != uids.end());

    uids = abstractRule->GetExistingRelations(source_multi);
    CPPUNIT_ASSERT(uids.size() == 3);
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid4") != uids.end());
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid5") != uids.end());
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid6") != uids.end());

    uids = abstractRule->GetExistingRelations(source_otherTypeRule);
    CPPUNIT_ASSERT(uids.size() == 1);
    CPPUNIT_ASSERT(uids.front() == "uid9");

  }

  void GetRelationUIDs()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (source is nullptr) does not throw.",
                                 rule->GetRelationUIDs(nullptr, dest_1),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (destination is nullptr) does not throw.",
                                 rule->GetRelationUIDs(source_1, nullptr),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT(rule->GetRelationUIDs(source_1, unRelated).empty());
    CPPUNIT_ASSERT(rule->GetRelationUIDs(source_1, dest_2).empty());
    CPPUNIT_ASSERT(rule->GetRelationUIDs(unRelated, dest_1).empty());
    CPPUNIT_ASSERT(rule->GetRelationUIDs(source_otherRule, dest_1).empty());
    CPPUNIT_ASSERT(rule->GetRelationUIDs(source_otherTypeRule, dest_1).empty());

    CPPUNIT_ASSERT(rule->GetRelationUIDs(source_idOnly_1, dest_1).front() == "uid1");
    CPPUNIT_ASSERT(rule->GetRelationUIDs(source_data_1, dest_1).front() == "uid2");
    auto uids = rule->GetRelationUIDs(source_1, dest_1);
    CPPUNIT_ASSERT(uids.size() == 1);
    CPPUNIT_ASSERT(uids.front() == "uid3");
    CPPUNIT_ASSERT(rule->GetRelationUIDs(source_multi, dest_1).front() == "uid4");
    CPPUNIT_ASSERT(rule->GetRelationUIDs(source_multi, dest_2).front() == "uid5");

    CPPUNIT_ASSERT(abstractRule->GetRelationUIDs(source_1, unRelated).empty());
    CPPUNIT_ASSERT(abstractRule->GetRelationUIDs(unRelated, dest_1).empty());
    CPPUNIT_ASSERT(abstractRule->GetRelationUIDs(source_otherRule, dest_1).empty());
    CPPUNIT_ASSERT(abstractRule->GetRelationUIDs(source_otherTypeRule, dest_1).front() == "uid9");

    CPPUNIT_ASSERT(abstractRule->GetRelationUIDs(source_idOnly_1, dest_1).front() == "uid1");
    uids = abstractRule->GetRelationUIDs(source_data_1, dest_1);
    CPPUNIT_ASSERT(uids.size() == 2);
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid2") != uids.end());
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid10") != uids.end());
    uids = abstractRule->GetRelationUIDs(source_1, dest_1);
    CPPUNIT_ASSERT(uids.size() == 1);
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid3") != uids.end());
    uids = abstractRule->GetRelationUIDs(source_1, dest_2);
    CPPUNIT_ASSERT(uids.size() == 1);
    CPPUNIT_ASSERT(std::find(uids.begin(), uids.end(), "uid8") != uids.end());
    CPPUNIT_ASSERT(abstractRule->GetRelationUIDs(source_1, dest_1).front() == "uid3");
    CPPUNIT_ASSERT(abstractRule->GetRelationUIDs(source_multi, dest_1).front() == "uid4");
    CPPUNIT_ASSERT(abstractRule->GetRelationUIDs(source_multi, dest_2).front() == "uid5");

  }

  void GetSourceCandidateIndicator()
  {
    auto predicate = rule->GetSourceCandidateIndicator();

    CPPUNIT_ASSERT(predicate->CheckNode(mitk::DataNode::New()));
    CPPUNIT_ASSERT(!predicate->CheckNode(nullptr));
  }

  void GetDestinationCandidateIndicator()
  {
    auto predicate = rule->GetDestinationCandidateIndicator();

    CPPUNIT_ASSERT(predicate->CheckNode(mitk::DataNode::New()));
    CPPUNIT_ASSERT(!predicate->CheckNode(nullptr));
  }

  void GetConnectedSourcesDetector()
  {
    auto predicate = rule->GetConnectedSourcesDetector();

    CPPUNIT_ASSERT(!predicate->CheckNode(nullptr));
    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_implicit_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_data_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_idOnly_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_multi));

    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherRule));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherTypeRule));

    auto predicate2 = abstractRule->GetConnectedSourcesDetector();

    CPPUNIT_ASSERT(!predicate2->CheckNode(nullptr));
    CPPUNIT_ASSERT(!predicate2->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate2->CheckNode(source_implicit_1));
    CPPUNIT_ASSERT(predicate2->CheckNode(source_data_1));
    CPPUNIT_ASSERT(predicate2->CheckNode(source_idOnly_1));
    CPPUNIT_ASSERT(predicate2->CheckNode(source_1));
    CPPUNIT_ASSERT(predicate2->CheckNode(source_multi));

    CPPUNIT_ASSERT(!predicate2->CheckNode(source_otherRule));
    CPPUNIT_ASSERT(predicate2->CheckNode(source_otherTypeRule));
  }

  void GetSourcesDetector()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (destination is nullptr) does not throw.",
                                 rule->GetSourcesDetector(nullptr),
                                 itk::ExceptionObject);

    auto predicate = rule->GetSourcesDetector(dest_1);

    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherRule));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherTypeRule));

    CPPUNIT_ASSERT(predicate->CheckNode(source_implicit_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_data_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_idOnly_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_multi));

    predicate = rule->GetSourcesDetector(dest_1, mitk::PropertyRelationRuleBase::RelationType::Connected_Data);

    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherRule));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherTypeRule));

    CPPUNIT_ASSERT(!predicate->CheckNode(source_implicit_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_data_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_idOnly_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_multi));

    predicate = rule->GetSourcesDetector(dest_1, mitk::PropertyRelationRuleBase::RelationType::Connected_ID);

    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherRule));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherTypeRule));

    CPPUNIT_ASSERT(!predicate->CheckNode(source_implicit_1));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_data_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_idOnly_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_multi));

    predicate = rule->GetSourcesDetector(dest_2, mitk::PropertyRelationRuleBase::RelationType::Implicit_Data);

    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherRule));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherTypeRule));

    CPPUNIT_ASSERT(!predicate->CheckNode(source_implicit_1));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_data_1));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_idOnly_1));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_multi));

    predicate = abstractRule->GetSourcesDetector(dest_1, mitk::PropertyRelationRuleBase::RelationType::Connected_ID);

    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherRule));
    CPPUNIT_ASSERT(predicate->CheckNode(source_otherTypeRule));

    CPPUNIT_ASSERT(!predicate->CheckNode(source_implicit_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_data_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_idOnly_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_multi));

    predicate = abstractRule->GetSourcesDetector(dest_1);

    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(source_otherRule));
    CPPUNIT_ASSERT(predicate->CheckNode(source_otherTypeRule));

    CPPUNIT_ASSERT(predicate->CheckNode(source_implicit_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_data_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_idOnly_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_1));
    CPPUNIT_ASSERT(predicate->CheckNode(source_multi));
  }

  void GetDestinationsDetector()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (source is nullptr) does not throw.",
                                 rule->GetDestinationsDetector(nullptr),
                                 itk::ExceptionObject);

    auto predicate = rule->GetDestinationsDetector(source_otherRule);
    CPPUNIT_ASSERT(!predicate->CheckNode(dest_1));

    predicate = rule->GetDestinationsDetector(source_otherTypeRule);
    CPPUNIT_ASSERT(!predicate->CheckNode(dest_1));

    predicate = rule->GetDestinationsDetector(source_implicit_1);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    predicate =
      rule->GetDestinationsDetector(source_implicit_1, mitk::PropertyRelationRuleBase::RelationType::Connected_Data);
    CPPUNIT_ASSERT(!predicate->CheckNode(dest_1));

    predicate = rule->GetDestinationsDetector(source_data_1);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    predicate =
      rule->GetDestinationsDetector(source_data_1, mitk::PropertyRelationRuleBase::RelationType::Connected_Data);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    predicate =
      rule->GetDestinationsDetector(source_data_1, mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(!predicate->CheckNode(dest_1));

    predicate = rule->GetDestinationsDetector(source_idOnly_1);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    predicate =
      rule->GetDestinationsDetector(source_idOnly_1, mitk::PropertyRelationRuleBase::RelationType::Connected_Data);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    predicate =
      rule->GetDestinationsDetector(source_idOnly_1, mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));

    predicate = rule->GetDestinationsDetector(source_1);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(dest_2));
    predicate =
      rule->GetDestinationsDetector(source_1, mitk::PropertyRelationRuleBase::RelationType::Connected_Data);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(dest_2));
    predicate =
      rule->GetDestinationsDetector(source_1, mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(dest_2));

    predicate = rule->GetDestinationsDetector(source_multi);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    CPPUNIT_ASSERT(predicate->CheckNode(dest_2));
    predicate =
      rule->GetDestinationsDetector(source_multi, mitk::PropertyRelationRuleBase::RelationType::Connected_Data);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    CPPUNIT_ASSERT(predicate->CheckNode(dest_2));
    predicate =
      rule->GetDestinationsDetector(source_multi, mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    CPPUNIT_ASSERT(predicate->CheckNode(dest_2));

    predicate = abstractRule->GetDestinationsDetector(source_otherTypeRule);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    predicate = abstractRule->GetDestinationsDetector(source_otherTypeRule);
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));

  }

  void GetDestinationDetector()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (source is nullptr) does not throw.",
                                 rule->GetDestinationDetector(nullptr, "uid1"),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (relation uid is invalid) does not throw.",
                                 rule->GetDestinationDetector(source_1, "invalid uid"),
                                 itk::ExceptionObject);

    auto predicate = rule->GetDestinationDetector(source_1, "uid3");
    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(predicate->CheckNode(dest_1));
    CPPUNIT_ASSERT(!predicate->CheckNode(dest_2));

    predicate = rule->GetDestinationDetector(source_multi, "uid5");
    CPPUNIT_ASSERT(!predicate->CheckNode(unRelated));
    CPPUNIT_ASSERT(!predicate->CheckNode(dest_1));
    CPPUNIT_ASSERT(predicate->CheckNode(dest_2));
  }

  void Connect()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (source is nullptr) does not throw.",
                                 rule->Connect(nullptr, dest_1),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (destination is nullptr) does not throw.",
                                 rule->Connect(source_1, nullptr),
                                 itk::ExceptionObject);

    // check upgrade of an implicit connection
    CPPUNIT_ASSERT(rule->HasRelation(source_implicit_1, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Implicit_Data);
    rule->Connect(source_implicit_1, dest_1);
    CPPUNIT_ASSERT(rule->HasRelation(source_implicit_1, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_ID);

    // check upgrade of an data connection
    CPPUNIT_ASSERT(rule->HasRelation(source_data_1, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_Data);
    rule->Connect(source_data_1, dest_1);
    CPPUNIT_ASSERT(rule->HasRelation(source_data_1, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    std::string name = "MITK.Relations.1.destinationUID";
    auto prop = source_data_1->GetProperty(name.c_str());
    CPPUNIT_ASSERT_MESSAGE(
      "Destination uid was not stored with the correct key. Already existing session should be used.", prop);
    CPPUNIT_ASSERT_MESSAGE("Incorrect destination uid was  stored.", prop->GetValueAsString() == dest_1_data->GetUID());

    // check actualization of an id only connection
    rule->Connect(source_idOnly_1, dest_1);
    CPPUNIT_ASSERT(rule->HasRelation(source_idOnly_1, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT_MESSAGE("Additional relation was defined instead of updating exting one.",
                           rule->GetExistingRelations(source_1).size() == 1);
    name = "MITK.Relations.1.dataHandle";
    prop = source_idOnly_1->GetProperty(name.c_str());
    CPPUNIT_ASSERT_MESSAGE(
      "Data layer information was not stored with the correct key. Already existing session should be used.", prop);
    CPPUNIT_ASSERT_MESSAGE("Incorrect data layer information not stored.",
                           prop->GetValueAsString() == dest_1->GetName());
    prop = source_idOnly_1->GetProperty("referencedName");
    CPPUNIT_ASSERT_MESSAGE(
      "Data layer information was not stored with the correct key. Already existing session should be used.", prop);
    CPPUNIT_ASSERT_MESSAGE("Incorrect data layer information was stored.",
                           prop->GetValueAsString() == dest_1->GetName());

    // check actualization of an existing connection
    rule->Connect(source_1, dest_1);
    CPPUNIT_ASSERT(rule->HasRelation(source_1, dest_1) == mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    CPPUNIT_ASSERT_MESSAGE("Additional relation was defined instead of updating exting one.",
                           rule->GetExistingRelations(source_1).size() == 1);

    // check new connection
    auto newConnectUID = rule->Connect(source_multi, unRelated);
    CPPUNIT_ASSERT(rule->HasRelation(source_multi, unRelated) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    name = "MITK.Relations.5.dataHandle";
    prop = source_multi->GetProperty(name.c_str());
    CPPUNIT_ASSERT_MESSAGE(
      "Data layer information was not stored with the correct key. Already existing session should be used.", prop);
    CPPUNIT_ASSERT_MESSAGE("Incorrect data layer information was stored.",
                           prop->GetValueAsString() == unRelated->GetName());
    prop = source_multi->GetProperty("referencedName");
    CPPUNIT_ASSERT_MESSAGE(
      "Data layer information was not stored with the correct key. Already existing session should be used.", prop);
    CPPUNIT_ASSERT_MESSAGE("Incorrect data layer information was stored.",
                           prop->GetValueAsString() == unRelated->GetName());
    name = "MITK.Relations.5.destinationUID";
    prop = source_multi->GetProperty(name.c_str());
    CPPUNIT_ASSERT_MESSAGE(
      "Destination uid was not stored with the correct key. Already existing session should be used.", prop);
    CPPUNIT_ASSERT_MESSAGE("Incorrect destination uid was stored.", prop->GetValueAsString() == unRelated_1_data->GetUID());

    auto storedRelationUIDs = rule->GetRelationUIDs(source_multi, unRelated);
    CPPUNIT_ASSERT_MESSAGE(
      "Relation uid was not stored for given source and destination.", storedRelationUIDs.size() == 1);
    CPPUNIT_ASSERT_MESSAGE("Incorrect Relation uid was stored.", storedRelationUIDs[0] == newConnectUID);
  }

  void Disconnect()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (source is nullptr) does not throw.",
                                 rule->Disconnect(nullptr, dest_1),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (destination is nullptr) does not throw.",
                                 rule->Disconnect(source_1, nullptr),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (destination is nullptr) does not throw.",
                                 rule->Disconnect(nullptr, "uid"),
                                 itk::ExceptionObject);

    CPPUNIT_ASSERT(rule->HasRelation(source_1, unRelated) == mitk::PropertyRelationRuleBase::RelationType::None);
    rule->Disconnect(source_1, unRelated);
    CPPUNIT_ASSERT(rule->HasRelation(source_1, unRelated) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT_MESSAGE("Data property was not removed.", !source_1->GetProperty("referencedName"));

    rule->Disconnect(source_1, dest_2);
    CPPUNIT_ASSERT(rule->HasRelation(source_1, dest_2) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(this->hasRelationProperties(source_1));

    CPPUNIT_ASSERT(rule->HasRelation(source_1, dest_1) == mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    rule->Disconnect(source_1, dest_1);
    CPPUNIT_ASSERT(rule->HasRelation(source_1, dest_1) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_1, "1"));
    CPPUNIT_ASSERT_MESSAGE("Data of other rule type was removed.",this->hasRelationProperties(source_1, "2"));

    CPPUNIT_ASSERT(rule->HasRelation(source_multi, dest_1) ==
                   mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    rule->Disconnect(source_multi, dest_1);
    CPPUNIT_ASSERT(rule->HasRelation(source_multi, dest_1) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "1"));
    CPPUNIT_ASSERT(this->hasRelationProperties(source_multi, "2"));
    CPPUNIT_ASSERT(this->hasRelationProperties(source_multi, "4"));

    rule->Disconnect(source_multi, "uid6");
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "1"));
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "2"));
    CPPUNIT_ASSERT(this->hasRelationProperties(source_multi, "4"));

    rule->Disconnect(source_multi, "unkownRelationUID");
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "1"));
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "2"));
    CPPUNIT_ASSERT(this->hasRelationProperties(source_multi, "4"));

    rule->Disconnect(source_otherTypeRule, dest_1);
    CPPUNIT_ASSERT_MESSAGE("Data of other rule type was removed.", this->hasRelationProperties(source_otherTypeRule, "1"));
  }

  void Connect_abstract()
  {
    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (abstract does not connect) does not throw.",
      abstractRule->Connect(nullptr, dest_1),
      itk::ExceptionObject);

    CPPUNIT_ASSERT_THROW_MESSAGE("Violated precondition (abstract does not connect) does not throw.",
      abstractRule->Connect(source_1, nullptr),
      itk::ExceptionObject);
  }

  void Disconnect_abstract()
  {

    CPPUNIT_ASSERT(abstractRule->HasRelation(source_1, dest_2) == mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    abstractRule->Disconnect(source_1, dest_2);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_1, dest_2) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_1, "2"));

    CPPUNIT_ASSERT(abstractRule->HasRelation(source_1, dest_1) == mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    abstractRule->Disconnect(source_1, dest_1);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_1, dest_1) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_1, "1"));

    CPPUNIT_ASSERT(abstractRule->HasRelation(source_multi, dest_1) ==
      mitk::PropertyRelationRuleBase::RelationType::Connected_ID);
    abstractRule->Disconnect(source_multi, dest_1);
    CPPUNIT_ASSERT(abstractRule->HasRelation(source_multi, dest_1) == mitk::PropertyRelationRuleBase::RelationType::None);
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "1"));
    CPPUNIT_ASSERT(this->hasRelationProperties(source_multi, "2"));
    CPPUNIT_ASSERT(this->hasRelationProperties(source_multi, "4"));

    abstractRule->Disconnect(source_multi, "uid6");
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "1"));
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "2"));
    CPPUNIT_ASSERT(this->hasRelationProperties(source_multi, "4"));

    abstractRule->Disconnect(source_multi, "unkownRelationUID");
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "1"));
    CPPUNIT_ASSERT(!this->hasRelationProperties(source_multi, "2"));
    CPPUNIT_ASSERT(this->hasRelationProperties(source_multi, "4"));

    abstractRule->Disconnect(source_otherTypeRule, dest_1);
    CPPUNIT_ASSERT_MESSAGE("Data of other rule type was removed.", !this->hasRelationProperties(source_otherTypeRule, "1"));

  }

};

MITK_TEST_SUITE_REGISTRATION(mitkPropertyRelationRuleBase)

redpajama_set_name: RedPajamaGithub


Special insoles featuring silver nano-particles could hold the key to fighting diabetic foot syndrome, according to a new study conducted by Tomsk Polytechnic University researchers. Used to fight ulcers on the feet of diabetic patients, researchers believe this new technique can assist with disinfection, healing and the prevention of foot amputation. "The research has shown silver's antibacterial properties facilitate rapid healing of ulcers and suppurations in patients with diabetic foot syndrome," said TPU Professor Alexey Pestryakov. "The development has passed clinical tests. In patients who had used the insoles impregnated with silver nanoparticles, foot ulcers healed up, and the risk of amputations significantly reduced."
One of the most serious complications for people suffering from diabetes, diabetic foot syndrome occurs due to excess sugar in the body. Up to 15 percent of patients with diabetes are at risk of sustaining ulcers on their feet, and if the ulcers get worse, patients may need amputation. Researchers at TPU have been working with colleagues in Mexico for nearly a decade - a country where diabetic foot syndrome is notably an issue. By developing pharmaceuticals based on silver nano-particles, scientists hope to combat the ill effects of fungi, bacteria and viruses - all of which put the feet of diabetic patients in danger. Researchers also believe that diabetics with potential feet issues can use "smart" socks to help avoid foot ulcers and the complications that can arise from them.


text:
Iceland Supermarket Announces Ban On Palm Oil In All Store-Brand Items
By Aimee Lutkin
One of the U.K.'s biggest supermarket chains, Iceland Foods, announced the end of palm oil in any of their store-brand products. The BBC reports that the chain was brought around by consistent campaigning from Greenpeace organizers, who alerted the company to the devastating effects of palm oil production in South East Asia.
The process has been linked to terrible air pollution, deforestation, and the destruction of habitats for wild animals, like orangutans. According to The Guardian, Bornean orangutan numbers declined in half between 1999 and 2015. For perspective, this means there are now between 70,000 and 100,000 remaining. Indonesia has also become the fourth largest greenhouse gas emissions contributor in the wold, a problem largely associated with the deforestation necessary to create palm oil acres.
Developers have also displaced entire communities by taking over their land, allegedly without consultation or reparations. Though they looked for a solution, Iceland's managing director Richard Walker said the possibility of a "sustainable" palm oil just doesn't exist.
"Certified sustainable palm oil does not currently limit deforestation and it does not currently limit the growth of palm oil plantations," he said. "So until such a time as there is genuinely sustainable palm oil that contains zero deforestation, we are saying no to palm oil."
BREAKING NEWS: We're the UK's first supermarket to commit to removing #palmoil from our own label products by the end of this year! Watch here to find out why...#PalmOilAlarmCall pic.twitter.com/hfGvH2QRDW
— Iceland Foods ❄ (@IcelandFoods) April 10, 2018
I'm proud to announce that @IcelandFoods is the UK's first major supermarket to remove #palmoil as an ingredient in our own label products. Why? Because it's causing extinction to some of the world's most endangered animals. Watch now to learn more! #PalmOilAlarmCall https://t.co/q9viorZwto
— Richard Walker (@IcelandRichard) April 10, 2018
The company is currently fielding questions from confused customers on what the ban will mean for their favorite products and shopping experience. One important question Walker cleared up was a matter of cost. There will be expenses involved in the process of eliminating palm oil, but that cost would not be passed to customers; it will be absorbed by the company.
"There will be an extra cost but we think it's the right thing to do," he said.
Hi, currently 50% of all supermarket products currently contain palm oil. We're busy working behind the scenes to replace palm oil in all of our own label products, by the end of 2018. We're speaking to our branded suppliers & encouraging them to make the positive change too.
Hi Amanda, thanks for your question. The replacement oil is different for different products, meaning that there is a mix of oils and fats that don't damage rainforest. We're using ingredients like; sunflower oil, rapeseed oil, butter and lard.
Hi there, thank you for your message. Please rest assured that our use of plastic is currently being reviewed as we plan to be plastic free by 2023. Kind regards
Though palm oil production is known as a serious environmental problem in activist circles, there isn't much public awareness of the issue. In a U.K. survey, a third of the people questioned didn't know what palm oil is. However, it appears in about 71 percent of processed food products, 24 percent of consumer goods, and is used as a biofuel. Once informed, 85 percent of consumers said they did not want palm oil in their food products.
So far, Iceland Foods says they've replaced palm oil in 50 percent of their store-brand products that contain it and are tinkering with recipes for the rest. They do warn that they are not discontinuing the sale of all products that contain palm oil, only those made in-house. But Iceland Foods specializes in frozen and prepared foods, so they're overhauling quite a lot—and signaling to other food producers that a serious change needs to be made everywhere.
What Is Fast Fashion?
Why Are Plastic Straws Bad for the Environment?
A 3D-Printed Neighborhood Is Being Printed for Low-Income Families


The recent announcement of Shakespeare and Company's "Paris Literary Prize," to be awarded to the best novella by an unpublished writer, set me thinking about my inspiration to go into publishing: Shakespeare and Company's founder Sylvia Beach. (Like many teenagers with literary aspirations, I spent an intense few months working for the bookshop's current owner, George Whitman.) Beach's Paris bookshop and lending library was more than just a space where writers could meet and find inspiration; it became a publishing house as well when Sylvia stepped into the breach to produce the first edition of James Joyce's Ulysses. Sadly, without a mother in Princeton to whom I could cable "Opening bookshop in Paris. Please send money," I was forced to take a more conventional route into publishing: I got a job as an editorial assistant at Chatto & Windus, an imprint of Random House UK. And given that I was unexcitingly conventional, it was initially hard to see how I could inspire writers to want to work with me. I couldn't give them an exotic bookshop to hang out in, or—at that point—sign up their novels and trumpet them to influential friends in the media. The only thing of value I had to offer, I decided, was my willingness to read their books closely and carefully, and to make suggestions about how those books might be improved. Thus began my attempt to teach myself to be a good editor.
Her daring lies in selling.
As the digital revolution reconfigures the publishing industry, the role of editor will come under increasing scrutiny. What is a publishing house? Is it a machine for production, distribution and sales, or is it a nurturer of talent? For a long time now, publishers have aimed to keep all these attributes under one roof, but the task is becoming increasingly difficult. The "demise of the editor" has been a frequent lament in Britain and America over the past twenty years as the economic imperatives of large-scale publishing necessitate the prioritization of marketing over the costly, time-consuming process of working on texts to make them as good as they can be. The massive increase in the number of literary agents has been, in part, a response to the failure of publishers to give authors enough editorial time, itself in part a catalyst in the breakdown of close author-editor relationships. The editor's role is threatened still further by the difficulty of generating income from e-books. When authors argue that their e-book royalties should be higher because productions costs are lower, they open a can of worms about overheads, because of course producing a text doesn't just involve the cost of printing, paper, and postage: in the large organizations, where overheads are extremely high, those responsible for efficiency savings may well start to think that the often-invisible work done by editors is something that can be cut. As Alberto Rollo, who directs the Italian fiction list for Feltrinelli, said, when I asked him about the editor's role in Italy: "There is no e-book without asking ourselves what writing means, what editing means, and, yes, what publishing means." And so, at the beginning of the first post-iPad year, I thought it might be interesting to ask editors around the world how their work compares to that of editors in other countries, and how they envisage the future.
An editorial suggestion from a fellow writer may well be easier to take than one from a less-qualified reader, but it also comes freighted with the aesthetic preoccupations of that particular writer. In Italy, as in France, the writer-editors were the directors of "collections," bringing together books that fitted their perception of good literature. The story of how the classic Italian novel Tomasi di Lampedusa's The Leopard came to be published is legendary and involves two writer-editors: Elio Vittorini and Giorgio Bassani. Vittorini turned The Leopard down for Mondadori because it contravened what he thought the novel should be: for a communist like Vittorini, The Leopard's classical realistic style and cynical philosophy of history were a betrayal. Giorgio Bassani, on the other hand, recommended the novel for publication at Feltrinelli. It went on to become perhaps the most successful book ever published in Italy.
In this instance, Vittorini and Bassani were not acting as editors in the sense that I have been using the term, but rather as professional readers and publishers. Indeed I discovered from Feltrinelli editor Alberto Rollo that the term editor only came into the Italian vocabulary in the early nineties. Before then, there was the redattore: someone who organized the copyediting and proofreading of a manuscript, but without a close creative relationship to the author. The term redattore with its Latin root is echoed in the word for editor in many European languages. For English speakers, it might have slightly sinister connotations in that the verb "to redact" is now used widely to mean "to censor." Editors can certainly play a role in censorship. They did in the Soviet Union, and in China it is still part of the editor's job to make sure a text doesn't say things it shouldn't. Chinese authors I have worked with in translation have been initially suspicious of my intentions, thinking I might be going to somehow censor their texts by "Westernizing" them. One might argue, as the Chechen author German Sadulaev does in a recent blog he wrote for Harvill Secker, that the commercial constraints of crowd-pleasing also create a kind of censorship. From time to time I've had to calm authors' fears that I might want to dumb their text down.
Censorship, however, is the polar opposite of what Alberto Rollo is thinking of when he describes what has happened with the transition from redattore to editor. According to Rollo, the rise of the "professional editor" in Italy is closely allied to the relatively recent arrival of the narrative-driven novel in Italian fiction. Paradoxically it was Umberto Eco, one of the main advocates of the anti-narrative neo-avant-garde, who "crossed the frontier" with The Name of the Rose in 1980, and opened up a whole new way of writing for Italian novelists. Rollo's excitement when he describes this development is palpable: suddenly authors feel able to be helped, and editors are empowered to help. He talks of how, over the last twenty years, "editors and writers have learned and changed together. Working alongside. Trying to understand together how to deal with that strange and still mysterious thing: the telling of a story." The result is a new professional identity for the Italian editor, borrowed from the American publishing industry.
It is clear that there is a strong link between the strength of a novelistic tradition in a country and the power of the editor. André Gaspard of Saqi Books cites the fact that novels are a relatively new literary form in the Arabic language as one of the reasons why there is no strong editorial tradition in the Arabic world. In India it is in English-language publishing that editing thrives, partly because other Indian languages have different publishing traditions for fiction (serialization in magazines, or authors' cooperatives for example) but also because of the predominance of the novel. Several Indian editors mentioned David Davidar's impressive work with Vikram Seth on A Suitable Boy. The influence of British and American ways of publishing is evident here, and it goes without saying that the "American editor" is always held up as the supreme example of someone capable of knocking a novel into shape. As I researched this piece, I began to realize that the history of a tradition that culminated in the likes of Maxwell Perkins was more a subject for a PhD thesis, and not something I could do justice to here. Hans Jürgen Balmes of Fischer in Germany traced a line for me from Erasmus and Manutius to great nineteenth-century German publishers like Rudolf Steiner, who responded to the rise in literacy and concomitant demand for affordable literature. He talked of the founding of S. Fischer Verlag in 1886 and the proprietor's lifelong friendship with Thomas Mann. Clearly these traditions had a major influence on American publishing, which in turn sent its influence back, exporting not only inspiring novels but the idea of the creative editor.
But if a novelistic tradition is a prerequisite for strong editors, then so is an economy that can a) afford the luxury and b) values that luxury. In Holland you can study the practicalities of editing at university. In Denmark, the National Writers' School teaches students to "expect sparring with their editors," as Johannes Ries of Gyldendal puts it. In both these countries, the skills learned on such courses can be put into practice within publishing houses. In Russia, however, the picture is somewhat different. Moscow's Institute of Literature nurtures young editors but, according to agent and translator Elena Kostioukovitch, the editors trained there can't find jobs because the post-Soviet publishing industry is too young to have developed an editorial tradition. Instead it concentrates on printing as many titles as possible with as low production costs as possible. In such an environment the "editor" has to become marketeer, concentrating on writing copy and finding publicity opportunities for authors.
This kind of ruthless commercialism is only just beginning to affect editors in places like Holland and Germany. Hans Jürgen Balmes writes of how "more and more tasks are being piled on an editor's desk, making him or her look like the production manager of a very complicated process, and leaving little time to attend to the author's needs." But he doesn't believe the switch from "editor" to "production manager" has yet been fully implemented. It is only "on the horizon," says Balmes, and he would be unhappy if it took place. Enrique Murillo is less sanguine about the relationship of Spanish publishing houses to their editors. "In Spain, editors are like pigs in a sausage factory: they smell bad, but are hard to dispense with. Nevertheless, efforts to get rid of them are proving more and more successful. In some of the big corporate companies, an editor is merely someone who reads readers' reports, not even books." For Murillo, hope is to be found in a new crop of small, independent publishing houses, his own included, where time is taken to work with authors, and it is definitely a current trend that the creative relationship between writer and author is starting to migrate away from large publishing companies.
Generalities are dangerous, though, when discussing a profession that is so much about individuals and personal relationships. British and American editors often mention a belief that, in other countries, editors don't edit, but this wasn't borne out by my conversations with foreign publishers. One thing that characterized all the editors I contacted was their eagerness to talk about the subject of editing, and their passion for what they did. They all had stories of exceptional editors: Carlos Barral, who brought modern literature to Spain in the fifties and sixties and to whom Vargas Llosa attributes lots of helpful suggestions about his work; or Grazia Cherchi in Italy—by all accounts an extraordinary woman, who nurtured the likes of Stefano Benni and Alessandro Baricco, following their novels through many drafts, visiting them in their homes, holding dinners for them to introduce them to useful people. Clara Capitão quotes the major Portuguese novelist António Lobo Antunes as saying that "in Portugal, it is more difficult to find a great editor than a great writer." But this was in the context of his lament for the untimely death of his editor, of whom he said that it was almost inconceivable for him to go on working without her.
Amy Spangler, an agent who represents Turkish authors, believes the alchemy needs a third element: the reader. She is optimistic about the future of editing in Turkey. As she sees it, "a currently burgeoning mass of discerning readers will demand better of their publishers, and therefore publishers will be forced to allow their editors more time to help shape individual titles. Writers in turn will have to get used to being more open to criticism and taking advice. Call it utopian if you wish, but that is my vision." I confess it is my vision, too, otherwise I might have given up by now. In a book I am publishing later this year, This is Not the End of the Book, Umberto Eco talks of how, for a writer, a book is never really finished, and how digital publishing opens up the possibility of giving the reader access to a continually developing text. It is true that the perfect text is an impossible ideal, but to my mind the one thing that will remain constant in the rapidly evolving industry in which I work is that writers will always want someone to talk to about how to make their texts better. That person might work in a publishing house, but they might equally well work in an agency, a bookshop such as Shakespeare and Company or, like Grazia Cherchi, at a series of café tables. The important thing is that this person has a desire to put aside their own prejudices in order to immerse themselves in another's creativity, and help that creativity find form. And fortunately there are people like that everywhere.
Copyright 2011 by Rebecca Carter. All rights reserved.


First thing's first, don't be alarmed by the amount of ingredients listed here! It looks like a lot, and it is, however, your best bet is to take yourself directly to the deli section of your local supermarket and load up at the Olive Bar. You can get about 3 or 4 pints of an array of the ingredients above, which is what I did the first time I made this dish. And, the good thing about cooking, as opposed to baking, is that you can leave out whichever ingredients you don't like or can't find, and you can make this delicious appetizer to your own likes and tastes! Also, there is absolutely no actual "cooking" involved in this dish, it's mostly "assembling", so if you are looking for something really quick to take to your next party, this is it!
Start by arranging the sliced bread on a baking sheet, drizzle with some olive oil, and sprinkle with dried parsley. Put the bread into a 400-degree oven, and bake until golden brown. Keep an eye on it, it'll burn fast, if you let it!!
Next, make sure all of the ingredients are chopped to an appropriate size to fit into a food processor.
Using a mixture of the first 10 ingredients, drop all of them down into a large food processor. Start to pulse, and stream in about 3 tablespoons of olive oil while the processor is going. Pulse until the ingredients are minced finely.


text:
by Rhett A. Butler, mongabay.com, May 18, 2011
New Brazilian government data shows an area of Amazon rainforest 10 times the size of Manhattan was cleared in the past 2 months.
New data from the Brazilian government seems to confirm environmentalists' fears that farmers and ranchers are clearing rainforest in anticipation of a weakening of the country's rules governing forest protection.
Wednesday, Brazil's National Space Research Agency (INPE) announced a sharp rise in deforestation in March and April relative to the same period last year. INPE's rapid deforestation detection system (DETER) recorded 593 square kilometers of forest clearing during the past two months, an area of rainforest 10 times the size of Manhattan and a 473% increase over the 103.5 sq km chopped down from March-April 2010.
81% of the recent clearing occurred in Mato Grosso, the southernmost state in the Brazilian Amazon that has accounted for more than 35% of the region's deforestation since 1988.
INPE's announcement comes a day after Imazon, a research institute that also tracks deforestation, reported a big percent increase in clear-cutting. Imazon also found a surge in forest degradation, the logging, burning, and thinning of forest that often precedes deforestation.
The short-term deforestation tracking systems used by INPE and Imazon are used primarily for law enforcement [show me who was ever prosecuted!]. Both rely on relatively coarse satellite resolution, making them faster but less accurate than the systems used to determine annual deforestation, which is estimated every August. Month-to-month deforestation can be highly variable in Brazil, by clearing usually peaks in the dry season between July and October. High rates of clearing in April is unusual.
The increase in deforestation in April is thought to be linked to the current debate over Brazil's forest code, which requires land owners to maintain 80% of their holdings as forest in the Amazon region. Anticipating a weakening in the code [no, they just took advantage of the fact that it was not flooding] that would grant amnesty for deforestation, farmers and ranchers have been clearing swathes of forest [with the money they'll get from the timber, they will have more than enough to put money in the pockets of the politicians and amnesty won't even matter -- rich people in Brazil do not go to jail]. Dry conditions, lingering from last year's worst-ever drought, have exacerbated the situation.
Deforestation in the Brazilian Amazon is typically driven by industrial agriculture and land speculation. More than 70% of deforested land ends up as cattle pasture.
High commodity prices typically create incentives for deforestation. [Uh, that would be lack of any law enforcement in those regions where nearly all politicians are being bribed.]
http://news.mongabay.com/2011/0518-inpe_amazon.html
Labels: Deforestation
Lou Gold said...
Please - this is so important - go to this site to sign a petition to the Brazilian government. International scrutiny is needed in support of the many Brazilian forest defenders who are trying to stop this destruction:
http://lougold.blogspot.com/2011/05/urgent-amazon-forest-alert-events-are.html


O'NEILL, Joseph Kenneth "Ken" – Surrounded by the love of his family and his Davis Court Family, Ken O'Neill passed away at the John Noble Home on Saturday April 7, 2012 in his 86th year. Predeceased by his wife Mary Elizabeth O'Neill (2010). Beloved father of Tina Stickle and her husband Gary, Brantford and Laurie O'Neill, Paris. Cherished grandfather of Michael O'Neill, Brooke, Scott and Luke Emerson, Ryan, Christopher, Kristal, Brittaneigh and Joshua Stickle and great grandfather of Taylor, Morrigan, Karson and Mya. Ken is survived by his sisters Margaret and Betty in England and was predeceased by his four brothers. Dearly missed by Paul and Brenda Emerson. Ken retired from the Willett Hospital. In retirement Kenny didn't do "a dam thing!" Ken will be remembered as the guy who gave out quarters, paper airplanes and for having too many accidents on his bicycle. Ken was a 60 year member of the Royal Canadian Legion Branch #29 in Paris.