text:
Facebook Stock Dips as Employees are Able to Sell Shares
After Facebook saw its stock prices rise after better than anticipated Q3 results, employees got their first chance to sell off their pre-IPO stock. Despite a lack of concrete numbers, it's clear that plenty of people did sell, and stock dipped a bit. According to CNET, Facebook's stock traded at nearly twice its normal volume and ended up down just under 4%.
#Sandy: The Social Media Storm
Like millions of people up and down the east coast of the United States, I spent Monday night bouncing between my television screen, my window, my iPhone, and my laptop screen. I was lucky enough to keep power until after midnight - though I woke up to a dark house - and so like the rest of the country, I kept tabs on the "Frankenstorm" with the help of multi-media. If your power was out, your mobile device may have been your only connection to the outside world.
Posted Oct 30, 2012
Facebook Stories: A Stroke of Content Marketing Genius?
So, have you seen Facebook Stories yet? I know you've probably heard about it, but have you actually bothered to look at it? No? Let me tell you all about it.It's a fascinating display of the power of social media on people's lives and, to some extent, on journalism. But it's also sort of a genius marketing tool.
LinkedIn Introduces Video Ads
LinkedIn has been introducing a lot of change lately, starting with profile changes earlier this year. Now, the social network aimed at professionals is adding videos ads to its self-service interface. The videos ads are available now, through LinkedIn Ads, the DIY ad platform for marketers of all sizes.
The New Era of Social TV
Social TV is on fire. Social media behaviors related to prime time TV viewing surged 194% between April 2011 and the same month this year according to recent data from Trendrr, the social-media monitoring firm. Yet Social TV is not entirely new. The phenomenon first emerged a little over two years ago when hashtag usage reached critical mass on Twitter and the company introduced "Trending Topics" on its front page.
Facebook Beats Q3 Expectations, Sees Stocks Soar
Facebook's post-IPO struggles can be baffling to the average person. How can a company with over a billion active users be experiencing so much trouble with its stock price--and revenue building in general? But those troubles may be behind the social network after a better than expected third quarter earnings report. And in a flurry of not-so-great earnings news from other companies, Facebook is reaping the benefits.
Addressing the Challenges of Social Media in a Global Market
Social media has provided us with a world with no boundaries and has allowed small companies to dream of having a global reach. But, along with opportunities come challenges-chief among them is navigating the tricky terrain of communication and social differences in diverse geographies. In 2010, Buddy Media, Inc., a New York City-based software-as-a-service company that works with some of the top global advertisers, conducted a study that looked at the gap between the perceived potential of global social media and the actual level of achievement. The survey of 105 Fortune 1000 brand managers was conducted by Harris Interactive, Inc. While 72% of respondents indicated that social media offers great opportunity to reach existing and potential customers around the world, they also indicated that they were lacking the tools and information necessary to leverage global social media effectively.
How Digital Professionals Can Manage Online Reputation
Regardless of industry or niche, reputation is one of the most precious commodities that a working professional has. It can take months, even years to build up a strong, positive reputation; then, the whole thing can come crashing down, in an instant. This has never been truer than it is now, in the age of Google, Facebook, and Yelp.com: A bad review or a defamatory post can make its way onto the web and all but destroy a person's image.
Flowsee - The Sharing Network Launches
Flowsee is based on an entirely open and democratic design concept, users have the chance to interact, not only with each other, but to prioritize their choice of content. Users of the website are invited to create pages on any topic that interests them or that they wish to publicize.
Facebook Says Anonymous Not Behind European Outages
If you were in Europe on Friday and found that you couldn't access your Facebook account, you may have Anonymous to blame. Twitter users Portugal, Sweden, Ireland, and Norway reported Facebook outages. Subsequently, a Twitter account associated with the hacking group claimed responsibility, according to CBS News.
A Guide to Globalization: Localization and Translation Tools
The World Wide Web has forever changed the way companies of all sizes do business. From the smallest mom-and-pop shop to the largest enterprise, the internet has not only made it easier for companies to grow, but it has added new concerns. To be sure, the web is the great equalizer. In the past, only a select few corporations operated on a global scale, but the web has made it possible for organizations in Peoria, Ill., to sell goods and services to those in Prague. While leveraging the web to deliver the right information to the right people at the right time may seem relatively straightforward, it is not.
TweetDeck Gets a Makeover
As it turns out, Twitter hasn't just been concentrating on its own updates. On Wednesday, the company released TweetDeck updates. The most notable change will be the new lighter, brighter look - which you can get a look at on Twittter's blog.
Secret Ingredient #2 for Creating Viral Content -- Korean Pop Dance Moves
Take some flashy Korean Pop dance moves, throw in a horse barn, bus, and elevator, and mix them all up with some banging beats, and the tasty result will be the Gangnam Style music video. With almost 430 million views in the span of two months, Korean Pop star PSY has destroyed most YouTube records. Park Jae-sang, better known by his stage name PSY, has gone from a successful South Korean artist to a worldwide superstar since July. Whether you have seen the plethora of remixes on the web, watched various TV personalities do their own sad renditions, or heard your friends contemplating dressing up as PSY for Halloween, it's safe to say you have probably seen the video. If not take a few minutes and watch it now .
Facebook Rolls Out Collections
Just in case your online shopping carts don't make buying easy enough for you, Facebook is combining the visual interest of Pinterest with the purchasing power of Amazon. The social network rolled out "Facebook Collections" to some users - though it hasn't said how many - on Monday, October 8.
Ganxy Aims to Aid Publishers in Selling Across Web and Social Platforms
Ganxy announced the launch of its Showcase service which offers a consistent interactive display across diverse marketing channels where readers can browse, buy, and connect with authors and publishers.
Ebuzzing Announces New Dashboard for Social Video Measurement
Ebuzzing announced the launch of its new social video dashboard service that has been specifically designed to transform the measurement of video campaigns and provide new metrics for quantifying and qualifying ROI. Ebuzzing uses its technology to measure the reach, impact, tonality, sentiment, and share of voice of a social video campaign providing brands with a picture of the true value of social video campaigns.
LinkedIn Lets Users "Follow" a Select Few
LinkedIn is taking a page out of Twitter's book...sort of. The social networking site for professionals is not letting users follow other users, but only a select few. LinkedIn has curated a list of users it believes are well-known and have a global reach, according to StudentWise. The social network is starting with a list of about 150 people.
Changing the Way Books Are Found, Acquired, and Published
Digital technology has broken down many barriers for new authors trying to break into the book publishing business. Ebooks and online publishing tools offer relatively easy and inexpensive ways to self-publish, and the internet provides a virtual platform from which to potentially grab the attention of a worldwide audience, including those seemingly elusive book editors and literary agents.
MAZ Digital Publishing Platform Integrates Pinterest Sharing Capabilities On Ipad
For most magazine readers, the physical experience of flipping through glossy pages and tearing out the things you want to share is the part they love the most. Now, readers can experience the joy of clipping and sharing content in the digital world as well, with a new feature from the MAZ platform called "Clippings."
Nimble Updates its Social Relationship Manager
Nimble, a social relationship manager, announced its latest version of Nimble, which integrates social selling discovery, engagement and collaboration. Nimble was designed entirely with customer engagement in mind and empowers companies to nurture their customers through social listening and engagement, helping them turn their social communities into customers for life.
Twitter Expands Discover Tab
Twitter has been on an announcement spree lately. Most recently, Twitter said it would expand the Discover tab. Twitter added the tab last December, billing it as a place where users could go to find tweets that were relevant to them. Now, according to a blog post, "when you visit the Discover tab on twitter.com, you'll see a continuous stream of Tweets, which automatically expand to show you the most relevant stories and most engaging photos."
Social Butterflies: Facebook's Biggest Competitors
America loves its Facebook. According to comScore, Inc., the social network had 158.01 million unique visitors in the U.S. in May 2012. Believe it or not, that represented a slight decline in the number of visitors. Despite its popularity, Facebook has some competitors out there, and they may just be stealing a bit of attention from the leader in social networking.
When Facebook Contests Go Bad
A while back I entered my dog in GNC's Healthy Pet, Happy Pet Photo Contest on Facebook. I had not previously "liked" GNC, but I did so for the purposes of entering the contest and possibly winning $5,000. I uploaded her picture and filled out a bunch of information. Once I was done, I started sharing the contest with my Facebook friends and family, urging them to vote for Maybelle. This is where the contest went terribly awry. At first, we couldn't actually find my dog. It took about 24 hours before her picture appeared at all. When it finally did show up, I tried sharing the direct link to her profile. But no matter what I did (i.e., grab the link, use the Share button), anyone who clicked on it ended up somewhere other than Maybelle's voting page.
Rwanda Digitizes Memories of Genocide for the World
Rwanda, the tiny East African nation that is synonymous with the infamous 1994 genocide -- in which close to one million people were slaughtered in a bloody ethnic cleansing that lasted about 100 days -- has made giant strides on a path towards national reconciliation and recovery. Today, the country is on a grand march towards socio-economic growth that has been spurred by favorable government policies and investor confidence.However, the Rwandan government has learned valuable lessons from its troubled history and has been working hard toward collating and collecting data from before, during, and after the genocide with a view to using this information to educate not only the Rwandans, but also the entire world on what political and ethnic hatred can do to a people.
The Comeback of Branded Entertainment
Branded entertainment is back with a vengeance. Companies across multiple consumer verticals have been creating engaging long-form digital video content and harnessing the power of social media on PCs and mobile devices to engage consumers and reach mass audiences. Some examples of the current trend from this past Summer alone include campaigns from Ford ("Random Acts of Fusion") Intel and Toshiba ("The Beauty Inside"), Subway ("The 4 to 9ers" and IKEA ("Easy to Assemble"). Moreover it's becoming clear that these aren't one-time efforts. IKEA, for example, has reported that it currently dedicates 2% to 3% of its global marketing budget on branded entertainment and a former Procter & Gamble executive reported to The Wall Street Journal that the brand-marketing giant is now spending 5% of its marketing budget in this area.


Today a wonderful friend of mine has come over here to teach us about the Goddess Hestia, of the home and hearth. My motto at the moment is "Messy bed, messy head," and I have definitely been feeling this way. My home is so off balanced and I feel so unmotivated to do anything about it, so I asked Dominee to help me out! I hope you all enjoy!
I have always been fascinated by the Greek Goddess, Hestia, Goddess of the hearth and home. I think she first appealed to me as a teenager because I identified with her introverted nature. She was mysterious, she was known for her kindness and charity amongst the Gods, and unlike the other Goddesses there wasn't anything scandalous or even overly interesting about her. She was kind of like me, yet she was still a Goddess. I thought that was pretty great.
Hestia is also known for giving up her seat on Mount Olympus for the God Dionysus so that she could devote all of her time tending the sacred fires. Which speaks to her giving nature and her dedication to her duties.
It was tradition when moving into a new home to evoke Hestia and ask for her blessing. Often times, the Greeks would take the hearth fire flame from their old home and bring it to the new as a representation of Hestia's protection.
I first began to form a bond with Hestia in the midst of a very severe period of depression. I wasn't taking care of myself and all aspects of my life suffered. I lived by myself and as a result of my depression, I lost all will to tidy up or care about my surroundings. After a few months I finally found the will to clean.
And it felt good. It felt magical.
It was just a small spot in my living room but that spot of cleanliness and organization made me feel good. I realized that taking care of my surroundings was in essence allowing me to take better care of myself. I began to research ways to bring more of that magic into my home.
Don't just clean, make it a sacred experience. Add things to your housekeeping routine that make you feel good and make it fun for you, listen to music or dance while you clean. Add essential oils to your cleaning supplies or put crystals around your home for protection or to create a happy atmosphere.
Cleanse your surroundings of negative energies. Energies build up in our homes and can easily affect our moods. You can cleanse your space with sound, with incense, with prayer, and guided visualization. One of the most popular ways, and my favorite, is to use a bundle of sage and other herbs. Sage is easily found at any metaphysical shop and is wonderful at making your space vibrate with positive energy.
You can also create a small altar to Hestia on top of your fireplace or in your kitchen. This represents the Hearth aspect. Light a candle there and ask Hestia to bless your home and to watch over your family.
If you are having trouble finding the motivation to do chores try asking Hestia for assistance, she will give you just the push that you need to get housework done. Any activities that involve the home, such as cleaning, cooking, redecorating, can all benefit from a touch of Hestia Magic.
Invite the warm, loving, constant, flame of her love into your life.
Dominee at BlessingManifesting.com is a self-love advocate, encouraging women to love themselves, their bodies, and each other. She is a Life Coach, Blogger, Aroma- and Crystal therapist and she uses her unique outlook on life to help others embrace wholeness and wellness as well as learn how to love themselves.
Thank you so much Dominee!! I really needed to hear this post, and I am going to try all of your suggestions!
May Hestia bless all our hearths and homes!
Posted in "Goddess", "Guest Post", "Hestia", "hearth and home"


Take a baguette, toast it, then rub some garlic over it and then rub a tomato all over. Drizzle with EVOO. Lastly, put on either pesto or "tapenade" which is a paste made of olives, capres, vinager, oil, and herbs.
Next was another simple, baguette-based "dish." Basically, you toast a baguette, spread goat cheese all over, drizzle honey on top (amazing combination, by the way), and then sprinkle on some "provincial" herbes. Quick and tasty!
Lastly, we made crepes, which really isn't so difficult—even without the wooden tool you normally see used to quickly flatten out the batter right when you pour it on the hot pan.
For those who may be unfamiliar with the treat, crepes are usually equated to "flat pancakes." They can be filled with sugar, cinnamon, nutella, etc. for a sweet treat, or made into a savory meal with fillings like ham, cheese, chicken, etc.


text:
Lack of evidence of association of p21(WAF1/CIP1) polymorphism with lung cancer susceptibility and prognosis in Taiwan
Chuen Ming Shih, Pey Tzy Lin, Hui Chun Wang, Wei Chi Huang, Yi Ching Wang
藥理學科暨藥理學研究所
43 引文 斯高帕斯(Scopus)
An association between the Arg allele of the p21(WAF1/CIP1) codon 31 polymorphism and lung cancer has been reported. However, the genotype distribution of the p21 codon 31 polymorphism, as well as the association of this polymorphism with lung cancer risk and prognosis, remain undefined in the Taiwanese population. Therefore, we investigated the genotype distribution of the p21 codon 31 polymorphism in 155 lung cancer patients and 189 non-cancer controls. The genotype frequencies in the Taiwanese non-cancer controls were 0.51 (Ser) and 0.49 (Arg). χ2 analysis indicated significant differences in Taiwanese genotype distribution of p21 from those reported for Swedes (P = 0.001), Caucasians (P = 0.001), Indians (P = 0.001), and African-Americans (P = 0.001). However, our data did not demonstrate an association of the Arg allele of the p21 polymorphism with lung cancer risk in Taiwan. Lung cancer patients with Ser/Arg and Arg/Arg genotypes were at a nonsignificant 1.15-fold increased risk of lung cancer when compared to individuals with the Ser/Ser genotype (95% CI, 0.70-1.86). In addition, although p21 is a downstream target of p53, we found no significant correlation of the p21 polymorphism with the p53 polymorphism and p53 gene mutation in lung cancer patients. We further investigated the association of the p21 polymorphism with prognosis in 154 lung cancer patients. Patients with the Ser/Ser genotype tended to have a poorer prognosis than those with the Ser/Arg and Arg/Arg genotypes (P = 0.097, by the log rank test). Our data suggest that the p21 codon 31 polymorphism may not play a significant role in cancer susceptibility and the prognosis of lung cancer patients in Taiwan.
頁(從 - 到)
頁數
Japanese Journal of Cancer Research
卷
發行號
出版狀態
此研究成果有助於以下永續發展目標
存取文件
其它文件與鏈接
深入研究「Lack of evidence of association of p21(WAF1/CIP1) polymorphism with lung cancer susceptibility and prognosis in Taiwan」主題。共同形成了獨特的指紋。
Lung Neoplasms Medicine & Life Sciences 80%
Genotype Medicine & Life Sciences 64%
Codon Medicine & Life Sciences 44%
Alleles Medicine & Life Sciences 16%
p53 Genes Medicine & Life Sciences 12%
Mutation Medicine & Life Sciences 6%
Population Medicine & Life Sciences 4%
引用此
Shih, C. M., Lin, P. T., Wang, H. C., Huang, W. C., & Wang, Y. C. (2000). Lack of evidence of association of p21(WAF1/CIP1) polymorphism with lung cancer susceptibility and prognosis in Taiwan. Japanese Journal of Cancer Research, 91(1), 9-15. https://doi.org/10.1111/j.1349-7006.2000.tb00854.x
Shih, Chuen Ming ; Lin, Pey Tzy ; Wang, Hui Chun 等. / Lack of evidence of association of p21(WAF1/CIP1) polymorphism with lung cancer susceptibility and prognosis in Taiwan. 於: Japanese Journal of Cancer Research. 2000 ; 卷 91, 編號 1. 頁 9-15.
@article{44b67e676fcf4e368811be1831776869,
title = "Lack of evidence of association of p21(WAF1/CIP1) polymorphism with lung cancer susceptibility and prognosis in Taiwan",
abstract = "An association between the Arg allele of the p21(WAF1/CIP1) codon 31 polymorphism and lung cancer has been reported. However, the genotype distribution of the p21 codon 31 polymorphism, as well as the association of this polymorphism with lung cancer risk and prognosis, remain undefined in the Taiwanese population. Therefore, we investigated the genotype distribution of the p21 codon 31 polymorphism in 155 lung cancer patients and 189 non-cancer controls. The genotype frequencies in the Taiwanese non-cancer controls were 0.51 (Ser) and 0.49 (Arg). χ2 analysis indicated significant differences in Taiwanese genotype distribution of p21 from those reported for Swedes (P = 0.001), Caucasians (P = 0.001), Indians (P = 0.001), and African-Americans (P = 0.001). However, our data did not demonstrate an association of the Arg allele of the p21 polymorphism with lung cancer risk in Taiwan. Lung cancer patients with Ser/Arg and Arg/Arg genotypes were at a nonsignificant 1.15-fold increased risk of lung cancer when compared to individuals with the Ser/Ser genotype (95% CI, 0.70-1.86). In addition, although p21 is a downstream target of p53, we found no significant correlation of the p21 polymorphism with the p53 polymorphism and p53 gene mutation in lung cancer patients. We further investigated the association of the p21 polymorphism with prognosis in 154 lung cancer patients. Patients with the Ser/Ser genotype tended to have a poorer prognosis than those with the Ser/Arg and Arg/Arg genotypes (P = 0.097, by the log rank test). Our data suggest that the p21 codon 31 polymorphism may not play a significant role in cancer susceptibility and the prognosis of lung cancer patients in Taiwan.",
author = "Shih, {Chuen Ming} and Lin, {Pey Tzy} and Wang, {Hui Chun} and Huang, {Wei Chi} and Wang, {Yi Ching}",
doi = "10.1111/j.1349-7006.2000.tb00854.x",
journal = "Cancer Science",
Shih, CM, Lin, PT, Wang, HC, Huang, WC & Wang, YC 2000, 'Lack of evidence of association of p21(WAF1/CIP1) polymorphism with lung cancer susceptibility and prognosis in Taiwan', Japanese Journal of Cancer Research, 卷 91, 編號 1, 頁 9-15. https://doi.org/10.1111/j.1349-7006.2000.tb00854.x
Lack of evidence of association of p21(WAF1/CIP1) polymorphism with lung cancer susceptibility and prognosis in Taiwan. / Shih, Chuen Ming; Lin, Pey Tzy; Wang, Hui Chun 等.
於: Japanese Journal of Cancer Research, 卷 91, 編號 1, 01.2000, p. 9-15.
T1 - Lack of evidence of association of p21(WAF1/CIP1) polymorphism with lung cancer susceptibility and prognosis in Taiwan
AU - Shih, Chuen Ming
AU - Lin, Pey Tzy
AU - Wang, Hui Chun
AU - Huang, Wei Chi
AU - Wang, Yi Ching
N2 - An association between the Arg allele of the p21(WAF1/CIP1) codon 31 polymorphism and lung cancer has been reported. However, the genotype distribution of the p21 codon 31 polymorphism, as well as the association of this polymorphism with lung cancer risk and prognosis, remain undefined in the Taiwanese population. Therefore, we investigated the genotype distribution of the p21 codon 31 polymorphism in 155 lung cancer patients and 189 non-cancer controls. The genotype frequencies in the Taiwanese non-cancer controls were 0.51 (Ser) and 0.49 (Arg). χ2 analysis indicated significant differences in Taiwanese genotype distribution of p21 from those reported for Swedes (P = 0.001), Caucasians (P = 0.001), Indians (P = 0.001), and African-Americans (P = 0.001). However, our data did not demonstrate an association of the Arg allele of the p21 polymorphism with lung cancer risk in Taiwan. Lung cancer patients with Ser/Arg and Arg/Arg genotypes were at a nonsignificant 1.15-fold increased risk of lung cancer when compared to individuals with the Ser/Ser genotype (95% CI, 0.70-1.86). In addition, although p21 is a downstream target of p53, we found no significant correlation of the p21 polymorphism with the p53 polymorphism and p53 gene mutation in lung cancer patients. We further investigated the association of the p21 polymorphism with prognosis in 154 lung cancer patients. Patients with the Ser/Ser genotype tended to have a poorer prognosis than those with the Ser/Arg and Arg/Arg genotypes (P = 0.097, by the log rank test). Our data suggest that the p21 codon 31 polymorphism may not play a significant role in cancer susceptibility and the prognosis of lung cancer patients in Taiwan.
AB - An association between the Arg allele of the p21(WAF1/CIP1) codon 31 polymorphism and lung cancer has been reported. However, the genotype distribution of the p21 codon 31 polymorphism, as well as the association of this polymorphism with lung cancer risk and prognosis, remain undefined in the Taiwanese population. Therefore, we investigated the genotype distribution of the p21 codon 31 polymorphism in 155 lung cancer patients and 189 non-cancer controls. The genotype frequencies in the Taiwanese non-cancer controls were 0.51 (Ser) and 0.49 (Arg). χ2 analysis indicated significant differences in Taiwanese genotype distribution of p21 from those reported for Swedes (P = 0.001), Caucasians (P = 0.001), Indians (P = 0.001), and African-Americans (P = 0.001). However, our data did not demonstrate an association of the Arg allele of the p21 polymorphism with lung cancer risk in Taiwan. Lung cancer patients with Ser/Arg and Arg/Arg genotypes were at a nonsignificant 1.15-fold increased risk of lung cancer when compared to individuals with the Ser/Ser genotype (95% CI, 0.70-1.86). In addition, although p21 is a downstream target of p53, we found no significant correlation of the p21 polymorphism with the p53 polymorphism and p53 gene mutation in lung cancer patients. We further investigated the association of the p21 polymorphism with prognosis in 154 lung cancer patients. Patients with the Ser/Ser genotype tended to have a poorer prognosis than those with the Ser/Arg and Arg/Arg genotypes (P = 0.097, by the log rank test). Our data suggest that the p21 codon 31 polymorphism may not play a significant role in cancer susceptibility and the prognosis of lung cancer patients in Taiwan.
U2 - 10.1111/j.1349-7006.2000.tb00854.x
DO - 10.1111/j.1349-7006.2000.tb00854.x
JO - Cancer Science
JF - Cancer Science
Shih CM, Lin PT, Wang HC, Huang WC, Wang YC. Lack of evidence of association of p21(WAF1/CIP1) polymorphism with lung cancer susceptibility and prognosis in Taiwan. Japanese Journal of Cancer Research. 2000 1月;91(1):9-15. doi: 10.1111/j.1349-7006.2000.tb00854.x

redpajama_set_name: RedPajamaCommonCrawl


NTRCA Job Vacant List 2019 | NGI Teletalk Com BD: Recently NTRCA Recruitment Vacant Post List 2019 by Institute of Districts has published. NTRCA Vacant List at ngi.teletalk.com.bd. NTRCA already published Non-government teachers recruitment requisition from start 6th June to 25th June 2019. NTRCA Authority will be published all Non-government School and College vacant teacher list will be published 03rd December 2019. Non-government School and College vacant teacher will be published NTRCA own website http://ngi.teletalk.com.bd/ or http://ntrca.gov.bd/.
Today NTRCA Vacant Posts 2018, NTRCA published their vacant circular in 2019. You can check your NTRCA Non-Government Teacher and Registration and Certification Result at http://ntrcateletalkcombd.com. Choose your District under the box below and find you NTRCA job vacancy http://ngi.teletalk.com.bd/ntrca/app/.
Choose you Division. For Example, I click Rangpur Division.
Choose your District. For Example I choose Dinajpur. And now I am able to show my District vacant Post.
NTRCA Job Recruitment Vacant List 2019 has been published NTRCA. How can you find this vacant list of NTRCA. 1st Choose One Institute of Dhaka North and South City Corporation Institute of Division Head Quarters Institute of Districts. NTRCA already published Non-government teaches recruitment requisition from start 6th June to 25th June, 2019. NTRCA Authority will be published all Non-government School and College vacant teacher list will be published December 2019. Non-government School and College vacant teacher will be published NTRCA own website http://ngi.teletalk.com.bd/ntrca/app/.
Non-government Teachers Registration and Certification Authority (NTRCA) is now published a notice for 1st to 14th Teachers Registration and Certification pass all person will be applied this vacant post. NTRCA Job Recruitment Notice 2019 related all information found my website http://ntrcateletalkcombd.com. The candidates of passed the 1st to 14th NTRCA exam can apply this vacant post. Non-government Teachers Registration and Certification Authority (NTRCA) except 15th batch are not to apply. Non-government Teachers Registration and Certification Authority (NTRCA) this recruitment process are merit basis.


Of all the rapturous delights featured here, this was the one that caused the most raised eyebrows. Yes, it's 24 years old. And yes, it's slow and feels to be made of tin foil and cheesecloth.
But the Fiesta XR2 is a forgotten high in hot hatch history, and a day spent pedalling this Mk2 car over the finest Welsh B-roads proves that we were right to bring it with us. Oh, so right.
The XR2 delivers a sense of involvement from the moment you get behind the art-deco steering wheel. With no assisted steering, ABS or ESP, it has a direct line to your fingertips and your tweed-ensconced behind, and that makes it rewarding in a car park, never mind on the open road.
Today's safety standards are a modern miracle, but an enthusiast can't experience cars like the XR2 without yearning just a little for the days when motoring was unencumbered by safety aids and additional weight. It wasn't even remotely frustrating to watch the rest of our convoy disappear into the distance every time we set off. Speed is secondary to fun when it comes to narrow, muddy and damp roads.
It's not razor-sharp like the very firm Focus RS and Racing Puma (if you haven't experienced old-school body roll, you'll find it here). Nor does it have the cult classic status of the Sierra Cosworth. And we won't deny that the nostalgic draw of the boxy, retro Fiesta boosts its 21st century appeal twofold.
But the fact that the XR2 has been mostly ignored over the past decade means that you can now get hold of one for less than £2k. The car we drove, owned by Ford of Europe, has an impressive 99,000 miles on the clock and feels amazingly solid.
The 96bhp 1.6-litre engine is uncomplicated, so body rust is the main enemy. There aren't many original XR2s around (a tatty runner can be yours for £1500), but we found a show-worthy car for £3250. It's no daily driver, or any kind of benchmark, but it's a cheap way into purist fun and a charismatic slice of Ford heritage.
RS Cosworth is starting to feel its age, but can still deliver thrills; steering wheel is a tactile delight, seat trim is of the picnic blanket variety and its four-pot motor makes 204bhp.
This limited edition, 153bhp ball of fun has limitless amounts of charm and is supremely easy to fall for.
The ST's blend of five-pot burble, occasional rally-style bang through the exhaust, light but feelsome steering and 324lb ft of torque can turn the most sedate driver into a hooligan.
RS produces 212bhp, but the focus here is more on handling than power; steering wheel features a useful 'this way up' marker.
Surely, even with modern legislation someone could make a car as tactile as this again.
Fantastic to see a car like this put through it's paces again.
It doesn't feel like long ago at all when these were all over the place. It's a shame they're now a rare sight, but what a cracking car. I really want one!
Yes I remember my sister having a Mk2, a reasonable car but poor compared to the 205, but she then bought a Mk3 Fiesta and that was awful, very poor handling.
Absolutely loved mine.It was slow and noisy but a scream to drive.I just loved finding a nice damp roundabout and a bit of lift off oversteer would follow.Happy days.
Lovely little thing. A minter fetches a surprising amount of money these days but I'm not sure I could part with 3k on a XR2 when I could get a decent 205 for the same money.
When cars get to this age price is more dictated by nostalgia than ability.
Thing is, either car would be a revelation in feel and feedback compared to modern machinery.
That's true Teg. It is amazing though how someone will pay crazy money for a Vauxhall Nova 1.2 or something. Just because something's like new doesn't mean it's not a complete turd to drive.
I understand someone spending 4 ot 5k on a Gti or XR2, something a bit special in it's day, but some people buy boggo versions that lets face it were dire then and dire now. Funny thing nostalgia!
4 grand for a Nova 1.2! Imagine what else you could get for 4 grand. Full marks to people looking after their cars so well but I just couldn't spend that much money on something that was awful in it's day. At least search for a GTE or something.
I know not everyone wants a performance car so that 4k would get you a nice Focus or something. Which is light years ahead of a Nova to drive.
An 800kg car that can only do 0-60 in 10 seconds and still struggles to hit 33mpg. Things have moved on a bit!
Frankly, given the choice between this and a modern Fiesta ST, I'd go for the newer car every time.


text:
10 Historic Sites in the U.S. - Even the Non-History Buffs Will Like These!
Even though the U.S. is a relatively young country, it has a rich and interesting history that can be experienced second-hand in many parts of the country. So, one weekends when you just don't know what to do, take you nearest bus or train to one of these fascinating historical sites and learn about a side of the U.S. you may have never heard of before!
1. George Washington's Home. Visit the beautiful home of the first American President, the Mount Vernon Estate. Located in on the Potomac in Virginia, right outside of Washington D.C., this is an easy and worthwhile trip for anyone in the area.
2. Gettysburg. One f the most important historical events in United States history, the famous Battle of Gettysburg was fought in and around Gettysburg, Pennsylvania July 1-3, 1863. Often referred to as the "turning point" of the American Civil War, this battle had the largest number of casualties in the war. Today you can take tours of the battlefields and visit the Civil War Museum.
3. Ford's Theatre. Explore the historic theater where President Abraham Lincoln was assassinated in 1865. Learn about his struggles during the Civil War and view exhibits relating to his fascinating life.
4. Colonial Williamsburg. This historic district was the capital of colonial Virginia. Featuring reenactments and costumed actors, Colonial Williamsburg is a living interpretation of life as it once was. Check the out the original and reconstructed buildings that date back to 1699.
5. Ellis Island. Located in the New York Harbor, Ellis Island was the entry point to the United States for millions of immigrants. It was the busiest inspection station from 1892 to 1954. Today, it is a fantastic museum that teaches visitors about the immigrant experience.
6. Paul Revere's House and The Old North Church. The home of this American Revolution hero is just one of many stops on The Freedom Trail, which will lead you through 16 historic sites in downtown Boston.
7. Harvard University. Established in 1636, Harvard is the oldest institution of higher learning in the United States. The campus and grounds are rich with history so take a tour to learn more.
8. Independence Hall and The Liberty Bell. Independence Hall is the meeting hall where the Founding Fathers of the United States adopted the Declaration of Independence and The Constitution. The old cracked liberty bell also holds a great deal of U.S. historical significance. Both of these, as well as many other important historic sites, can be found at the Independence National Historic Park in Philadelphia, Pennsylvania.
9. World Trade Center Memorial. This memorial commemorates the attacks of September 11, 2001. Two large square pools are now where the Twin Towers once stood in downtown Manhattan. The memorial officially opened to the public on September 12, 2011, while the museum will open one year later, on or around September 11, 2012.
10. The White House. For more than 200 years, the White House has been the home of U.S. Presidents and their families and a symbol of the United States. Take a stroll down Pennsylvania Avenue to see it, or book a tour in advance.
Discover U.S. History! For a complete list of U.S. historic sites, or to see if there are any visit-worthy historic sites in or around your city, check out the National Park Service's website.
Jennifer Page


Zuzana was the youngest of three children born to Hungarian-speaking Jewish parents in the city of Kosice. She was the baby of the family, and they called her Zuzi. Her father was a tailor whose workshop was in the Gruenbergers' apartment.
1933-39: In November 1938, when Zuzana was 5, Hungarian troops marched into Kosice and made it a part of Hungary. The Hungarians changed the name of the city to Kassa. The Hungarian government was friendly to Nazi Germany and introduced anti-Jewish laws in Kosice.
1940-44: In 1941, one year after Zuzana began school, the Hungarians moved the Gruenbergers and other Jewish families to camps in other parts of Hungary. The Gruenbergers were released the following spring and returned to Kosice, but Zuzana's brother and father were taken soon after for slave labor. In 1944 Kosice's 12,000 Jews, including Zuzana, her mother and sister, were rounded up by Hungarians who were cooperating with the Germans. They were sent to a brickyard at the city's edge and put on trains headed for Auschwitz.
Zuzana and her mother were gassed immediately on arriving in Auschwitz in May 1944. Zuzana was 11 years old.


On 22 February, (right) American businesswoman and philanthropist Amy Robbins greets girls during her visit to the UNICEF-supported Berhan Guzo school in Awassa, capital of the Southern Nations, Nationalities and Peoples Region (SNNPR).
Since 1990, UNICEF has helped slash the number of children under the age of five who die of preventable causes by more than 50 percent, saving 122 million lives. How? By doing what only UNICEF can do. UNICEF invents, invests in, and helps implement effective, low-cost solutions — ranging from mass immunization and malnutrition prevention and treatment to the provision of safe drinking water — for previously stubborn causes of child death.
By supporting UNICEF, the UNICEF USA's donors (including more than 471,305 individuals along with 10,168 partner corporations, foundations, NGOs, schools and clubs during Fiscal Year 2017) play a huge role in saving children's lives and building their futures.
UNICEF USA receives Charity Navigator's highest ratings for accountability and transparency.
Efficient and easy, monthly donations both large and small form the backbone of our support.
An exclusive group of philanthropists committed to building a better world.
Young leaders and entrepreneurs in their 20s and 30s who mobilize for children.
Leaving a lasting impression for future generations through estate planning.


The internet giant is in talks with Tencent, Inspur Group and other Chinese companies to offer Google cloud services in the mainland, according to people familiar with the discussions. They asked not to be identified discussing private matters.
The goal is to run Google Internet-based services — such as Drive and Docs — via the domestic data centres and servers of Chinese providers, similar to the way other US cloud companies access that market. In most of the rest of the world, Google Cloud rents computing power and storage over the Internet, and sells a collection of workplace productivity apps called G Suite that are run in its own data centres. China requires digital information to be stored in the country and Google has no data centres in the mainland, so it needs partnerships with local players.
Google Cloud chief Diane Greene said last week that she wants the business to "be a global cloud", but declined to comment specifically about China. Still, the company is seeking a Shanghai-based business development manager for its cloud business. The job posting lists "experience in, and knowledge of, the Chinese market" as a preferred qualification.
After years of slowly rebuilding a presence in China, Google has pressed the accelerator recently. It's building a cloud data centre region in Hong Kong this year and opened an artificial intelligence research centre in Beijing in January. Along with other Alphabet units, it has begun investing more in Chinese companies. Plans for a censored search app in China surfaced earlier this week, sparking a furious debate about whether Google is putting profit over its mission to "organise the world's information and make it universally available".
A cloud partnership for Google in China would help the company compete more with larger rivals Amazon.com and Microsoft. In late 2017, Amazon agreed to sell its Chinese servers and some other cloud assets to local partner Beijing Sinnet Technology. The move complied with laws introduced that year mandating the storage of data within the country and bolstering government control over the movement of information. The move mirrored a similar setup between Microsoft and its local partner 21Vianet Group.
With Tencent, Google would have an even more high-profile ally — but would also go up against local competitors including Alibaba Group, which operates a major cloud business in China.
China is the second largest cloud market, but local companies dominate, making it difficult for outsiders like Google, according to Synergy Research Group. "You can never say never, but that is an incredibly tough proposition," Synergy analyst John Dinsdale said. A June report from Synergy ranked Google fourth in the Asian cloud market, behind Amazon, Alibaba and Microsoft.
Tencent operates its own cloud service and is building an ecosystem of partners that includes Cisco Systems, Nvidia and Deloitte, according to Tencent's website. It already offers a cloud service called the Tencent Kubernetes Engine that's based on a popular Google technology by the same name. Google could host services, such as Gmail, Drive and Docs, in Tencent's data centres, and the Chinese company may suggest existing cloud customers try Google offerings.


text:
import * as types from '../constants/ActionTypes';
import { browserHistory } from 'react-router';
import moment from 'moment';
import { checkHttpStatus, parseJSON } from '../utils';
import axios from 'axios';

// NOTE:Chat actions

function addMessage(message) {
  return {
    type: types.ADD_MESSAGE,
    message
  };
}

export function receiveRawMessage(message) {
  return {
    type: types.RECEIVE_MESSAGE,
    message
  };
}

export function receiveRawChannel(channel) {
  return {
    type: types.RECEIVE_CHANNEL,
    channel
  };
}

// function addChannel(channel) {
//   return {
//     type: types.ADD_CHANNEL,
//     channel
//   };
// }

// export function typing(username) {
//   return {
//     type: types.TYPING,
//     username
//   };
// }

// export function stopTyping(username) {
//   return {
//     type: types.STOP_TYPING,
//     username
//   };
// }

// export function changeChannel(channel) {
//   return {
//     type: types.CHANGE_CHANNEL,
//     channel
//   };
// }

function requestMessages() {
  return {
    type: types.LOAD_MESSAGES
  }
}

export function fetchMessages(channel) {
  return (dispatch) => {
    dispatch(requestMessages())
    return axios.get('/api/messages/'+ channel)
      .then(function (response){
        dispatch(receiveMessages(response, channel))
      })
  }
}

function receiveMessages(json, channel) {
  const date = moment().format('lll');
  return {
    type: types.LOAD_MESSAGES_SUCCESS,
    json,
    channel,
    date
  }
}

function shouldFetchMessages(state) {
  const messages = state.messages.data;
  if (!messages) {
    return true
  }
}

export function fetchMessagesIfNeeded() {
  return (dispatch, getState) => {
    if (shouldFetchMessages(getState())) {
      return dispatch(fetchMessages())
    }
  }
}

export function createMessage(message) {
  return dispatch => {
    dispatch(addMessage(message))
    return fetch('/api/newmessage', {
      method: 'post',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(message)})
      .catch(error => {throw error});
  }
}

// export function createChannel(channel) {
//   return dispatch => {
//     dispatch(addChannel(channel))
//     return fetch ('/api/channels/new_channel', {
//       method: 'post',
//       headers: {
//         'Content-Type': 'application/json'
//       },
//       body: JSON.stringify(channel)})
//       .catch(error => {throw error});
//   }
// }
export function receiveSocket(socketID) {
  return {
    type: types.RECEIVE_SOCKET,
    socketID
  }
}

//the environment code is borrowed from Andrew Ngu, https://github.com/andrewngu/sound-redux

function changeIsMobile(isMobile) {
  return {
    type: types.CHANGE_IS_MOBILE,
    isMobile
  };
}

function changeWidthAndHeight(screenHeight, screenWidth) {
  return {
    type: types.CHANGE_WIDTH_AND_HEIGHT,
    screenHeight,
    screenWidth
  };
}

export function initEnvironment() {
  return dispatch => {
    const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
    if (isMobile) {
      document.body.style.overflow = 'hidden';
    }

    dispatch(changeIsMobile(isMobile));
    dispatch(changeWidthAndHeight(window.innerHeight, window.innerWidth));

    window.onresize = () => {
      dispatch(changeWidthAndHeight(window.innerHeight, window.innerWidth));
    }
  };
}

redpajama_set_name: RedPajamaGithub


Coca-Cola's partnership with l'Alcesdam in Morocco tackles desertification in Tata Province.
Water has always posed great challenges for the Middle East, North Africa and Pakistan. With rapid population growth, and climate change, these challenges are becoming more critical than ever. The World Resources Institute forecasts that the Middle East will become the most water-stressed region in the world by 2040.
Over 60 percent of the MENA region's population lives in areas with high or very high surface water stress, compared to a global average of about 35 percent. Despite water scarcity, the region has the world's lowest water tariffs and, at 2 percent, the highest proportion of GDP spent on public water subsidies.
Governments in the region have a crucial role to play in creating the regulatory environment and infrastructure required to manage water better, but alone they cannot solve water scarcity. What the World Bank terms a new "water consciousness" is needed, in which water scarcity is understood to be the shared responsibility of government, but also business, communities and individuals.
Coca-Cola supports clean water connections to households in Upper Egypt.
WWF and The Coca-Cola Company have been working together for over a decade to help conserve the world's fresh water resources. We understand that water is the ultimate shared resource and we can only manage it sustainably if all water users in a river basin work together. WWF believes that it is critical to work with the private sector to tackle issues that impact fresh water. We need business to act as catalysts for change in local watersheds, so that we can create the conditions for collaborative, sustainable management of freshwater resources. This collective action approach is at the heart of the partnership between WWF and Coca-Cola.
The Coca-Cola Company, for our part, is working to steward rigorously the water used in our production process. We have steadily reduced the amount of water used in our plants around the world, including in the Middle East. In addition, Coca-Cola's "Replenish" goal was a first for the beverage-producing private sector when it was set in 2007. It committed the company to return 100 percent of the water Coca-Cola uses in its global sales volume by 2020 through projects that give people water access, water for productive use and watershed conservation activities. Many of these projects were conducted by WWF and other expert partners.
As part of this commitment, Coca-Cola already returns 1.75 billion liters of water per year to nature and communities in the Middle East, North Africa and Pakistan. But we are now accelerating action to meet the global target in MENA, with a suite of new programs worth around $4 million just started or about to commence in 2018, in Algeria, Morocco, Egypt, Gaza, Iraq, Jordan, Lebanon, Pakistan and Sudan.
The theme of World Water Day in 2018 is nature-based solutions to water challenges. Several programs Coca-Cola is supporting in the Middle East, North Africa and Pakistan support such nature-based interventions. Partnerships with organizations like the World Wildlife Fund (WWF) are essential to making headway.
In Pakistan, Coca-Cola has partnered with WWF since 2008 to promote integrated watershed management (IWM) in the Ayubia National Park, which spans over 3,312 hectares in the Galliat region of the Western Himalayan Ecoregion. The partnership rehabilitated the watershed through groundwater recharge, including reforestation and soil restoration, as well as helping communities with rainwater harvesting and water storage and new piping infrastructure. Also in Pakistan, Coca-Cola partnered with the Indus Earth Trust in 2017 to utilize rain water harvesting techniques to decrease the time women and girls spend collecting water and to enhance groundwater recharge in more than 30 villages in the Thatta District, with transformational effects on the local community.
Before and after the rain: reservoirs constructed by Indus Earth Trust with Coca-Cola funding in 2017 in Kohistan, Pakistan, save women and girls long daily walks to collect water.
Other nature-based interventions are being supported, such as in Tata Province in Morocco where NGO L'ALCESDAM, has introduced efficient irrigation systems to restore an oasis which had been deserted by its former farming communities. More than 800 million liters of water per year have been generated through this program to date. And in Algeria, The Coca-Cola Foundation's partnership with the United Nations Development Program (UNDP) will restore a 60-hectare area of the dune cordon in the Guerbes-Sanhadja Wetland Complex that has been degraded by human activity.
As well as these nature-based interventions, Coca-Cola and our partners are providing clean water access to thousands of people in MENA as part of the same Replenish initiative. In Pakistan, again with WWF, Coca-Cola has supported the Paani Safe Water Initiative, improving water access for 500,000 people through community outreach and education.
In Egypt, more than 80,000 people have already been connected to clean water, but on March 12, The Coca-Cola Company announced a new project in Egypt using ground breaking technology to extract clean water from the banks of the river Nile which will reach another 100,000 people per year with safe water. And in Gaza, Coca-Cola started working with Mercy Corps in 2017 to provide desalination technology to enhance water access for more than 125,000 people.
WWF and The Coca-Cola Company will continue to work with governments and other stakeholders to manage and help combat the water challenges facing the MENA region. Partnerships like ours allow us to bring the power of our global brand together with those who have expertise in delivering solutions to water scarcity. We recognize our responsibility to not exacerbate the problem of water scarcity in MENA through careful stewardship of water, but more than that, we can be part of the solution.
Kathryn Casson is director of public affairs, communications and sustainability for the Middle East and North Africa at The Coca-Cola Company.
Stuart Orr is freshwater practice leader for WWF.


Pre-booking has now closed, however we still have tickets available for all four days which you can purchase on the gate on the day. Good Friday and Easter Saturday are both very busy already, so although we are unlikely to turn anyone away on these days (but we cannot 100% guarantee this - it depends how busy it gets) we would recommend coming on Easter Sunday or Easter Monday instead as both of these days are currently half as busy. Looking forward to seeing you all very soon!


text:
use futures::channel::mpsc;
use futures::future::BoxFuture;
use futures::lock::Mutex as FutMutex;
use futures::prelude::*;

use gst::glib;

use gst::prelude::*;
use gst::subclass::prelude::*;
use gst::EventView;
use gst::{gst_debug, gst_info, gst_log};

use once_cell::sync::Lazy;

use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Mutex as StdMutex;
use std::time::Duration;

use gstthreadshare::runtime::prelude::*;
use gstthreadshare::runtime::{
    Context, PadSink, PadSinkRef, PadSrc, PadSrcRef, PadSrcWeak, Task, TaskState,
};

const DEFAULT_CONTEXT: &str = "";
const THROTTLING_DURATION: Duration = Duration::from_millis(2);

fn init() {
    use std::sync::Once;
    static INIT: Once = Once::new();

    INIT.call_once(|| {
        gst::init().unwrap();
        gstthreadshare::plugin_register_static().expect("gstthreadshare pad test");
    });
}

#[derive(Debug)]
pub enum Item {
    Buffer(gst::Buffer),
    BufferList(gst::BufferList),
    Event(gst::Event),
}

#[derive(Clone, Debug, glib::Boxed)]
#[boxed_type(name = "TsTestItemSender")]
struct ItemSender {
    sender: mpsc::Sender<Item>,
}

// Src
mod imp_src {
    use super::*;

    #[derive(Clone, Debug, Default)]
    struct Settings {
        context: String,
    }

    pub static SRC_CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
        gst::DebugCategory::new(
            "ts-element-src-test",
            gst::DebugColorFlags::empty(),
            Some("Thread-sharing Test Src Element"),
        )
    });

    #[derive(Clone, Debug)]
    struct PadSrcTestHandler;

    impl PadSrcTestHandler {
        async fn push_item(
            pad: &PadSrcRef<'_>,
            item: Item,
        ) -> Result<gst::FlowSuccess, gst::FlowError> {
            gst_debug!(SRC_CAT, obj: pad.gst_pad(), "Handling {:?}", item);

            match item {
                Item::Event(event) => {
                    pad.push_event(event).await;

                    Ok(gst::FlowSuccess::Ok)
                }
                Item::Buffer(buffer) => pad.push(buffer).await,
                Item::BufferList(list) => pad.push_list(list).await,
            }
        }
    }

    impl PadSrcHandler for PadSrcTestHandler {
        type ElementImpl = ElementSrcTest;

        fn src_event(
            &self,
            pad: &PadSrcRef,
            elem_src_test: &ElementSrcTest,
            _element: &gst::Element,
            event: gst::Event,
        ) -> bool {
            gst_log!(SRC_CAT, obj: pad.gst_pad(), "Handling {:?}", event);

            let ret = match event.view() {
                EventView::FlushStart(..) => {
                    elem_src_test.task.flush_start().unwrap();
                    true
                }
                EventView::Qos(..) | EventView::Reconfigure(..) | EventView::Latency(..) => true,
                EventView::FlushStop(..) => {
                    elem_src_test.task.flush_stop().unwrap();
                    true
                }
                _ => false,
            };

            if ret {
                gst_log!(SRC_CAT, obj: pad.gst_pad(), "Handled {:?}", event);
            } else {
                gst_log!(SRC_CAT, obj: pad.gst_pad(), "Didn't handle {:?}", event);
            }

            ret
        }
    }

    #[derive(Debug)]
    struct ElementSrcTestTask {
        element: super::ElementSrcTest,
        src_pad: PadSrcWeak,
        receiver: mpsc::Receiver<Item>,
    }

    impl ElementSrcTestTask {
        fn new(
            element: &super::ElementSrcTest,
            src_pad: &PadSrc,
            receiver: mpsc::Receiver<Item>,
        ) -> Self {
            ElementSrcTestTask {
                element: element.clone(),
                src_pad: src_pad.downgrade(),
                receiver,
            }
        }
    }

    impl ElementSrcTestTask {
        fn flush(&mut self) {
            // Purge the channel
            while let Ok(Some(_item)) = self.receiver.try_next() {}
        }
    }

    impl TaskImpl for ElementSrcTestTask {
        fn iterate(&mut self) -> BoxFuture<'_, Result<(), gst::FlowError>> {
            async move {
                let item = self.receiver.next().await;

                let item = match item {
                    Some(item) => item,
                    None => {
                        gst_log!(SRC_CAT, obj: &self.element, "SrcPad channel aborted");
                        return Err(gst::FlowError::Eos);
                    }
                };

                let pad = self.src_pad.upgrade().expect("PadSrc no longer exists");
                let res = PadSrcTestHandler::push_item(&pad, item).await;
                match res {
                    Ok(_) => gst_log!(SRC_CAT, obj: &self.element, "Successfully pushed item"),
                    Err(gst::FlowError::Flushing) => {
                        gst_debug!(SRC_CAT, obj: &self.element, "Flushing")
                    }
                    Err(err) => panic!("Got error {}", err),
                }

                res.map(drop)
            }
            .boxed()
        }

        fn stop(&mut self) -> BoxFuture<'_, Result<(), gst::ErrorMessage>> {
            async move {
                gst_log!(SRC_CAT, obj: &self.element, "Stopping task");
                self.flush();
                gst_log!(SRC_CAT, obj: &self.element, "Task stopped");
                Ok(())
            }
            .boxed()
        }

        fn flush_start(&mut self) -> BoxFuture<'_, Result<(), gst::ErrorMessage>> {
            async move {
                gst_log!(SRC_CAT, obj: &self.element, "Starting task flush");
                self.flush();
                gst_log!(SRC_CAT, obj: &self.element, "Task flush started");
                Ok(())
            }
            .boxed()
        }
    }

    #[derive(Debug)]
    pub struct ElementSrcTest {
        src_pad: PadSrc,
        task: Task,
        sender: StdMutex<Option<mpsc::Sender<Item>>>,
        settings: StdMutex<Settings>,
    }

    impl ElementSrcTest {
        pub fn try_push(&self, item: Item) -> Result<(), Item> {
            let state = self.task.lock_state();
            if *state != TaskState::Started && *state != TaskState::Paused {
                gst_debug!(SRC_CAT, "ElementSrcTest rejecting item due to pad state");

                return Err(item);
            }

            match self.sender.lock().unwrap().as_mut() {
                Some(sender) => sender
                    .try_send(item)
                    .map_err(mpsc::TrySendError::into_inner),
                None => Err(item),
            }
        }

        fn prepare(&self, element: &super::ElementSrcTest) -> Result<(), gst::ErrorMessage> {
            gst_debug!(SRC_CAT, obj: element, "Preparing");

            let settings = self.settings.lock().unwrap().clone();
            let context =
                Context::acquire(&settings.context, THROTTLING_DURATION).map_err(|err| {
                    gst::error_msg!(
                        gst::ResourceError::OpenRead,
                        ["Failed to acquire Context: {}", err]
                    )
                })?;

            let (sender, receiver) = mpsc::channel(1);
            *self.sender.lock().unwrap() = Some(sender);

            self.task
                .prepare(
                    ElementSrcTestTask::new(element, &self.src_pad, receiver),
                    context,
                )
                .map_err(|err| {
                    gst::error_msg!(
                        gst::ResourceError::Failed,
                        ["Error preparing Task: {:?}", err]
                    )
                })?;

            gst_debug!(SRC_CAT, obj: element, "Prepared");

            Ok(())
        }

        fn unprepare(&self, element: &super::ElementSrcTest) {
            gst_debug!(SRC_CAT, obj: element, "Unpreparing");

            *self.sender.lock().unwrap() = None;
            self.task.unprepare().unwrap();

            gst_debug!(SRC_CAT, obj: element, "Unprepared");
        }

        fn stop(&self, element: &super::ElementSrcTest) {
            gst_debug!(SRC_CAT, obj: element, "Stopping");
            self.task.stop().unwrap();
            gst_debug!(SRC_CAT, obj: element, "Stopped");
        }

        fn start(&self, element: &super::ElementSrcTest) {
            gst_debug!(SRC_CAT, obj: element, "Starting");
            self.task.start().unwrap();
            gst_debug!(SRC_CAT, obj: element, "Started");
        }

        fn pause(&self, element: &super::ElementSrcTest) {
            gst_debug!(SRC_CAT, obj: element, "Pausing");
            self.task.pause().unwrap();
            gst_debug!(SRC_CAT, obj: element, "Paused");
        }
    }

    #[glib::object_subclass]
    impl ObjectSubclass for ElementSrcTest {
        const NAME: &'static str = "TsElementSrcTest";
        type Type = super::ElementSrcTest;
        type ParentType = gst::Element;

        fn with_class(klass: &Self::Class) -> Self {
            ElementSrcTest {
                src_pad: PadSrc::new(
                    gst::Pad::from_template(&klass.pad_template("src").unwrap(), Some("src")),
                    PadSrcTestHandler,
                ),
                task: Task::default(),
                sender: StdMutex::new(None),
                settings: StdMutex::new(Settings::default()),
            }
        }
    }

    impl ObjectImpl for ElementSrcTest {
        fn properties() -> &'static [glib::ParamSpec] {
            static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                vec![glib::ParamSpecString::new(
                    "context",
                    "Context",
                    "Context name to share threads with",
                    Some(DEFAULT_CONTEXT),
                    glib::ParamFlags::WRITABLE,
                )]
            });

            PROPERTIES.as_ref()
        }

        fn set_property(
            &self,
            _obj: &Self::Type,
            _id: usize,
            value: &glib::Value,
            pspec: &glib::ParamSpec,
        ) {
            match pspec.name() {
                "context" => {
                    let context = value
                        .get::<Option<String>>()
                        .expect("type checked upstream")
                        .unwrap_or_else(|| "".into());

                    self.settings.lock().unwrap().context = context;
                }
                _ => unimplemented!(),
            }
        }

        fn constructed(&self, obj: &Self::Type) {
            self.parent_constructed(obj);

            obj.add_pad(self.src_pad.gst_pad()).unwrap();
        }
    }

    impl GstObjectImpl for ElementSrcTest {}

    impl ElementImpl for ElementSrcTest {
        fn metadata() -> Option<&'static gst::subclass::ElementMetadata> {
            static ELEMENT_METADATA: Lazy<gst::subclass::ElementMetadata> = Lazy::new(|| {
                gst::subclass::ElementMetadata::new(
                    "Thread-sharing Test Src Element",
                    "Generic",
                    "Src Element for Pad Src Test",
                    "François Laignel <fengalin@free.fr>",
                )
            });

            Some(&*ELEMENT_METADATA)
        }

        fn pad_templates() -> &'static [gst::PadTemplate] {
            static PAD_TEMPLATES: Lazy<Vec<gst::PadTemplate>> = Lazy::new(|| {
                let caps = gst::Caps::new_any();
                let src_pad_template = gst::PadTemplate::new(
                    "src",
                    gst::PadDirection::Src,
                    gst::PadPresence::Always,
                    &caps,
                )
                .unwrap();

                vec![src_pad_template]
            });

            PAD_TEMPLATES.as_ref()
        }

        fn change_state(
            &self,
            element: &Self::Type,
            transition: gst::StateChange,
        ) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
            gst_log!(SRC_CAT, obj: element, "Changing state {:?}", transition);

            match transition {
                gst::StateChange::NullToReady => {
                    self.prepare(element).map_err(|err| {
                        element.post_error_message(err);
                        gst::StateChangeError
                    })?;
                }
                gst::StateChange::PlayingToPaused => {
                    self.pause(element);
                }
                gst::StateChange::ReadyToNull => {
                    self.unprepare(element);
                }
                _ => (),
            }

            let mut success = self.parent_change_state(element, transition)?;

            match transition {
                gst::StateChange::PausedToReady => {
                    self.stop(element);
                }
                gst::StateChange::PausedToPlaying => {
                    self.start(element);
                }
                gst::StateChange::ReadyToPaused | gst::StateChange::PlayingToPaused => {
                    success = gst::StateChangeSuccess::NoPreroll;
                }
                _ => (),
            }

            Ok(success)
        }

        fn send_event(&self, _element: &Self::Type, event: gst::Event) -> bool {
            match event.view() {
                EventView::FlushStart(..) => {
                    self.task.flush_start().unwrap();
                }
                EventView::FlushStop(..) => {
                    self.task.flush_stop().unwrap();
                }
                _ => (),
            }

            if !event.is_serialized() {
                self.src_pad.gst_pad().push_event(event)
            } else {
                self.try_push(Item::Event(event)).is_ok()
            }
        }
    }
}

glib::wrapper! {
    pub struct ElementSrcTest(ObjectSubclass<imp_src::ElementSrcTest>) @extends gst::Element, gst::Object;
}
unsafe impl Send for ElementSrcTest {}
unsafe impl Sync for ElementSrcTest {}

// Sink

mod imp_sink {
    use super::*;

    #[derive(Clone, Debug, Default)]
    struct PadSinkTestHandler;

    impl PadSinkHandler for PadSinkTestHandler {
        type ElementImpl = ElementSinkTest;

        fn sink_chain(
            &self,
            _pad: &PadSinkRef,
            _elem_sink_test: &ElementSinkTest,
            element: &gst::Element,
            buffer: gst::Buffer,
        ) -> BoxFuture<'static, Result<gst::FlowSuccess, gst::FlowError>> {
            let element = element
                .clone()
                .downcast::<super::ElementSinkTest>()
                .unwrap();
            async move {
                let elem_sink_test = ElementSinkTest::from_instance(&element);
                elem_sink_test
                    .forward_item(&element, Item::Buffer(buffer))
                    .await
            }
            .boxed()
        }

        fn sink_chain_list(
            &self,
            _pad: &PadSinkRef,
            _elem_sink_test: &ElementSinkTest,
            element: &gst::Element,
            list: gst::BufferList,
        ) -> BoxFuture<'static, Result<gst::FlowSuccess, gst::FlowError>> {
            let element = element
                .clone()
                .downcast::<super::ElementSinkTest>()
                .unwrap();
            async move {
                let elem_sink_test = ElementSinkTest::from_instance(&element);
                elem_sink_test
                    .forward_item(&element, Item::BufferList(list))
                    .await
            }
            .boxed()
        }

        fn sink_event(
            &self,
            pad: &PadSinkRef,
            elem_sink_test: &ElementSinkTest,
            element: &gst::Element,
            event: gst::Event,
        ) -> bool {
            gst_debug!(SINK_CAT, obj: pad.gst_pad(), "Handling non-serialized {:?}", event);

            match event.view() {
                EventView::FlushStart(..) => {
                    elem_sink_test.stop(element.downcast_ref::<super::ElementSinkTest>().unwrap());
                    true
                }
                _ => false,
            }
        }

        fn sink_event_serialized(
            &self,
            pad: &PadSinkRef,
            _elem_sink_test: &ElementSinkTest,
            element: &gst::Element,
            event: gst::Event,
        ) -> BoxFuture<'static, bool> {
            gst_log!(SINK_CAT, obj: pad.gst_pad(), "Handling serialized {:?}", event);

            let element = element
                .clone()
                .downcast::<super::ElementSinkTest>()
                .unwrap();
            async move {
                let elem_sink_test = ElementSinkTest::from_instance(&element);

                if let EventView::FlushStop(..) = event.view() {
                    elem_sink_test.start(&element);
                }

                elem_sink_test
                    .forward_item(&element, Item::Event(event))
                    .await
                    .is_ok()
            }
            .boxed()
        }
    }

    #[derive(Debug)]
    pub struct ElementSinkTest {
        sink_pad: PadSink,
        flushing: AtomicBool,
        sender: FutMutex<Option<mpsc::Sender<Item>>>,
    }

    impl ElementSinkTest {
        async fn forward_item(
            &self,
            element: &super::ElementSinkTest,
            item: Item,
        ) -> Result<gst::FlowSuccess, gst::FlowError> {
            if !self.flushing.load(Ordering::SeqCst) {
                gst_debug!(SINK_CAT, obj: element, "Fowarding {:?}", item);
                self.sender
                    .lock()
                    .await
                    .as_mut()
                    .expect("Item Sender not set")
                    .send(item)
                    .await
                    .map(|_| gst::FlowSuccess::Ok)
                    .map_err(|_| gst::FlowError::Error)
            } else {
                gst_debug!(
                    SINK_CAT,
                    obj: element,
                    "Not fowarding {:?} due to flushing",
                    item
                );
                Err(gst::FlowError::Flushing)
            }
        }

        fn start(&self, element: &super::ElementSinkTest) {
            gst_debug!(SINK_CAT, obj: element, "Starting");
            self.flushing.store(false, Ordering::SeqCst);
            gst_debug!(SINK_CAT, obj: element, "Started");
        }

        fn stop(&self, element: &super::ElementSinkTest) {
            gst_debug!(SINK_CAT, obj: element, "Stopping");
            self.flushing.store(true, Ordering::SeqCst);
            gst_debug!(SINK_CAT, obj: element, "Stopped");
        }
    }

    impl ElementSinkTest {
        pub fn push_flush_start(&self, element: &super::ElementSinkTest) {
            gst_debug!(SINK_CAT, obj: element, "Pushing FlushStart");
            self.sink_pad
                .gst_pad()
                .push_event(gst::event::FlushStart::new());
            gst_debug!(SINK_CAT, obj: element, "FlushStart pushed");
        }

        pub fn push_flush_stop(&self, element: &super::ElementSinkTest) {
            gst_debug!(SINK_CAT, obj: element, "Pushing FlushStop");
            self.sink_pad
                .gst_pad()
                .push_event(gst::event::FlushStop::new(true));
            gst_debug!(SINK_CAT, obj: element, "FlushStop pushed");
        }
    }

    static SINK_CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
        gst::DebugCategory::new(
            "ts-element-sink-test",
            gst::DebugColorFlags::empty(),
            Some("Thread-sharing Test Sink Element"),
        )
    });

    #[glib::object_subclass]
    impl ObjectSubclass for ElementSinkTest {
        const NAME: &'static str = "TsElementSinkTest";
        type Type = super::ElementSinkTest;
        type ParentType = gst::Element;

        fn with_class(klass: &Self::Class) -> Self {
            ElementSinkTest {
                sink_pad: PadSink::new(
                    gst::Pad::from_template(&klass.pad_template("sink").unwrap(), Some("sink")),
                    PadSinkTestHandler,
                ),
                flushing: AtomicBool::new(true),
                sender: FutMutex::new(None),
            }
        }
    }

    impl ObjectImpl for ElementSinkTest {
        fn properties() -> &'static [glib::ParamSpec] {
            static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| {
                vec![glib::ParamSpecBoxed::new(
                    "sender",
                    "Sender",
                    "Channel sender to forward the incoming items to",
                    ItemSender::static_type(),
                    glib::ParamFlags::WRITABLE | glib::ParamFlags::CONSTRUCT_ONLY,
                )]
            });

            PROPERTIES.as_ref()
        }

        fn set_property(
            &self,
            _obj: &Self::Type,
            _id: usize,
            value: &glib::Value,
            pspec: &glib::ParamSpec,
        ) {
            match pspec.name() {
                "sender" => {
                    let ItemSender { sender } = value
                        .get::<&ItemSender>()
                        .expect("type checked upstream")
                        .clone();
                    *futures::executor::block_on(self.sender.lock()) = Some(sender);
                }
                _ => unimplemented!(),
            }
        }

        fn constructed(&self, obj: &Self::Type) {
            self.parent_constructed(obj);

            obj.add_pad(self.sink_pad.gst_pad()).unwrap();
        }
    }

    impl GstObjectImpl for ElementSinkTest {}

    impl ElementImpl for ElementSinkTest {
        fn metadata() -> Option<&'static gst::subclass::ElementMetadata> {
            static ELEMENT_METADATA: Lazy<gst::subclass::ElementMetadata> = Lazy::new(|| {
                gst::subclass::ElementMetadata::new(
                    "Thread-sharing Test Sink Element",
                    "Generic",
                    "Sink Element for Pad Test",
                    "François Laignel <fengalin@free.fr>",
                )
            });

            Some(&*ELEMENT_METADATA)
        }

        fn pad_templates() -> &'static [gst::PadTemplate] {
            static PAD_TEMPLATES: Lazy<Vec<gst::PadTemplate>> = Lazy::new(|| {
                let caps = gst::Caps::new_any();
                let sink_pad_template = gst::PadTemplate::new(
                    "sink",
                    gst::PadDirection::Sink,
                    gst::PadPresence::Always,
                    &caps,
                )
                .unwrap();

                vec![sink_pad_template]
            });

            PAD_TEMPLATES.as_ref()
        }

        fn change_state(
            &self,
            element: &Self::Type,
            transition: gst::StateChange,
        ) -> Result<gst::StateChangeSuccess, gst::StateChangeError> {
            gst_log!(SINK_CAT, obj: element, "Changing state {:?}", transition);

            if let gst::StateChange::PausedToReady = transition {
                self.stop(element);
            }

            let success = self.parent_change_state(element, transition)?;

            if let gst::StateChange::ReadyToPaused = transition {
                self.start(element);
            }

            Ok(success)
        }
    }
}

glib::wrapper! {
    pub struct ElementSinkTest(ObjectSubclass<imp_sink::ElementSinkTest>) @extends gst::Element, gst::Object;
}
unsafe impl Send for ElementSinkTest {}
unsafe impl Sync for ElementSinkTest {}

fn setup(
    context_name: &str,
    mut middle_element_1: Option<gst::Element>,
    mut middle_element_2: Option<gst::Element>,
) -> (
    gst::Pipeline,
    ElementSrcTest,
    ElementSinkTest,
    mpsc::Receiver<Item>,
) {
    init();

    let pipeline = gst::Pipeline::new(None);

    // Src
    let src_element = glib::Object::new::<ElementSrcTest>(&[]).unwrap();
    src_element.set_property("context", &context_name);
    pipeline.add(&src_element).unwrap();

    let mut last_element = src_element.clone().upcast::<gst::Element>();

    if let Some(middle_element) = middle_element_1.take() {
        pipeline.add(&middle_element).unwrap();
        last_element.link(&middle_element).unwrap();
        last_element = middle_element;
    }

    if let Some(middle_element) = middle_element_2.take() {
        // Don't link the 2 middle elements: this is used for ts-proxy
        pipeline.add(&middle_element).unwrap();
        last_element = middle_element;
    }

    // Sink
    let (sender, receiver) = mpsc::channel::<Item>(10);
    let sink_element =
        glib::Object::new::<ElementSinkTest>(&[("sender", &ItemSender { sender })]).unwrap();
    pipeline.add(&sink_element).unwrap();
    last_element.link(&sink_element).unwrap();

    (pipeline, src_element, sink_element, receiver)
}

fn nominal_scenario(
    scenario_name: &str,
    pipeline: gst::Pipeline,
    src_element: ElementSrcTest,
    mut receiver: mpsc::Receiver<Item>,
) {
    let elem_src_test = imp_src::ElementSrcTest::from_instance(&src_element);

    pipeline.set_state(gst::State::Playing).unwrap();

    // Initial events
    elem_src_test
        .try_push(Item::Event(
            gst::event::StreamStart::builder(scenario_name)
                .group_id(gst::GroupId::next())
                .build(),
        ))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::StreamStart(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    elem_src_test
        .try_push(Item::Event(gst::event::Segment::new(
            &gst::FormattedSegment::<gst::format::Time>::new(),
        )))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::Segment(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    // Buffer
    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![1, 2, 3, 4])))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Buffer(buffer) => {
            let data = buffer.map_readable().unwrap();
            assert_eq!(data.as_slice(), vec![1, 2, 3, 4].as_slice());
        }
        other => panic!("Unexpected item {:?}", other),
    }

    // BufferList
    let mut list = gst::BufferList::new();
    list.get_mut()
        .unwrap()
        .add(gst::Buffer::from_slice(vec![1, 2, 3, 4]));
    elem_src_test.try_push(Item::BufferList(list)).unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::BufferList(_) => (),
        other => panic!("Unexpected item {:?}", other),
    }

    // Pause the Pad task
    pipeline.set_state(gst::State::Paused).unwrap();

    // Item accepted, but not processed before switching to Playing again
    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![5, 6, 7])))
        .unwrap();

    // Nothing forwarded
    receiver.try_next().unwrap_err();

    // Switch back the Pad task to Started
    pipeline.set_state(gst::State::Playing).unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Buffer(buffer) => {
            let data = buffer.map_readable().unwrap();
            assert_eq!(data.as_slice(), vec![5, 6, 7].as_slice());
        }
        other => panic!("Unexpected item {:?}", other),
    }

    // Flush
    src_element.send_event(gst::event::FlushStart::new());
    src_element.send_event(gst::event::FlushStop::new(true));

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::FlushStop(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    elem_src_test
        .try_push(Item::Event(gst::event::Segment::new(
            &gst::FormattedSegment::<gst::format::Time>::new(),
        )))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::Segment(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    // Buffer
    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![8, 9])))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Buffer(buffer) => {
            let data = buffer.map_readable().unwrap();
            assert_eq!(data.as_slice(), vec![8, 9].as_slice());
        }
        other => panic!("Unexpected item {:?}", other),
    }

    // EOS
    elem_src_test
        .try_push(Item::Event(gst::event::Eos::new()))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::Eos(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    pipeline.set_state(gst::State::Ready).unwrap();

    // Receiver was dropped when stopping => can't send anymore
    elem_src_test
        .try_push(Item::Event(
            gst::event::StreamStart::builder(&format!("{}_past_stop", scenario_name))
                .group_id(gst::GroupId::next())
                .build(),
        ))
        .unwrap_err();

    pipeline.set_state(gst::State::Null).unwrap();
}

#[test]
fn src_sink_nominal() {
    let name = "src_sink_nominal";

    let (pipeline, src_element, _sink_element, receiver) = setup(name, None, None);

    nominal_scenario(name, pipeline, src_element, receiver);
}

#[test]
fn src_tsqueue_sink_nominal() {
    init();

    let name = "src_tsqueue_sink";

    let ts_queue = gst::ElementFactory::make("ts-queue", Some("ts-queue")).unwrap();
    ts_queue.set_property("context", format!("{}_queue", name));
    ts_queue.set_property("context-wait", THROTTLING_DURATION.as_millis() as u32);

    let (pipeline, src_element, _sink_element, receiver) = setup(name, Some(ts_queue), None);

    nominal_scenario(name, pipeline, src_element, receiver);
}

#[test]
fn src_queue_sink_nominal() {
    init();

    let name = "src_queue_sink";

    let queue = gst::ElementFactory::make("queue", Some("queue")).unwrap();
    let (pipeline, src_element, _sink_element, receiver) = setup(name, Some(queue), None);

    nominal_scenario(name, pipeline, src_element, receiver);
}

#[test]
fn src_tsproxy_sink_nominal() {
    init();

    let name = "src_tsproxy_sink";

    let ts_proxy_sink = gst::ElementFactory::make("ts-proxysink", Some("ts-proxysink")).unwrap();
    ts_proxy_sink.set_property("proxy-context", format!("{}_proxy_context", name));

    let ts_proxy_src = gst::ElementFactory::make("ts-proxysrc", Some("ts-proxysrc")).unwrap();
    ts_proxy_src.set_property("proxy-context", format!("{}_proxy_context", name));
    ts_proxy_src.set_property("context", format!("{}_context", name));
    ts_proxy_src.set_property("context-wait", THROTTLING_DURATION.as_millis() as u32);

    let (pipeline, src_element, _sink_element, receiver) =
        setup(name, Some(ts_proxy_sink), Some(ts_proxy_src));

    nominal_scenario(name, pipeline, src_element, receiver);
}

#[test]
fn start_pause_start() {
    init();

    let scenario_name = "start_pause_start";

    let (pipeline, src_element, _sink_element, mut receiver) = setup(scenario_name, None, None);

    let elem_src_test = imp_src::ElementSrcTest::from_instance(&src_element);

    pipeline.set_state(gst::State::Playing).unwrap();

    // Initial events
    elem_src_test
        .try_push(Item::Event(
            gst::event::StreamStart::builder(scenario_name)
                .group_id(gst::GroupId::next())
                .build(),
        ))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::StreamStart(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    elem_src_test
        .try_push(Item::Event(gst::event::Segment::new(
            &gst::FormattedSegment::<gst::format::Time>::new(),
        )))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::Segment(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    // Buffer
    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![1, 2, 3, 4])))
        .unwrap();

    pipeline.set_state(gst::State::Paused).unwrap();

    pipeline.set_state(gst::State::Playing).unwrap();

    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![5, 6, 7])))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Buffer(buffer) => {
            let data = buffer.map_readable().unwrap();
            assert_eq!(data.as_slice(), vec![1, 2, 3, 4].as_slice());
        }
        other => panic!("Unexpected item {:?}", other),
    }

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Buffer(buffer) => {
            let data = buffer.map_readable().unwrap();
            assert_eq!(data.as_slice(), vec![5, 6, 7].as_slice());
        }
        other => panic!("Unexpected item {:?}", other),
    }

    // Nothing else forwarded
    receiver.try_next().unwrap_err();

    pipeline.set_state(gst::State::Null).unwrap();
}

#[test]
fn start_stop_start() {
    init();

    let scenario_name = "start_stop_start";

    let (pipeline, src_element, _sink_element, mut receiver) = setup(scenario_name, None, None);

    let elem_src_test = imp_src::ElementSrcTest::from_instance(&src_element);

    pipeline.set_state(gst::State::Playing).unwrap();

    // Initial events
    elem_src_test
        .try_push(Item::Event(
            gst::event::StreamStart::builder(&format!("{}-after_stop", scenario_name))
                .group_id(gst::GroupId::next())
                .build(),
        ))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::StreamStart(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    elem_src_test
        .try_push(Item::Event(gst::event::Segment::new(
            &gst::FormattedSegment::<gst::format::Time>::new(),
        )))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::Segment(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    // Buffer
    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![1, 2, 3, 4])))
        .unwrap();

    pipeline.set_state(gst::State::Ready).unwrap();

    pipeline.set_state(gst::State::Playing).unwrap();

    // Initial events again
    elem_src_test
        .try_push(Item::Event(
            gst::event::StreamStart::builder(scenario_name)
                .group_id(gst::GroupId::next())
                .build(),
        ))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Buffer(_buffer) => {
            gst_info!(
                imp_src::SRC_CAT,
                "{}: initial buffer went through, don't expect any pending item to be dropped",
                scenario_name
            );

            match futures::executor::block_on(receiver.next()).unwrap() {
                Item::Event(event) => match event.view() {
                    EventView::StreamStart(_) => (),
                    other => panic!("Unexpected event {:?}", other),
                },
                other => panic!("Unexpected item {:?}", other),
            }
        }
        Item::Event(event) => match event.view() {
            EventView::StreamStart(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    elem_src_test
        .try_push(Item::Event(gst::event::Segment::new(
            &gst::FormattedSegment::<gst::format::Time>::new(),
        )))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::Segment(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![5, 6, 7])))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Buffer(buffer) => {
            let data = buffer.map_readable().unwrap();
            assert_eq!(data.as_slice(), vec![5, 6, 7].as_slice());
        }
        other => panic!("Unexpected item {:?}", other),
    }

    pipeline.set_state(gst::State::Null).unwrap();
}

#[test]
fn start_flush() {
    init();

    let scenario_name = "start_flush";

    let (pipeline, src_element, sink_element, mut receiver) = setup(scenario_name, None, None);

    let elem_src_test = imp_src::ElementSrcTest::from_instance(&src_element);

    pipeline.set_state(gst::State::Playing).unwrap();

    // Initial events
    elem_src_test
        .try_push(Item::Event(
            gst::event::StreamStart::builder(&format!("{}-after_stop", scenario_name))
                .group_id(gst::GroupId::next())
                .build(),
        ))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::StreamStart(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    elem_src_test
        .try_push(Item::Event(gst::event::Segment::new(
            &gst::FormattedSegment::<gst::format::Time>::new(),
        )))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::Segment(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        other => panic!("Unexpected item {:?}", other),
    }

    // Buffer
    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![1, 2, 3, 4])))
        .unwrap();

    let elem_sink_test = imp_sink::ElementSinkTest::from_instance(&sink_element);

    elem_sink_test.push_flush_start(&sink_element);

    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![5, 6, 7])))
        .unwrap_err();

    elem_sink_test.push_flush_stop(&sink_element);

    elem_src_test
        .try_push(Item::Event(gst::event::Segment::new(
            &gst::FormattedSegment::<gst::format::Time>::new(),
        )))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Event(event) => match event.view() {
            EventView::Segment(_) => (),
            other => panic!("Unexpected event {:?}", other),
        },
        Item::Buffer(buffer) => {
            // In some cases, the first Buffer might be processed before FlushStart
            let data = buffer.map_readable().unwrap();
            assert_eq!(data.as_slice(), vec![1, 2, 3, 4].as_slice());

            match futures::executor::block_on(receiver.next()).unwrap() {
                Item::Event(event) => match event.view() {
                    EventView::Segment(_) => (),
                    other => panic!("Unexpected event {:?}", other),
                },
                other => panic!("Unexpected item {:?}", other),
            }
        }
        other => panic!("Unexpected item {:?}", other),
    }

    // Post flush buffer
    elem_src_test
        .try_push(Item::Buffer(gst::Buffer::from_slice(vec![8, 9])))
        .unwrap();

    match futures::executor::block_on(receiver.next()).unwrap() {
        Item::Buffer(buffer) => {
            let data = buffer.map_readable().unwrap();
            assert_eq!(data.as_slice(), vec![8, 9].as_slice());
        }
        other => panic!("Unexpected item {:?}", other),
    }

    pipeline.set_state(gst::State::Null).unwrap();
}


RCMP TSSIT OPS-II is a software based data sanitization method used in various file shredder and data destruction programs to overwrite existing information on a hard drive or other storage device.
Erasing a hard drive using the RCMP TSSIT OPS-II data sanitization method will prevent all software based file recovery methods from finding information on the drive and is also likely to prevent most hardware based recovery methods from extracting information.
What Does RCMP TSSIT OPS-II Do?
Some data sanitization methods will overwrite all the data with just zeros, like Write Zero. Others may use ones as well like Secure Erase, while some data wipe methods use random characters like with the Random Data and Gutmann methods.
The RCMP TSSIT OPS-II data sanitization method is usually correctly used as we show above, but we've also seen it implemented with random characters in place of some of the zero/one repeating passes in some programs.
What's meant by verifying the write in Pass 7 is just that the software that's using the data sanitization method will check that the storage device has actually been overwritten with random characters - the DoD 5220.22-M method does this after every single one of its passes. A verify pass will normally repeat itself if the verification check fails.
Many programs that support the RCMP TSSIT OPS-II wipe method will let you run the above sequence multiple times. That means after writing all the ones and zeros and then finishing with random characters, the application will just start back over from the beginning and continue to do that for however many repeats you've selected.
If you want to erase all the files on a storage device using the RCMP TSSIT OPS-II method, we recommend the free DBAN program. Software that runs while an operating system is currently being used can not erase that same hard drive (because many files are locked and can't be deleted), but DBAN is different in that it launches before the OS, and so must run from a CD or USB device.
Delete Files Permanently is a free file shredder tool that lets you delete any specific file or group of files using the RCMP TSSIT OPS-II sanitization method.
The program Eraser is another application that supports this data wipe method. It can be used to delete an entire hard drive like other data destruction programs, but can also be used to delete just single files and folders.
BCWipe and WipeDrive aren't free but they support this same data wipe method, too.
Most programs like these support multiple data sanitization methods in addition to RCMP TSSIT OPS-II. So if you'd like, you could actually choose a different method once you've started using the program, or even use another data wipe method before or after running RCMP TSSIT OPS-II.
The RCMP TSSIT OPS-II sanitization method was originally defined in Appendix Ops-II: Media Sanitation of the Technical Security Standards for Information Technology document, published by the Royal Canadian Mounted Police (RCMP). It's available here as a PDF.
However, RCMP TSSIT OPS-II is no longer the Canadian government's software-based data sanitization standard. The data sanitization standard in Canada is now CSEC ITSG-06 or a program that utilizes Secure Erase.