text:
Voice of the Gods
Age of the Five, Book 3
By: Trudi Canavan
Narrated by: Sarah Douglas
Series: Age of the Five, Book 3
Categories: Sci-Fi & Fantasy, Epic Fantasy
Priestess of the White
Age of Five, Book 1
When Auraya was chosen to become a priestess, she could never have believed that a mere 10 years later she would be one of the White, the gods' most powerful servants. Sadly, Auraya has little time to adapt to the exceptional powers gifted her by the gods. Mysterious black-clad sorcerers from the south plague the land, and rumours reach the White of an army being raised. Auraya and her new colleagues work tirelessly to seal alliances and unite the northern continent under their banner, but time is running out.
An enjoyable listen
By Katie on 23-12-12
The Ambassador's Mission
Traitor Spy Trilogy, Book 1
Narrated by: Richard Aspel
Sonea, former street urchin, now a Black Magician, is horrified when her son, Lorkin, volunteers to assist Dannyl in his new role as Guild Ambassador to Sachaka, a land still ruled by cruel black magicians. When word comes that Lorkin has gone missing Sonea is desperate to find him, but if she leaves the city she will be exiled forever, and besides, her old friend Cery needs her help.
Book 1 - Building Well, Good Listen!!
By David on 12-01-12
Narrated by: Grant Cartwright, Hannah Norris
In a world where an industrial revolution is powered by magic, Tyen, a student of archaeology, unearths a sentient book called Vella. Once a young sorcerer-bookbinder, Vella was transformed into a useful tool by one of the greatest sorcerers of history. Since then she has been collecting information, including a vital clue to the disaster Tyen's world faces.Elsewhere, in an land ruled by priests, Rielle the dyer's daughter has been taught that to use magic is to steal from the Angels.
Just didn't take off
By Sydney on 22-05-14
In the remote village of Mandryn, Tessia serves as assistant to her father, the village Healer - much to the frustration of her mother, who would rather she found a husband. Despite knowing that women aren't readily accepted by the Guild of Healers, Tessia is determined to follow in her father's footsteps. But her life is about to take a very unexpected turn. When treating a patient at the residence of the local magician, Lord Dakon, Tessia is forced to fight off the advances of a visiting Sachakan mage - and instinctively uses magic.
By J. R. Vine on 21-02-13
The Magician's Guild
The Black Magician Trilogy, Book 1
Sonea is caught up in a confrontation between the hated Guild magicians and the angry youth of the slums. To her dismay, she discovers that she possesses the same powers as the reviled magicians. To avoid capture, she must seek protection from the city's feared underworld, The Thieves. In return, she must use her powers for them, but her magic never seems to do quite what she intends it to.
Good book - shame about the narrator
By Brighton UK Customer on 16-08-09
Book One of Lightbringer
By: Brent Weeks
Narrated by: Simon Vance
Gavin Guile is the Prism, the most powerful man in the world. He is high priest and emperor, a man whose power, wit, and charm are all that preserves a tenuous peace. But Prisms never last, and Guile knows exactly how long he has left to live: Five years to achieve five impossible goals. But when Guile discovers he has a son, born in a far kingdom after the war that put him in power, he must decide how much he's willing to pay to protect a secret that could tear his world apart.
Great series! (new narrator)
The Witches of Eileanan
By: Kate Forsyth
Narrated by: Elle Newlands
On the Day of Reckoning, the witches of Eileanan were outlawed - and violations of the new order were punishable by death. Eileanan's Great Towers, once meccas of magic and learning, were left in ruins. And now, the entire land trembles in fear. Yet deep in the mountains, in the shadow of Dragonclaw, a young girl is being tutored in the old ways. Ignorant of her past, uncertain of her future, the foundling Isabeau will soon be forced down a dangerous path of prophecy, conspiracy, and magic.
By: Brandon Sanderson
Narrated by: Sophie Aldred
Defeated, crushed, and driven almost to extinction, the remnants of the human race is trapped on a planet that is constantly attacked by mysterious alien starfighters. Spensa, a teenage girl living among them, longs to be a pilot. When she discovers the wreckage of an ancient ship, she realizes this dream might be possible - assuming she can repair the ship, navigate flight school, and (perhaps most importantly) persuade the strange machine to help her. Because this ship, uniquely, appears to have a soul.
What a fun story - highly recommended
By TomzMullen on 18-12-18
Untitled Stormlight 4
The Stormlight Archive, Book 4
After forming a coalition of human resistance against the enemy invasion, Dalinar Kholin, and his Knights Radiant, have spent a year fighting a protracted, brutal war. Neither side has gained an advantage. Now, as new technological discoveries begin to change the face of the war, the enemy prepares a bold and dangerous operation. The arms race that follows will challenge the very core of the Radiant ideals, and potentially reveal the secrets of the ancient tower that was once the heart of their strength.
By: Garth Nix
Narrated by: Tim Curry
Ever since she was a tiny child, Sabriel has lived outside the walls of the Old Kingdom, away from the random power of Free Magic, and away from the Dead who won't stay dead. But now her father, the Mage Abhorsen, is missing, and to find him Sabriel must cross back into that world.
By Richard on 20-03-07
At the Sign of the Crow and Moon
A Sorcery Ascendant Prequel Novella
By: Mitchell Hogan
Narrated by: Oliver Wyman
In the bustling capital city of the Mahruse Empire, Felicienne Shyrise spends her days as a talented investigator, taking on stolen goods and missing person cases and the occasional murder the city guard are too incompetent - or too lazy - to resolve. During the nights she hones her skills playing Dominion, a board game almost as complicated as life itself. She dreams of making a name for herself and becoming the richest woman in the Empire.
Felicienne Revealed
Warbreaker
Narrated by: Alyssa Bresnahan
Warbreaker is the story of two sisters who happen to be princesses, the God King one of them has to marry, the lesser god who doesn't like his job, and the immortal who's still trying to undo the mistakes he made hundreds of years ago. Their world is one in which those who die in glory return as gods to live confined to a pantheon in Hallandren's capital city and where a power known as BioChromatic magic is based on an essence known as breath that can be collected only one unit at a time from individual people.
The Narrator spoilt it for me
By ZippyTip on 25-06-18
The Witch's Daughter
Shadow Chronicles, Book 1
By: Paula Brackston
Narrated by: Marisa Calin
My name is Elizabeth Anne Hawksmith, and my age is 384 years. Each new settlement asks for a new journal, and so this Book of Shadows begins… In the spring of 1628, the Witchfinder of Wessex finds himself a true Witch. As Bess Hawksmith watches her mother swing from the Hanging Tree she knows that only one man can save her from the same fate at the hands of the panicked mob: the Warlock Gideon Masters, and his Book of Shadows.
Transported to another dimension!
By Jenny on 13-04-16
Perfect Shadow
A Night Angel Novella
Narrated by: James Langton
Discover the origins of Durzo Blint in this original novella set in the world of Brent Weeks' New York Times best-selling Night Angel trilogy.... "I got a bit of prophecy," the old assassin said. "Not enough to be useful, you know. Just glimpses. My wife dead, things like that to keep me up late at night. I had this vision that I was going to be killed by forty men, all at once. But now that you're here, I see they're all you. Durzo Blint."
An entertaining, if very brief, ammendium
By Jason on 21-12-12
The Shadow of What Was Lost
The Licanius Trilogy, Book 1
By: James Islington
It has been 20 years since the end of the war. The dictatorial Augurs - once thought of almost as gods - were overthrown and wiped out during the conflict, their much-feared powers mysteriously failing them. Those who had ruled under them, men and women with a lesser ability known as the Gift, avoided the Augurs' fate only by submitting themselves to the rebellion's Four Tenets.
The tag line says it all...almost
The Redemption of Althalus
By: David Eddings, Leigh Eddings
Narrated by: Dennis Holland
It would be sheer folly to try to conceal the true nature of Althalus, for his flaws are the stuff of legend. He is, as all men know, a thief, a liar, an occasional murderer, an outrageous braggart, and a man devoid of even the slightest hint of honor. Yet of all the men in the world, it is Althalus, unrepentant rogue and scoundrel, who will become the champion of humanity in its desperate struggle against the forces of an ancient god determined to return the universe to nothingness.
A series in itself
By Jude Malcomson on 11-12-14
The Painted Man
The Demon Cycle, Book 1
By: Peter V. Brett
Narrated by: Colin Mace
The stunning debut fantasy novel from author Peter V. Brett. The Painted Man, book one of the Demon Cycle, is a captivating and thrilling fantasy adventure, pulling the reader into a world of demons, darkness and heroes. Voted one of the top ten fantasy novels of 2008 by amazon.co.uk. Sometimes there is very good reason to be afraid of the dark…Eleven-year-old Arlen lives with his parents on their small farmstead, half a day's ride from the isolated hamlet of Tibbet's Brook.
Gripping and Original Fantasy
By Dave on 01-06-15
Evermen Saga, Book 1
By: James Maxwell
Ella and her brother, Miro, are orphans, their parents killed long ago in the ongoing struggle against the mad Emperor. From the day Ella witnesses an enchanter using his talents to save Miro from drowning, she knows what she wants to be. But the elite Academy of Enchanters expects tuition fees and knowledge. Determined, Ella sells flowers and studies every book she can. Meanwhile, Miro dreams of becoming one of the world's finest swordsmen, wielding his nation's powerful enchanted weapons in defense of his homeland.
Better than mediocre, less than brilliant
By Frances on 21-06-15
Despite her hope for peace as the protector of the Siyee, Auraya is unable to avoid being caught up in the building conflict. As the gods' demands increase, Auraya finds that she must choose between those she loves and those she's sworn to serve. Meanwhile, Mirar enjoys acceptance and respect as he reclaims his place among his people, and Emerahl is at last able to join the Thinkers in their search for the Scroll of the Gods. The Pentadrians, determined to take their revenge on the conquering Circlians, plot and scheme to bring down their enemies by means other than direct conflict. The key to everything, though, may lie with the Wilds, who embark upon a quest for secrets buried long ago. Secrets that could change the world….
©2012 Trudi Canavan (P)2012 Audible Ltd
The High Lord
The Novice
Last of the Wilds
The Brightonomicon
Brilliant book, excellent story and narrated very well. Definitely worth a credit and / or purchase
Dan Butcher
Fantastic story and storytelling
I really enjoyed the narrator for this series. She got the different voices spot on and it was easy to listen to. The story itself is amazing and great depth to the characters
dsr25
Age of the 5 book 3
Where does Voice of the Gods rank among all the audiobooks you've listened to so far?
Quite high
What other book might you compare Voice of the Gods to, and why?
Dragonlance, there is enough complexity to the storylines
What about Sarah Douglas's performance did you like?
Easy to listen to
Was this a book you wanted to listen to all in one sitting?
Yes, but I couldn't, it's too long for that
Fab series, loved it ❤
excellent finale
Loved it an exciting finale to an excellent trilogy. Trudi Canavan at her best.
Chas S.
great story. i wish there was a prequel and sequel. The coming together of the immortals to unite in this book was my favorite part.
C Hall
great story and narration
I love Canavan's work. She has a great imagination which has been narrated perfectly in this trilogy.
Trudi Canavan: entertaining as always
Really enjoyed this trilogy, I like the diverse characters and the twists, spins, surprises and changes of allegiance.
There is a depth to the characters, and their flaws, mistakes and uncertainties are refreshing.
Weaving and connecting seemingly disjointed lands, peoples, lives and powers, the whole comes together satisfyingly well, yet leaving a window open a crack at the very end...
The narrator was consistently enjoyable, as she has been throughout. Lending a noticeable difference to the characters voices and mannerisms that makes this a pleasure to listen to.
this story never gets old!
i have all the books, the kindle editions and the audio books! absolutely my fave trudi canavan trilogy! it never gets old brilliant plots twists and plenty of magic i will continue re-reading and listning to these until i acheive immortality! the reading was brilliantly done her voice was a perfect choice!
an absolutely awesome series
the age of five has been one of the best series of books I have read and listen to. amazingly wrote and fantastically narrated. I was gripped all the way through.
Natasha Ely
I loved the storyline and the pace. This final chapter was a little simplistic and I had worked out the ending (no spoilers here) however I still enjoyed the journey.
I am a huge fan of Trudi Canavans writing but I preferred the Black Magician trilogy although this is definitely worth a read!
A satisfactory ending to a good trilogy
Not as impressive as JRR Tolkien's The Lord of the Rings and The Hobbit and George RR Martin's Song of Ice and Fire but better than The Secrets of the Immortal Nicholas Flammel and Trudi Canavan's Black Magician's trilogy and other books set in that fantasy world. Worse than Sherlock Holmes, better that James Bond, equal with the Vorkosigan saga.
What other book might you compare Voice of the Gods to and why?
Trudi Canavan's black Magician trilogy's "The High Lord" as it also concludes as series, includes a "forbidden" love affair and leave the "fantasy universe" in which it plays out completely changed, but I think this book is a bit better.
Which character – as performed by Sarah Douglas – was your favorite?
The veeze Mischief.
Not really, but it was easy enough to follow and at places it drew me in.
I thought the way the game pieces in this game of chess turned on those moving them was an excellent idea.
a unique universe with great depth
I enjoy the concept of universe where the magic is present almost everywhere and that all can access it to some degree. Plus the variety of the the landscape makes for interesting travel throughout the lands.


Know exactly how many cuts dies are making and when they need replacing with Trumeter's 7110-DIE counter.
A counter, durably built for flat and rotary die cutters, the 7110-DIE enables better quality and cost control, forecasting and maintenance schedules. When quality cuts and precision matter, stop guessing – contact us today for more information or a free sample.


Carlos Anderson opened his Fit Body Boot Camp in Rancho Cucamonga, California to help people take charge of their lives through positive changes to their diet and exercise habits.
A huge part of his gym's success is the six-week fitness challenge that gets new members into the gym and seeing results. Carlos generates consistent leads from Facebook ads and enjoys an ever-growing number of loyal members.
But there's always room for improvement, right? Carlos wanted to make sure his members and leads were actually engaging with his messages.
With hundreds of people to contact, Carlos needed a platform that allowed him to automate messages as well as individualize them.
He used Skipio to craft two texts and a simple voicemail.
The first message introduced his referral program and was sent to unsold leads and current customers.
The second message gave current customers the opportunity to make requests for supplement orders.
With Skipio's custom fields, he included every contact's first name in all of the messages. And once he asked members for supplements, he could turn those messages into templates and create new custom fields that would then autofill their requests in future messages.
The first time Carlos used this engagement strategy, the first message had a 58% response rate and garnered him $1,200 in new memberships. Plus, he scheduled 10 new appointments.
The second message led to a 120% increase in supplement orders, earning him another $675.
His ringless voicemail brought in another $1,200 in memberships and got him five more appointments.
Now Carlos schedules those exact same messages to go out once a month. And it all happens automatically.


text:
Tobacco industry exposed for continuing to mislead public about e-cigarettes
Categories: Advisories & Comments, Advocacy News
WASHINGTON, D.C., July 25, 2019 — The American Heart Association, the leading voluntary health organization devoted to a world of longer, healthier lives, issued the following statement from CEO Nancy Brown following hearings in the House Committee on Oversight and Reform Subcommittee on Economic and Consumer Policy today and yesterday on Juul Labs' contribution to the youth nicotine epidemic:
"The tobacco industry's false assurances in response to the e-cigarette epidemic should be deeply concerning to every parent in America. The industry continues to minimize its role in causing the epidemic, even as more facts come to light about how e-cigarette manufacturers exploit teenagers to drive up nicotine addiction and boost corporate profits. Elected officials must act to protect youth and adolescents by cracking down on the tobacco industry and pressing the FDA to ensure e-cigarettes are subject to the same requirements as traditional cigarettes.
"Two days of congressional hearings added to the already overwhelming evidence that Juul has systematically addicted youth and adolescents to its products. Student Caleb Mintz testified that Juul demonstrated its products to 9th graders in his New York school and described e-cigarettes as 'totally safe.' Nurse Rae O'Leary testified that Juul treated Native American tribes as 'guinea pigs' when it sought to provide its products for free to members of the Cheyenne River Reservation in exchange for a six-figure payment. Stanford University researcher Dr. Robert Jackler said Juul's initial marketing effort was designed to create a 'cult-like following.' Dr. Jonathan Winickoff, a member of the American Academy of Pediatrics, and Matthew Myers, president of the Campaign for Tobacco-Free Kids, also testified about the epidemic of youth e-cigarette use.
"Incredulously, Juul Co-Founder and Chief Products Officer James Monsees testified that the company 'never wanted' teenagers to use its products while admitting Juul rushed its products to market to evade FDA regulation and continues to market flavors that appeal to kids. Juul Labs CEO Kevin Burns previously told CNBC he was 'sorry' that teenagers are using e-cigarettes. Yet Juul has relied on tobacco industry tactics to aggressively target youth and adolescents. Marlboro manufacturer Altria owns a 35 percent stake in Juul, and tobacco companies have a long history of targeting underage users, including social media promotions for products that are available in thousands of flavors that appeal to kids. The evidence is clear that the tobacco industry's predatory practices directly contributed to a 78 percent rise in use among high schoolers and a 48 percent increase among middle schoolers in 2017-18 alone.
"The path forward is clear: The FDA must strengthen existing sales restrictions on e-cigarettes. The agency should:
Remove flavored e-cigarettes from the market, including mint and menthol flavors;
Prohibit all marketing practices, including those on social media, that are shown to appeal to children;
Suspend online sales of e-cigarettes until effective age verification mechanisms are established;
and Enforce rules that prevent the sale of products that were not commercially marketed as of August 8, 2016, or were modified after that date, without premarket review.
"In addition, federal, state and local lawmakers should unite behind proposals to:
Increase the sales age to 21 for all tobacco products;
Raise tobacco excise taxes; Implement comprehensive clean indoor air laws;
Support comprehensive coverage of evidence-based tobacco cessation therapies;
and Eliminate the sale of tobacco in pharmacies and other health-related outlets.
"The American Heart Association is committed to ending tobacco use and nicotine addiction in the U.S. Strong oversight of e-cigarettes is desperately needed to address the industry-caused e-cigarette epidemic. We want to thank Chairman Raja Krishnamoorthi (D-IL), Ranking Member Michael Cloud (R-TX), and Members of the Oversight and Reform Subcommittee on Economic and Consumer Policy for calling attention to this critical public health issue."
About the American Heart Association
The American Heart Association is a relentless force for a world of longer, healthier lives. We are dedicated to ensuring equitable health in all communities. Through collaboration with numerous organizations, and powered by millions of volunteers, we fund innovative research, advocate for the public's health and share lifesaving resources. The Dallas-based organization has been a leading source of health information for nearly a century. Connect with us on heart.org, Facebook, Twitter or by calling 1-800-AHA-USA1.
Steve Weiss: 202-785-7905; steve.weiss@heart.org
For Public Inquiries: 1-800-AHA-USA1 (242-8721)
heart.org and strokeassociation.org
AHA CEO Nancy Brown
Nancy Brown, Chief Executive Officer, American Heart Association
copyright American Heart Association 2019

redpajama_set_name: RedPajamaCommonCrawl


text:
"THE LONG GOODBYE"
"THE LONG GOODBYE" was Robert Altman's weirdo 1973 take on the Raymond Chandler noir novel, made as Altman was truly at the height of his improvisational, experimental powers. When I watch films he made in this era like "California Split" and "3 Women", I still have trouble believing that they were financially backed by major studios. They're so "of the auteur" and so personal, abstract and unusual - and yet hugely entertaining, funny and engrossing - they truly point to a moment in time (the 70s) justly celebrated for this type of cinematic creativity. Friends of mine have said this one is their favorite of all Altman films. I won't go that far, but after finally checking the box on it, I'll say it's a singularly unique achievement and right up there with his best. I'm going to watch it at least another two or three times and pick it apart some more before I shuffle off this mortal coil.
As you may know, Altman let his actors and actresses take his rough script and plot outlines and go almost anywhere they wanted to with them. While not as wild and verbose as he was in "California Split", the excellent Elliott Gould (private Los Angeles detective Phillip Marlowe) is a motormouth mumbler who talks to himself, to his cat, and has some trouble having normal, intelligible conversations with the people around him - though Altman portrays all the strange dialogue in this film as "normal". This was also at the height of Altman's "everyone talk at once" phase, so the scenes of the beautiful hippie nudist yoga women on their balcony as they talk to their neighbor Marlowe, and each other, are as jarring and otherworldly as anything in "McCabe and Mrs. Miller". Combine that with his gauzy technicolor style and the filters he put on his lenses, and you've got something that definitely exists in its own world.
However, it is a fairly straightforward noir/detective adaptation at its core. I saw the name "Jim Bouton" in the opening credits and thought, ha, that's funny, same name as the Seattle Pilots baseball player who wrote the 1969 tell-all book "Ball Four" that was one of my fave books as a teenager. Turns out it is Bouton, in his only film role ever, as Terry Lennox, the man whom Marlowe unwittingly shuttles down to Mexico to escape from killing his wife and stealing a big load of money from drug dealers, an act that sets some - not all - of the film in motion. Sterling Hayden, as the alcoholic writer Roger Wade, is amazing and a real site to behold - a stumbling, staggering Popeye brute of a man who looks ready to pop anyone & everyone in the mouth at any time, and who literally walks into the sea to end his life in the course of the film.
Gould is on camera the entire film, pretty much. Marlowe is a restless, hunch-driven, seat-of-his-pants sort of detective, and at no point do you ever get any sense that he's exceptional or has prior success at his job. That said, he solves this case in a big way. A cigarette is in his mouth at virtually all moments in the film, and he appears nervous and yet composed and confident at the same time. He gathers some clues and flirts a bit with Eileen Wade, played by Nina Van Pallandt, and as mentioned previously, runs into her crazy drunk of a husband in several classic scenes. It's clear that Altman's deconstructing the "private eye movie" and Chandler's work, and pulling it all into a worldview that only he and a generation of film studies studies might be able to explain. I can't. I just know when it ended I laughed out loud, the way I do when I've seen something wholly original and wild.
Labels: Film
THREE A-GRADE FILMS TO LET YOU KNOW ABOUT
PRETTY SURE I'M GETTING INTO SOCCER
"THE IMPOSSIBLE"
"SLEEPWALK WITH ME"
DYNAMITE HEMORRHAGE RADIO #2
ACTUALLY, I DO WANT TO TAKE AWAY YOUR GUNS
"THE WOODMANS"
"YOUR SISTER'S SISTER"
BOOK REVIEW: "WE GOT POWER: HARDCORE PUNK SCENES F...


text:
Two Toasters is a mobile design and development company based in North Carolina, with offices in New York. They provide iOS and Android application development and strategy.

History

Two Toasters was founded by Rachit and Adit Shukla, along with three friends, in 2008 following the launch of Apple's App Store.

In their first few years, the company worked with other tech startups and with large firms on mobile development and strategy. They developed apps for Airbnb, Dick's Sporting Goods, and GateGuru (now owned by TripAdvisor). More recently, Two Toasters developed apps for Regal Cinemas, Fat Wallet, and JackThreads.

In December 2014 the company moved to its current location in the American Tobacco Historic District after expanding its staff. In January 2015 Gigaom reported that the company is developing an "Ara Manager" Android app for Google.

On March 31, 2015, Two Toasters announced it was acquired by Ticketmaster, and changed its name to Ticketmaster Mobile Studio.

As of October 23, 2019 Ticketmaster Mobile Studio's Twitter, Facebook, GitHub, and LinkedIn pages are deleted, and Google reports their main office at 318 Blackwell St. is permanently closed.

Awards and honors
Two Toasters has won a 2014 Webby award for the Birchbox iOS app  and was ranked 787 on the 2014 Inc. 5000 list of companies

References

2008 establishments in North Carolina
Defunct companies based in North Carolina

redpajama_set_name: RedPajamaWikipedia


text:
THINKING AUTISM
Can Autism Be Cured?
Autism Facts & FAQs
ReThinking Autism blog
Where Do I Start
Latest Autism Research
Free CPD Resources
Clinical Toolkit for Autism
Autism Treatments Trials
Professionals' Network
What We Do & Why
Benefit From Membership
Become a Friend of TA
Press Release: Vaccine passports would deepen discrimination against people with autism
Apr 27, 2021reThinking Autism blog
Thinking Autism charity warns that vaccine passports could further entrench discrimination against people with autism
In World Autism Month, national charity Thinking Autism has warned that vaccine passports could further entrench discrimination against people with autism, who are among the most marginalised and vulnerable members of the community.
The trustees of the charity have issued a statement which reads:
"There are a number of factors which could prevent people with autism from having a covid vaccination.
Many individuals with autism have comorbid health issues which may make vaccination risky. For example, 20-40% experience seizures at some point during their lives, and epilepsy is the leading cause of death in autism. The average life expectancy of a person with autism and learning disability is just 39.5 years.
We are concerned about the lack of data on the safety of the vaccine for those with autism who may also be prone to seizures or who are already epileptic. This is especially worrying given that the Yellow Card reporting system indicates that seizures are a possible side effect of both the Pfizer and Astra Zeneca vaccines.
Furthermore, there are many other medical conditions which are highly prevalent in autism, including allergies and autoimmune disorders. Diagnostic overshadowing in autism (the widespread tendency to attribute symptoms of other medical conditions to autism) means that there may be many individuals with autism whose allergies and autoimmune disorders have not been diagnosed. The presence of severe allergies is a contraindication for the covid vaccinations.
"Given the complex presentation and large number of (often undiagnosed) comorbid medical conditions in autism, our charity recommends that, as a precaution, they should not be required to have the vaccine until more research into its effects on this cohort has been carried out."
In addition to the medical issues, many individuals with autism exhibit profound behavioural challenges, sensory processing difficulties and extreme anxiety. Trypanophobia (fear of needles) is common in individuals with autism, making it difficult or impossible to administer vaccines without full anaesthesia. It is for this reason that people with autism often have to undergo regular dental check-ups and procedures under general anaesthetic.
Behavioural challenges and altered sensory processing in some autism can also make it impossible to conduct a nasal swab test.
These issues are likely to lead to situations where individuals with autism would suffer blatant discrimination due to their inability to obtain a vaccine passport or a negative test result.
Routine is very important to many people with autism, who may well experience major distress if barred from participating in their usual activities due to lack of a vaccine passport. Moreover, those with severe communication difficulties might not be able to understand the reason for their exclusion, and may express their frustration through self-harming or aggression.
These problems would also increase the burden of stress and anxiety borne by the carers of those individuals.
We therefore hold that mandatory vaccine passports would further deepen the discrimination experienced by individuals with autism and their families."
For further information please contact the Thinking Autism trustees.
1.Thinking Autism is a UK charity providing support and information to families and individuals affected by autism.
Medical Comorbidities in Autism Spectrum Disorders
Identifying and managing seizures in autism
Hirvikoski T, Mittendorfer-Rutz E, Boman M, et al. (2016) Premature mortality in autism spectrum disorder. Br J Psychiatry. Mar;208(3):232-8 – link.
Schendel DE, Overgaard M, Christensen J, et al. (2016) Association of Psychiatric and Neurologic Comorbidity With Mortality Among Persons With Autism Spectrum Disorder in a Danish Population. JAMA Pediatr. Mar;170(3):243-50 – link.
Autism Moms Have Stress Similar To Combat Soldiers
The psychological impact of the COVID-19 pandemic on adults with autism: a survey study across three countries – link.
More ReThinking Autism articles
Mouth Development in Autism
What happens when your adult child needs hospitalisation?
The Neglected Side of Autism – Why We MUST Talk Medical
Finding your kindness: Autism and COVID-19
My Son's Autism and Disability: Unintended Consequences of a Polarised Debate
Autism and auditory processing
Misperceptions of ASD Neurodiversity and Health Recovery
An Introduction to Vision Therapy as a Treatment for Autism
Turning the Tide of Behaviourism
Underdiagnosed Problems That Parents Should Know About My son is 18 and has severe autism. Since his regression just before his second birthday we've seen six speech language pathologists, four dentists and one ENT doctor. I raised the issue of either breathing or...
Please find our most recent blog, this one from the parent of a young adult with autism. If you happen to have any further suggestions or resources to help out families who find themselves in this situation, please send them to us. My son Ben, aged 21, was recently...
We are getting it wrong and ignorance is hurtingA few weeks ago, I read some posts on an autism support group that upset me profoundly. Questions were being asked about how to stop a child with autism from withholding bowel movements. Comments were made about small...
Finding your kindness: Autism and COVID-19 I'm holding my son's hand as we walk through the parking lot toward the grocery store. People give us looks. He's 17 and they likely cannot understand why we're holding hands. We're used to this but the judgement seems to be...
The social and medical models of disability What could possibly motivate a busy parent like myself, with not enough hours in the day, to take time out to write about the social and medical models of disability? The incentive, a very powerful one, is my son, who has...
The impact of auditory processing issues in autism It is well understood that many on the autism spectrum experience challenges with processing a range of sensory information. This is wonderfully covered in previous Thinking Autism blogs 'Misperceptions of ASD...
As a Chartered Psychologist, child development researcher and author in the autism/ASD field, I frequently meet misperceptions of neurodiversity in relation to programmes for autism and health recovery. Somehow or other the belief has developed that to offer such help to an individual on the autistic spectrum is to deny their neurodiversity. In this blog I suggest a new way of looking at this subject…
I hope that my journey in vision therapy will serve not only as a roadmap for people with mild autism to find their way out of the labyrinth of disability but as something that can provide clues to help those with more severe autism find their way to a life more fully lived.
Please find below some thoughts from Romulus Campan, an adult with autism and a delegate at our recent conference. I had the pleasure of talking to Rom at the conference. I cannot remember the last time I met someone so open-minded, eager to take in new information in...
Autism acceptance – false dichotomies and the damage done
When discussing autism—especially on the internet and in the media—there are way too many people who recklessly engage in false dichotomy. It's a kind of extremism that gets us nowhere…I can say with 100% certainty that while I seek treatments for my child with autism, my acceptance of him is unconditional.
What is wrong with The Labour Party's "Autism Neurodiversity Manifesto" and autism identity politics?
Recently in the UK, a "Neurodiversity Manifesto" has been shared by the Labour Party. It has five key principles, each of them lacking in nuance, unreflective of the lived experiences, and ignoring research data.
Kirsten Robertson	on 7th September 2021 at 5:25 pm
Thank you so much for your article about the vaccine passport and discrimination against those not able to have the vaccine.
My children have a syndrome that we believe predisposes them to vaccine damage, which in our son we believe has caused a severe disability.
We therefore aren't able to vaccinate our children with the covid vaccine, but as parents have both been vaccinated.
We are worried about what the future holds in particular for our daughter who is not as severe, will hopefully end up in employment and will want to go to the cinema etc.
We will definitely print off the certificate and fill that in.
Keep informed – subscribe to our mailing list
We will email you autism-related news and updates. You can unsubscribe at any time.
DISCLAIMER The purpose of this site is to provide information. No information on this website should be construed as medical advice. Neither article authors, associated charities, nor individual contributors take any responsibility or liability for any decision taken by site visitors as a result of the information contained herein or the external links provided. If you need medical advice, please seek it from a suitably qualified practitioner.
© 2021 Thinking Autism | All rights reserved | Registered Charity: No. 1113628, Limited Company Registered in England: No. 05594787 | Registered address: International House, 24 Holborn Viaduct, London, EC1A 2BN | Contact tel. 07518131697


text:
package org.drools.modelcompiler.constraints;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.drools.core.base.CoreComponentsBuilder;
import org.drools.core.util.ClassUtils;
import org.drools.model.functions.Function1;

import static org.drools.core.util.Drools.hasMvel;

public class LambdaFieldReader implements Function1 {

    private final Method accessor;
    private final String field;

    public LambdaFieldReader( Class<?> clazz, String field ) {
        this.accessor = ClassUtils.getAccessor( clazz, field );
        this.field = field;
    }

    @Override
    public Object apply( Object o ) {
        try {
            if (accessor != null) {
                return accessor.invoke( o );
            }
        } catch (IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException( e );
        }
        if (!hasMvel()) {
            throw new RuntimeException("Complex timestamp expressions can be used only with drools-mvel on classpath");
        }
        return CoreComponentsBuilder.get().getMVELExecutor().eval( field, o );
    }
}

redpajama_set_name: RedPajamaGithub


text:
Home Journals IJHT Analysis for Thermal Performance and Energy-Efficient Technology of Prefabricated Building Walls
Citation List
CiteScore 2019: 3.30 ℹCiteScore:
CiteScore is the number of citations received by a journal in one year to documents published in the three previous years, divided by the number of documents indexed in Scopus published in those same three years.
SCImago Journal Rank (SJR) 2019: 0.300 ℹSCImago Journal Rank (SJR):
The SJR is a size-independent prestige indicator that ranks journals by their 'average prestige per article'. It is based on the idea that 'all citations are not created equal'. SJR is a measure of scientific influence of journals that accounts for both the number of citations received by a journal and the importance or prestige of the journals where such citations come from It measures the scientific influence of the average article in a journal, it expresses how central to the global scientific discussion an average article of the journal is.
Source Normalized Impact per Paper (SNIP) 2019: 0.669 ℹSource Normalized Impact per Paper(SNIP):
SNIP measures a source's contextual citation impact by weighting citations based on the total number of citations in a subject field. It helps you make a direct comparison of sources in different subject fields. SNIP takes into account characteristics of the source's subject field, which is the set of documents citing that source.
240x200fu_ben_.jpg
Analysis for Thermal Performance and Energy-Efficient Technology of Prefabricated Building Walls
Dezhi Zou* | Cheng Sun
School of Architecture, Harbin Institute of Technology, Key Laboratory of Cold Region Urban and Rural Human Settlement Environment Science and Technology, Ministry of Industry and Information Technology, Harbin 150001, China
Architecture College, Inner Mongolia University of Technology, Inner Mongolia Key Laboratory of Green Building, Huhhot 010051, China
Corresponding Author Email:
zdz@imut.edu.cn
https://doi.org/10.18280/ijht.380129
| Citation
38.01_29.pdf
At present, prefabricated buildings have been widely used in residential buildings and industrial plants. The energy-efficient design of their walls has increasingly become the focus of design in the construction industry. Taking the commonly used composite walls of prefabricated buildings in Inner Mongolia as the research object, the authors aim to explore the thermal performance of prefabricated building wall under cold conditions, and study the energy-efficient technology by determining the optimal thickness of the insulation layer. The study found that the external envelope structure such as the walls is the main heat dissipation method of the prefabricated building; as the thickness of the insulation layer increases, the thermal conductivity of the wall decreases, and the thermal inertia index increases, showing better insulation characteristics; the heat flux density of the composite wall designed with the external insulation layer was the smallest; the average daily heating power consumption of the composite wall with the polystyrene plastic interlayer was the minimum, and it reduced by 21.65% compared with the no-intermediary insulation layer. The research findings provide guidance and suggestions for the composite wall design and material selection of prefabricated buildings in Inner Mongolia.
prefabricated building, energy-efficient design, composite wall, thermal performance, thermal conductivity
Building energy efficiency is a rigid indicator of the construction industry. Due to their great advantages in energy efficiency, environmental protection and earthquake resistance, prefabricated buildings have gradually become an inevitable trend in the development of urbanized residential construction projects [1]. Various new types of prefabricated building materials have emerged one after another. In prefabricated buildings, the thermal energy consumption of the wall occupies 20% -50% of the total, and becomes the external maintenance structure with the most heat loss [2]. At present, there are many wall materials for prefabricated buildings, including prefabricated insulation board walls and multi-cavity composite walls etc., which vary in the heat and moisture transfer, engineering cost and energy-saving performance. Taking multi-cavity composite walls for examples, there is a big difference in the heat and moisture transfer of walls between different cavity forms [3]. The heat transfer and energy efficiency characteristics of the wall's envelope structure are closely related to the material. Currently, as a lightweight, high-strength and thermally insulating structural member, the composite wall structure is the most commonly used [4].
In terms of building structure, prefabricated building walls belong to the envelope structure. The thermal system inherent in this envelope structure exhibits dynamic heat transfer characteristics under the action of external thermal signals that change with time [5]. Compared with the energy-saving technology of wall building in foreign developed countries, the unit energy consumption of the prefabricated building wall in China is still much higher than that in developed countries. With the continuous deepening of research and application, the insulation performance indicators related to the wall structure of China's buildings have been also constantly improving [6]. The design of building structure has gradually focused on selecting the walls with different thickness and materials for different regions. Unlike masonry structures and traditional masonry filled walls, the insulation layer of prefabricated building walls can effectively block heat conduction, playing a good role in heat preservation and energy saving [7]. Taking the commonly used composite wall of prefabricated buildings in Inner Mongolia as the research object, this paper attempts to study the thermal performance and the energy-efficient technology of the composite wall under cold conditions by determining the optimal thickness of the insulation layer. This study provides strong support for promoting the composite wall of the prefabricated building.
2. Status Analysis for Prefabricated Building Systems and Thermal Conduction of Walls in Inner Mongolia
With the development of prefabricated buildings, the industrialized wall structure has formed, including fully prefabricated shear wall systems, prefabricated sandwich insulation wall systems and double-sided laminated shear wall systems [8, 9]. The most widely used in Inner Mongolia is the prefabricated sandwich insulation wall system, which not only ensures the most basic maintenance and load-bearing functions, but also meets the requirements of fire protection and thermal insulation [10]. The middle insulation layer of the prefabricated sandwich insulation wall system has the same service life as the building, and requires no maintenance during the entire life cycle. Furthermore, the fabricated construction outside the wall can effectively shorten the construction cycle [11]. Figure 1 shows the heat loss ratio of prefabricated buildings in Inner Mongolia. According to the statistics, the heat loss of walls and other external envelope structures account for 41.67%, followed by doors and windows, i.e., 37.96%; the heat loss of the roof, ground and ventilation accounts for about 20%. Thus, the heat loss of the wall and other external envelope structures is the largest.
The wall of the prefabricated building creates an indoor space for humans, as an important carrier for the formation of the indoor thermal environment. Figure 2 shows the heat energy source and loss path of the prefabricated building in Inner Mongolia. The heat energy sources include heating systems, solar radiation, heat dissipation from household appliances and human heat, etc.; the heat loss path includes heat dissipation of the external envelope structure, cold air infiltration, hot water discharge and water vapor removal, etc., of which the most important way of heat loss is heat dissipation of the envelope structure. Some buildings use prefabricated sandwich thermal insulation wall systems as the internal wall, and the add-on sandwich panels as external wall. It has been found by some scholars that the add-on insulation wall panels can achieve lower thermal conduction effect, but as the building's service life increases, the effect decreases [12, 13].
Figure 1. Heat loss ratio of prefabricated buildings in Inner Mongolia
Figure 2. Heat sources and loss path in prefabricated buildings
3. Thermal Performance Analysis of Prefabricated Building Walls
3.1 Thermal performance of composite wall
The thermal insulation performance and energy-efficient performance of composite walls are superior to ordinary walls. Not only can they be constructed in different shapes to meet people's increasing aesthetic requirements, but also bring the building a modern atmosphere, thus providing favorable conditions for the development of industrialization of construction [14]. Figure 3 is a photo of an assembled composite wall, which is divided into different composite walls according to different insulation materials. Based on the design standards for energy efficiency of wall building, the thermal performance of the wall depends on the heat transfer coefficient, heat transfer resistance and thermal inertia system. The thermal resistance R of the composite envelope structure is calculated as shown in Eq. (1) and (2):
$\mathrm{R}=\mathrm{R}_{1}+\mathrm{R}_{2}+\ldots+\mathrm{R}_{\mathrm{n}}$ (1)
$\mathrm{R}_{\mathrm{i}}=\frac{\delta_{i}}{\gamma_{i}}$ (2)
where, Ri is the thermal resistance of the i-th layer material, $\delta_{i}$ is the thickness of the i-th layer material, and $\gamma_{i}$ is the thermal conductivity of the material.
The thermal inertia index D of the composite envelope structure is calculated as shown in Eq. (3) and (4):
$\mathrm{D}=\mathrm{D}_{1}+\mathrm{D}_{2}+\ldots+\mathrm{D}_{\mathrm{n}}$ (3)
$\mathrm{D}_{\mathrm{i}}=\mathrm{R}_{\mathrm{i}} * \mathrm{S}_{\mathrm{i}}$ (4)
where, Di is the thermal inertia index of the i-th layer material, and Si is the heat storage coefficient of the material.
The heat transfer coefficients K of the composite envelope structure is calculated as shown in Eq. (5):
$\mathrm{K}=\frac{1}{R_{\mathrm{o}}}$ (5)
Figure 3. Photo of assembled composite wall
3.2 Thermal performance analysis of composite wall
Figure 4 shows the thermal performance and characteristics of different composite walls. The interlayer of composite walls generally includes a closed insulation layer, a natural flow insulation layer, and a mechanical flow insulating layer. Among them, the closed insulation layer plays the role of thermal insulation and improves the indoor thermal comfort; the natural flow insulation layer realizes passive cooling, natural ventilation and hot air heating in the room; the mechanical flow insulation layer achieves indoor hot air heating and fresh air supply, and reduces the transfer of heat load. This study aims to explore the thermal performance of different composite walls. For this, the laboratory tests were conducted on walls with different interlays, to probe into the thermal conductivity and thermal inertia index of different-thickness insulation walls.
Figure 4. Thermal performance and characteristics of different composite walls
Table 1. Conversion of thermal parameters of middle layer of composite wall
Material characteristics
Density kg/m3
Heat conductivity coefficient J/(m∙s∙k)
Specific heat capacity kJ/(kg∙K)
No intermediary
Polystyrene plastics
Perlite powder
Loose rice husk
Figure 5. Thermal conductivity of walls with different intermediate insulation thickness
Figure 6. Thermal inertia index of wall with different intermediate insulation thickness
Table 1 lists the thermal parameters converted from the middle layer of the composite wall, including the density, thermal conductivity and specific heat capacity of the no-intermediary materials and three other different materials. Figure 5 shows the thermal conductivity of the wall with different thickness of the middle insulation layer. It can be clearly seen that as the thickness of the insulation layer increases, the thermal conductivity of the wall decreases, showing a better thermal insulation effect. Furthermore, using the loose rice husk as the material of the insulation layer, as the thickness of the insulation layer increases, the thermal conductivity decreases less; as the thickness is greater than 50mm, it has little effect on the insulation effect. Figure 6 shows the thermal inertia index of the wall with different thickness of the middle insulation layer. It can be clearly seen that as the thickness of the insulation layer increases, the inertia index of the wall increases, showing the test results opposite to the thermal conductivity.
4. Energy-Efficient Analysis of Prefabricated Building Walls
4.1 Analysis of building energy consumption of different composite walls
A fixed indoor space ensures a stable environment. The influence of outdoor temperature change and solar radiation intensity on the indoor environment directly determines the quality of the building. In the actual project in Inner Mongolia, the thermal performance of the different prefabricated building walls is not stable. It is of great significance to explore the energy consumption of different composite walls during the energy-saving design of the walls. The energy-efficient effect of the building structure is positively related to the thermal performance. Energy consumption analysis was carried out using Equest energy consumption simulation software, which can set meteorological parameters and heat energy sources and losses, with reference to the existing composite wall design. Figure 7 compares the heat flux density of different walls. It can be seen that the fluctuation of the heat flux density of the closed insulation layer was relatively small, and its heat flux density value was greater than other composite walls at any time; that of the natural flow insulation layer was in the second place; that of the mechanical flow insulation layer in the composite wall was the lowest, but the fluctuation of its heat flux density was the largest, mainly related to the convection heat transfer of the composite wall.
The setting of the insulation layer also has an important impact on the energy saving of the wall. Figure 8 shows the heat flux density of the composite walls with different insulation layer settings. It can be clearly seen that the heat flux density of the composite wall with external insulation layer was the smallest, mainly because the external insulation layer can reduce the heat flux density of the heat bridge; followed by the composite wall with the built-in insulation layer, because the built-in insulation layer occupies the indoor pore size. These two types of insulation layers are mostly used. For the convenience of calculation parameter setting, this paper only calculates the daily heating power consumption of prefabricated sandwich-type composite walls. Figure 9 shows the average daily heating power consumption of different composite walls. Compared with the non-intermediary wall, the daily heating power consumption of the interlays/middle layers made of polystyrene plastic, Perlite powder and loose rice husk decreased by 21.65%, 15.86% and 8.30%, respectively.
Figure 7. Comparison of heat flux of different walls
Figure 8. Heat flux of composite wall with different insulation layer settings
Figure 9. Average daily heating consumption of different composite walls
4.2 Economic analysis for composite walls of prefabricated buildings
At present, there are generally two types of insulation layers for composite walls of fabricated buildings: external insulation layers and built-in insulation layers. The external insulation layer basically eliminates the influence of thermal bridges, effectively improves the waterproofness of the walls, and facilitates the future energy-saving renovation of buildings, but requiring high cost, and later maintenance and resetting; the built-in insulation layer effectively protects the insulation materials, ensuring the insulation materials to have the same service life as the buildings. However, such layer is prone to thermal bridges, and is detrimental to the seismic performance of buildings. The comparative analysis for the heat flux density of the two composite walls found that the heat flux density of the two insulation layers is not much different, and the external insulation layer has a relatively lower heat flux value, ensuring a better energy saving effect. For economic considerations, composite walls of sandwich-type insulation layer should be used, which can be prefabricated in batches, and the insulation layers with mechanical flow interlayer have better thermal performance. By comparing the average daily heating power consumption of the three interlayer, the use of polystyrene plastic in the interlayer in Inner Mongolia can achieve greater economic benefits.
Taking the commonly used composite walls of prefabricated buildings in Inner Mongolia as the research object, this paper aims to explore their thermal performance under cold conditions, determines the optimal thickness of the insulation layer, and studies the energy-efficient technology of the composite wall. The specific conclusions are as follows:
(1) The main sources of heat energy for prefabricated buildings in Inner Mongolia include heating systems, solar radiation, heat dissipation from household appliances, and human heat; the heat loss path include heat dissipation of external envelope structures, cold air infiltration, hot water discharge, and water vapor removal etc., and the most important way of loss is heat dissipation of the external envelope structure.
(2) As the thickness of the insulation layer increases, the thermal conductivity of the wall decreases, showing better thermal insulation; as the thickness increases, the thermal inertia index of the wall increases, showing the test results opposite to the thermal conductivity.
(3) The heat flux density of the closed insulation layer fluctuates relatively small, and it is greater than the insulation layers with natural flow interlayer and the mechanical flow interlayer at any time; the composite wall with mechanical flow interlayer has the smallest heat flux density value, but its fluctuation of the heat flux density is the largest, mainly related to the convective heat transfer of the composite wall.
This paper was supported by Inner Mongolia Natural Science Foundation Project (No.: 2018MS05049).
[1] Shea, A., Wall, K., Walker, P. (2013). Evaluation of the thermal performance of an innovative prefabricated natural plant fibre building system. Building Services Engineering Research & Technology, 34(4): 369-380. https://doi.org/10.1177/0143624412450023
[2] Huang, S.P., Hu, M.Y., Huang, Y.H., Cui N.N., Wang W.F. (2018). A new model for optimal mechanical and thermal performance of cement-based partition wall. Materials, 11(4): 615. https://doi.org/10.3390/ma11040615
[3] Li, Y., Yao, J., Li, R., Zhang, Z., Zhang, J. (2017). Thermal and energy performance of a steel-bamboo composite wall structure. Energy and Buildings, 156: 225-237. https://doi.org/10.1016/j.enbuild.2017.09.083
[4] Byrne, A., Byrne, G., Robinson, A. (2017). Compact facility for testing steady and transient thermal performance of building, walls. Energy & Buildings, 152: 602-614. https://doi.org/10.1016/j.enbuild.2017.07.086
[5] Jovana, J., Sun, X.Q., Stevovic, S., Chen, J. (2017). Energy-efficiency gain by combination of PV modules and Trombe wall in the low-energy building design. Energy & Buildings, 152: 568-576. https://doi.org/10.1016/j.enbuild.2017.07.073
[6] Al-Sanea, S.A., Zedan, M.F., Al-Hussain, S.N. (2012). Effect of thermal mass on performance of insulated building walls and the concept of energy savings potential. Applied Energy, 89(1): 430-442. https://doi.org/10.1016/j.apenergy.2011.08.009
[7] Zhang, Y., Cui, H.Z., Tang, W.C., Sang, G.C., Wu, H. (2017). Effect of summer ventilation on the thermal performance and energy efficiency of buildings utilizing phase change materials. Energies, 10(8): 1214. https://doi.org/10.3390/en10081214
[8] Aste, N., Angelotti, A., Buzzetti, M. (2009). The influence of the external walls thermal inertia on the energy performance of well insulated buildings. Energy and Buildings, 41(11): 1181-1187. https://doi.org/10.1016/j.enbuild.2009.06.005
[9] Lee, K.O., Medina, M.A., Sun, X.Q., Jin, X. (2018). Thermal performance of phase change materials (pcm)-enhanced cellulose insulation in passive solar residential building walls. Solar Energy, 163: 113-121. https://doi.org/10.1016/j.solener.2018.01.086
[10] Hu, Z., He, W., Ji, J., Hu, D., Lv, S., Chen, H.B., Shen, Z.H. (2017). Comparative study on the annual performance of three types of building integrated photovoltaic (BIPV) Trombe wall system. Applied Energy, 194: 81-93. https://doi.org/10.1016/j.apenergy.2017.02.018
[11] Poddar, S., Park, D., Chang, S. (2017). Energy performance analysis of a dormitory building based on different orientations and seasonal variations of leaf area index. Energy Efficiency, 10(4): 887-903. https://doi.org/10.1007/s12053-016-9487-y
[12] Zalewski, L., Lassue, S., Rousse, D., Boukhalfa, K. (2010). Experimental and numerical characterization of thermal bridges in prefabricated building walls. Energy Conversion & Management, 51(12): 2869-2877. https://doi.org/10.1016/j.enconman.2010.06.026
[13] Oktavianus, Y., Kristombu Baduge, K.S., Orlowski, K., Mendis, P. (2018). Structural behaviour of prefabricated load bearing braced composite timber wall system. Engineering Structures, 176: 555-568. https://doi.org/10.1016/j.engstruct.2018.09.037
[14] Meng, X.Z., Yu, W., Zheng, C.Y., Wang, D., Cao, X.Y. (2019). Path analysis of energy-saving technology in Yangtze river basin based on multi-objective and multi-parameter optimisation. Journal of Thermal Science, 28(6): 1164-1175. https://doi.org/10.1007/s11630-019-1102-z


The Weck Rubber Ring is designed for use with Weck glass canning and storage jars. Made of natural rubber and manufactured in Germany, the Rubber Ring provides a secure airtight seal when processing foods in a boiling-water bath.
The Weck Rubber Rings are sold individually and are available in Large, Medium and Small. Please indicate your preferred size upon purchase.


text:
using Gfycat.API;
using Gfycat.API.Models;
using Gfycat.Rest;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;

namespace Gfycat
{
    /// <summary>
    /// Represents a client for communicating with the Gfycat API
    /// </summary>
    [DebuggerDisplay("Client {ClientId}")]
    public class GfycatClient : ISearchable
    {
        internal GfycatApiClient ApiClient { get; }

        /// <summary>
        /// Specifies the request for the feed should use the default value defined in the client config or the count used in the creation of this feed
        /// </summary>
        public const int UseDefaultFeedCount = -1;
        const string TwitterProvider = "twitter";
        const string FacebookProvider = "facebook";
        bool _clientAuth = true;

        /// <summary>
        /// Creates a <see cref="GfycatClient"/> using the provided client ID and client secret
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="clientSecret"></param>
        public GfycatClient(string clientId, string clientSecret) : this(new GfycatClientConfig(clientId, clientSecret))
        {
        }

        /// <summary>
        /// Creates a <see cref="GfycatClient"/> using the provided <see cref="GfycatClientConfig"/>
        /// </summary>
        /// <param name="config"></param>
        public GfycatClient(GfycatClientConfig config)
        {
            ApiClient = new GfycatApiClient(this, config);

            Debug.WriteLine($"Client created with ID \"{config.ClientId}\"");
        }

        #region Auth methods

        /// <summary>
        /// This client's ID provided during construction
        /// </summary>
        public string ClientId => ApiClient.Config.ClientId;
        internal string ClientSecret => ApiClient.Config.ClientSecret;

        /// <summary>
        /// The current access token being used for all requests
        /// </summary>
        public string AccessToken { get; private set; }

        /// <summary>
        /// The current refresh token being used for refreshing the access token when it expires
        /// </summary>
        public string RefreshToken { get; private set; }

        /// <summary>
        /// Gets the object representing the current user
        /// </summary>
        public CurrentUser CurrentUser { get; private set; }

        /// <summary>
        /// Attempts to refresh the access token using the current refresh token or with a provided access token. If the current refresh token is null or an refresh token isn't provided, this will perform client credential authentication
        /// </summary>
        /// <returns></returns>
        public async Task<bool> RefreshTokenAsync(string providedRefreshToken = null, RequestOptions options = null)
        {
            options = options ?? RequestOptions.CreateFromDefaults(ApiClient.Config);
            options.UseAccessToken = false;

            async Task<bool> SendRefreshRequest(string token)
            {
                Debug.WriteLine("Refreshing token...");
                try
                {
                    RestResponse response = await ApiClient.SendJsonAsync(
                        "POST",
                        "oauth/token",
                        new RefreshAuthRequest()
                        {
                            ClientId = ClientId,
                            ClientSecret = ClientSecret,
                            GrantType = "refresh",
                            RefreshToken = token
                        },
                        options).ConfigureAwait(false);
                    ClientAccountAuthResponse auth = await response.ReadAsJsonAsync<ClientAccountAuthResponse>(ApiClient.Config).ConfigureAwait(false);

                    AccessToken = auth.AccessToken;
                    RefreshToken = auth.RefreshToken;
                    options.UseAccessToken = true;
                    if (CurrentUser == null)
                        CurrentUser = await GetCurrentUserAsync(options).ConfigureAwait(false);
                    else
                        await CurrentUser.UpdateAsync(options).ConfigureAwait(false);
                }
                catch (GfycatException e) when (e.HttpCode == HttpStatusCode.Unauthorized && e.Code == "InvalidRefreshToken")
                {
                    return false;
                }
                return true;
            }

            if (!string.IsNullOrWhiteSpace(providedRefreshToken))
            {
                return await SendRefreshRequest(providedRefreshToken);
            }
            else if (_clientAuth)
            {
                await AuthenticateAsync(options).ConfigureAwait(false);
                return true;
            }
            else if (RefreshToken != null)
            {
                return await SendRefreshRequest(RefreshToken);
            }
            else
                return false;
        }

        /// <summary>
        /// Authenticates this instance using client credentials
        /// </summary>
        /// <returns>An awaitable task</returns>
        public async Task AuthenticateAsync(RequestOptions options = null)
        {
            Debug.WriteLine("Performing client credentials authentication...");
            options = options ?? RequestOptions.CreateFromDefaults(ApiClient.Config);
            options.UseAccessToken = false;
            RestResponse response = await ApiClient.SendJsonAsync(
                "POST",
                "oauth/token",
                new ClientCredentialsAuthRequest()
                {
                    ClientId = ClientId,
                    ClientSecret = ClientSecret,
                    GrantType = "client_credentials"
                },
                options).ConfigureAwait(false);
            ClientCredentialsAuthResponse auth = await response.ReadAsJsonAsync<ClientCredentialsAuthResponse>(ApiClient.Config).ConfigureAwait(false);

            AccessToken = auth.AccessToken;
            CurrentUser = null;
            _clientAuth = true;
        }

        /// <summary>
        /// Allows the owner of this client to log in with their username and password
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <param name="options">The options for this request</param>
        /// <returns>An awaitable task</returns>
        public async Task AuthenticateAsync(string username, string password, RequestOptions options = null)
        {
            Debug.WriteLine($"Performing client account authentication...");
            options = options ?? RequestOptions.CreateFromDefaults(ApiClient.Config);
            options.UseAccessToken = false;
            RestResponse response = await ApiClient.SendJsonAsync(
                "POST",
                "oauth/token",
                new ClientAccountAuthRequest()
                {
                    ClientId = ClientId,
                    ClientSecret = ClientSecret,
                    GrantType = "password",
                    Username = username,
                    Password = password
                },
                options).ConfigureAwait(false);
            ClientAccountAuthResponse auth = await response.ReadAsJsonAsync<ClientAccountAuthResponse>(ApiClient.Config).ConfigureAwait(false);

            AccessToken = auth.AccessToken;
            RefreshToken = auth.RefreshToken;
            options.UseAccessToken = true;
            CurrentUser = await GetCurrentUserAsync(options).ConfigureAwait(false);
            _clientAuth = false;
        }

        /// <summary>
        /// Retrieves a Twitter request token for the Twitter Request token auth flow
        /// </summary>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<string> GetTwitterRequestTokenAsync(RequestOptions options = null)
        {
            options = options ?? RequestOptions.CreateFromDefaults(ApiClient.Config);
            options.UseAccessToken = false;
            RestResponse response = await ApiClient.SendJsonAsync(
                "POST",
                "oauth/token",
                new
                {
                    grant_type = "request_token",
                    provider = "twitter"
                },
                options).ConfigureAwait(false);
            TwitterRequestTokenResponse auth = await response.ReadAsJsonAsync<TwitterRequestTokenResponse>(ApiClient.Config).ConfigureAwait(false);
            return auth.RequestToken;
        }

        /// <summary>
        /// Allows authentication with either a facebook access token or facebook auth code
        /// </summary>
        /// <param name="type"></param>
        /// <param name="token"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task AuthenticateAsync(TokenType type, string token, RequestOptions options = null)
        {
            options = options ?? RequestOptions.CreateFromDefaults(ApiClient.Config);
            options.UseAccessToken = false;
            switch (type)
            {
                case TokenType.FacebookAccessToken:
                    {
                        RestResponse response = await ApiClient.SendJsonAsync(
                            "POST",
                            "oauth/token",
                            new FacebookAuthCodeRequest()
                            {
                                ClientSecret = ClientSecret,
                                ClientId = ClientId,
                                GrantType = "convert_code",
                                Provider = "facebook",
                                AuthCode = token
                            },
                            options).ConfigureAwait(false);
                        ClientAccountAuthResponse auth = await response.ReadAsJsonAsync<ClientAccountAuthResponse>(ApiClient.Config).ConfigureAwait(false);

                        AccessToken = auth.AccessToken;
                        RefreshToken = auth.RefreshToken;
                        options.UseAccessToken = true;
                        CurrentUser = await GetCurrentUserAsync(options).ConfigureAwait(false);
                    }
                    break;
                case TokenType.FacebookAuthCode:
                    {
                        RestResponse response = await ApiClient.SendJsonAsync(
                            "POST",
                            "oauth/token",
                            new FacebookAuthCodeRequest()
                            {
                                ClientSecret = ClientSecret,
                                ClientId = ClientId,
                                GrantType = "convert_token",
                                Provider = "facebook",
                                Token = token
                            },
                            options).ConfigureAwait(false);
                        ClientAccountAuthResponse auth = await response.ReadAsJsonAsync<ClientAccountAuthResponse>(ApiClient.Config).ConfigureAwait(false);

                        AccessToken = auth.AccessToken;
                        RefreshToken = auth.RefreshToken;
                        options.UseAccessToken = true;
                        CurrentUser = await GetCurrentUserAsync(options).ConfigureAwait(false);
                    }
                    break;
                default:
                    throw new ArgumentOutOfRangeException("The provided token type does not accept one token parameter");
            }
            _clientAuth = false;
        }

        /// <summary>
        /// Authenticates using a browser auth code and redirect uri, twitter token and secret, or twitter token and verifier
        /// </summary>
        /// <param name="type">The type of the provided tokens</param>
        /// <param name="tokenOrCode">A twitter token or browser auth code</param>
        /// <param name="verifierSecretRedirectUri">A twitter secret, verifier, or browser redirect uri</param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task AuthenticateAsync(TokenType type, string tokenOrCode, string verifierSecretRedirectUri, RequestOptions options = null)
        {
            options = options ?? RequestOptions.CreateFromDefaults(ApiClient.Config);
            options.UseAccessToken = false;
            switch (type)
            {
                case TokenType.AuthorizationCode:
                    {
                        RestResponse response = await ApiClient.SendJsonAsync(
                            "POST",
                            "oauth/token",
                            new BrowserAuthorizationCodeRequest()
                            {
                                ClientSecret = ClientSecret,
                                ClientId = ClientId,
                                GrantType = "authorization_code",
                                Code = tokenOrCode,
                                RedirectUri = verifierSecretRedirectUri
                            },
                            options).ConfigureAwait(false);
                        ClientAccountAuthResponse auth = await response.ReadAsJsonAsync<ClientAccountAuthResponse>(ApiClient.Config).ConfigureAwait(false);

                        AccessToken = auth.AccessToken;
                        RefreshToken = auth.RefreshToken;
                        options.UseAccessToken = true;
                        CurrentUser = await GetCurrentUserAsync(options).ConfigureAwait(false);
                    }
                    break;
                case TokenType.TwitterTokenSecret:
                    {
                        RestResponse response = await ApiClient.SendJsonAsync(
                            "POST",
                            "oauth/token",
                            new TwitterAuthCodeRequest()
                            {
                                ClientSecret = ClientSecret,
                                ClientId = ClientId,
                                GrantType = "convert_request_token",
                                Provider = "twitter",
                                Token = tokenOrCode,
                                Verifier = verifierSecretRedirectUri
                            },
                            options).ConfigureAwait(false);
                        ClientAccountAuthResponse auth = await response.ReadAsJsonAsync<ClientAccountAuthResponse>(ApiClient.Config).ConfigureAwait(false);

                        AccessToken = auth.AccessToken;
                        RefreshToken = auth.RefreshToken;
                        options.UseAccessToken = true;
                        CurrentUser = await GetCurrentUserAsync(options).ConfigureAwait(false);
                    }
                    break;
                case TokenType.TwitterTokenVerifier:
                    {
                        RestResponse response = await ApiClient.SendJsonAsync(
                            "POST",
                            "oauth/token",
                            new TwitterAuthCodeRequest()
                            {
                                ClientSecret = ClientSecret,
                                ClientId = ClientId,
                                GrantType = "convert_token",
                                Provider = "twitter",
                                Token = tokenOrCode,
                                Secret = verifierSecretRedirectUri
                            },
                            options).ConfigureAwait(false);
                        ClientAccountAuthResponse auth = await response.ReadAsJsonAsync<ClientAccountAuthResponse>(ApiClient.Config).ConfigureAwait(false);

                        AccessToken = auth.AccessToken;
                        RefreshToken = auth.RefreshToken;
                        options.UseAccessToken = true;
                        CurrentUser = await GetCurrentUserAsync(options).ConfigureAwait(false);
                    }
                    break;
                default:
                    throw new ArgumentOutOfRangeException("The provided token type does not accept two token parameters");
            }
            _clientAuth = false;
        }

        /// <summary>
        /// Authenticates using an given access token
        /// </summary>
        /// <param name="accessToken"></param>
        /// <param name="options">Sets the options for this request</param>
        /// <returns></returns>
        /// <exception cref="GfycatException">If verifyToken is true, this will attempt to get the current user which will return 401 unauthorized if the access token is invalid</exception>
        public async Task AuthenticateAsync(string accessToken, RequestOptions options = null)
        {
            AccessToken = accessToken;

            CurrentUser = await GetCurrentUserAsync(options).ConfigureAwait(false);
        }

        #endregion

        #region Users

        /// <summary>
        /// Returns a bool for whether or not a user account exists on that username
        /// </summary>
        /// <param name="username"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<bool> GetUserExistsAsync(string username, RequestOptions options = null)
        {
            return (await ApiClient.GetUsernameStatusAsync(username, options).ConfigureAwait(false)).IsSuccessfulStatus();
        }

        /// <summary>
        /// Sends a password reset email for the user with the specified username or email address
        /// </summary>
        /// <param name="usernameOrEmail"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task SendPasswordResetEmailAsync(string usernameOrEmail, RequestOptions options = null)
        {
            await ApiClient.SendPasswordResetEmailAsync(usernameOrEmail, options).ConfigureAwait(false);
        }

        /// <summary>
        /// Tries to get the user with the given Id. If the user isn't found, this throws a <see cref="GfycatException"/>
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        /// <exception cref="GfycatException"></exception>
        public async Task<User> GetUserAsync(string userId, RequestOptions options = null)
        {
            API.Models.User userModel = await ApiClient.GetUserAsync(userId, options).ConfigureAwait(false);
            return User.Create(this, userModel);
        }

        /// <summary>
        /// Tries to get the user with the given ID. If the user isn't found, this returns null
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<User> TryGetUserAsync(string userId, RequestOptions options = null)
            => (await GetUserExistsAsync(userId, options).ConfigureAwait(false)) ? await GetUserAsync(userId, options).ConfigureAwait(false) : null;

        /// <summary>
        /// Attempts to get the current user
        /// </summary>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<CurrentUser> GetCurrentUserAsync(RequestOptions options = null)
        {
            API.Models.CurrentUser currentUserModel = await ApiClient.GetCurrentUserAsync(options).ConfigureAwait(false);
            return CurrentUser.Create(this, currentUserModel);
        }

        /// <summary>
        /// Creates a new user account using the specified username, password, and email
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <param name="email"></param>
        /// <param name="loginWhenComplete"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task CreateAccountAsync(string username, string password, string email = null, bool loginWhenComplete = true, RequestOptions options = null)
        {
            ClientAccountAuthResponse response = await ApiClient.CreateAccountAsync(new AccountCreationRequest()
            {
                Username = username,
                Password = password,
                Email = email
            }, options).ConfigureAwait(false);

            if (loginWhenComplete)
            {
                AccessToken = response.AccessToken;
                RefreshToken = response.RefreshToken;
            }
        }

        /// <summary>
        /// Creates a new account using the specified username, provider token, password, and email
        /// </summary>
        /// <param name="username"></param>
        /// <param name="tokenType"></param>
        /// <param name="token"></param>
        /// <param name="password"></param>
        /// <param name="email"></param>
        /// <param name="loginWhenComplete"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task CreateAccountAsync(string username, AccountTokenType tokenType, string token, string password = null, string email = null, bool loginWhenComplete = true, RequestOptions options = null)
        {
            AccountCreationRequest request = new AccountCreationRequest()
            {
                Username = username,
                Password = password,
                Email = email,
            };

            switch(tokenType)
            {
                case AccountTokenType.FacebookAuthCode:
                    request.Provider = FacebookProvider;
                    request.AuthCode = token;
                    break;
                case AccountTokenType.FacebookAccessToken:
                    request.Provider = FacebookProvider;
                    request.AccessToken = token;
                    break;
                case AccountTokenType.TwitterToken:
                    request.Provider = TwitterProvider;
                    request.Token = token;
                    break;
                case AccountTokenType.TwitterVerifier:
                    request.Provider = TwitterProvider;
                    request.Verifier = token;
                    break;
                case AccountTokenType.TwitterOauthToken:
                    request.Provider = TwitterProvider;
                    request.OauthToken = token;
                    break;
                case AccountTokenType.TwitterOauthTokenSecret:
                    request.Provider = TwitterProvider;
                    request.OauthTokenSecret = token;
                    break;
            }

            ClientAccountAuthResponse response = await ApiClient.CreateAccountAsync(request, options).ConfigureAwait(false);

            if (loginWhenComplete)
            {
                AccessToken = response.AccessToken;
                RefreshToken = response.RefreshToken;
            }
        }

        #endregion

        /// <summary>
        /// Gets info for a single Gfy
        /// </summary>
        /// <param name="gfycat"></param>
        /// <param name="overrideInvalidNameDetection">Forces the method to fetch the specified gfy even if it's detected as an invalid gfy name</param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<Gfy> GetGfyAsync(string gfycat, bool overrideInvalidNameDetection = false, RequestOptions options = null)
        {
            if (!overrideInvalidNameDetection && !IsValidGfyName(gfycat))
                return null;

            if (_clientAuth) // can I just say how much implicit auth is a pain the ass?
            {
                GfyResponse response = await ApiClient.GetGfyAsync(gfycat, options).ConfigureAwait(false);
                if (response == null)
                    return null;

                return Gfy.Create(this, response.GfyItem);
            }
            else
            {
                FullGfyResponse response = await ApiClient.GetFullGfyAsync(gfycat, options).ConfigureAwait(false);
                if (response == null)
                    return null;

                return Gfy.Create(this, response.Gfy);
            }
        }
        /// <summary>
        /// Returns whether the provided url string is a valid Gfycat url pointing to a valid gfy name
        /// </summary>
        /// <param name="gfycatUrl"></param>
        /// <param name="gfyName"></param>
        /// <returns></returns>
        public static bool IsValidGfyUrl(string gfycatUrl, out string gfyName)
        {
            if (gfycatUrl == null || !Uri.TryCreate(gfycatUrl, UriKind.Absolute, out Uri result) || !result.Scheme.Contains("http") || !result.Host.EndsWith("gfycat.com") || result.LocalPath == "/")
            {
                gfyName = null;
                return false;
            }
            else
            {
                string lastSegment = result.Segments.LastOrDefault();
                int fileExtensionPos = lastSegment.LastIndexOf('.');
                if (fileExtensionPos != -1)
                    lastSegment = lastSegment.Remove(fileExtensionPos);
                int infoPos = lastSegment.LastIndexOf('-'); // get the position of the file info portion, for instance in the name YellowIdenticalEuropeanpolecat-poster.jpg
                if (infoPos != -1)
                    lastSegment = lastSegment.Remove(infoPos);

                gfyName = IsValidGfyName(lastSegment) ? lastSegment : null;
                return gfyName != null;
            }
        }
        /// <summary>
        /// Checks whether the provided gfy name is valid
        /// </summary>
        /// <param name="gfyName"></param>
        /// <returns></returns>
        public static bool IsValidGfyName(string gfyName)
        {
            if (gfyName.Equals("BrutalSavageRekt", StringComparison.OrdinalIgnoreCase))
                return true;

            if (gfyName.Length > Utils.GfyFinalSegmentMaxLength)
                return false;

            gfyName = gfyName.ToLowerInvariant();
            //adjectives
            string match1 = "";
            string match2 = "";
            string match3 = "";

            while (Utils.HasPartial(gfyName, Utils.GfyAdjectives, ref match1))
                while (Utils.HasPartial(gfyName.Substring(match1.Length), Utils.GfyAdjectives, ref match2))
                    while (Utils.HasPartial(gfyName.Substring(match1.Length + match2.Length), Utils.GfyAnimals, ref match3))
                        if (match1.Length + match2.Length + match3.Length == gfyName.Length)
                            return true;

            return false;

            /* there's always a way to do it without goto, I will now keep this code here as a warning to not use goto
            begin:
            if (Utils.HasPartial(lastSegment, Utils.GfyAdjectives, ref match1))
            {
                second:
                if (Utils.HasPartial(lastSegment.Substring(match1.Length), Utils.GfyAdjectives, ref match2))
                {
                    if (Utils.HasPartial(lastSegment.Substring(match1.Length + match2.Length), Utils.GfyAnimals, ref match3))
                        return await GetGfyAsync(lastSegment, options);
                    else
                        goto second;
                }
                else
                    goto begin;
            }

            return null;
            */
        }

        /// <summary>
        /// Attempts to get info for a single Gfy using a url string. If the URI isn't in a valid format or the gfy does not exist, this returns null
        /// </summary>
        /// <param name="gfycatUrl">The gfycat url</param>
        /// <param name="overrideInvalidNameDetection">Forces the method to fetch the specified gfy even if it's detected as an invalid gfy name</param>
        /// <param name="options">Optional request parameters</param>
        /// <returns>An awaitable task that returns a Gfy</returns>
        public async Task<Gfy> GetGfyFromUrlAsync(string gfycatUrl, bool overrideInvalidNameDetection = false, RequestOptions options = null)
        {
            return IsValidGfyUrl(gfycatUrl, out string gfy) ? await GetGfyAsync(gfy, overrideInvalidNameDetection, options).ConfigureAwait(false) : null;
        }

        #region Creating Gfycats

        /// <summary>
        /// Creates a Gfy using a remote url and returns the Gfy status
        /// </summary>
        /// <param name="remoteUrl"></param>
        /// <param name="parameters"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<GfyStatus> CreateGfyAsync(string remoteUrl, GfyCreationParameters parameters = null, RequestOptions options = null)
        {
            UploadKey key = await ApiClient.CreateGfyFromFetchUrlAsync(remoteUrl, parameters ?? new GfyCreationParameters(), options).ConfigureAwait(false);
            await Task.Delay(500).ConfigureAwait(false);
            return await GetGfyUploadStatusAsync(key.Gfycat, options).ConfigureAwait(false);
        }

        /// <summary>
        /// Retrieves the upload status of the specified gfy
        /// </summary>
        /// <param name="gfycat"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<GfyStatus> GetGfyUploadStatusAsync(string gfycat, RequestOptions options = null)
        {
            Status status = await ApiClient.GetGfyStatusAsync(gfycat, options).ConfigureAwait(false);

            if (status.Task == UploadTask.Error)
                throw new GfycatException(status.ErrorDescription);

            return new GfyStatus(this, status);
        }

        /// <summary>
        /// Creates a Gfycat using the specified stream and upload parameters
        /// </summary>
        /// <param name="data"></param>
        /// <param name="parameters"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<GfyStatus> CreateGfyAsync(Stream data, GfyCreationParameters parameters = null, RequestOptions options = null)
        {
            UploadKey uploadKey = await ApiClient.GetUploadKeyAsync(parameters.CreateModel(), options).ConfigureAwait(false);
            await ApiClient.PostGfyStreamAsync(uploadKey, data, options).ConfigureAwait(false);
            await Task.Delay(500).ConfigureAwait(false);

            return await GetGfyUploadStatusAsync(uploadKey.Gfycat, options).ConfigureAwait(false);
        }

        #endregion

        #region Trending feeds

        /// <summary>
        /// Retrieves trending gfys for the specified tag. If no tag is specified, the "Trending" tag is used
        /// </summary>
        /// <param name="count"></param>
        /// <param name="tag"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<TaggedGfyFeed> GetTrendingGfysAsync(string tag = "Trending", int count = UseDefaultFeedCount, RequestOptions options = null)
        {
            Utils.UseDefaultIfSpecified(ref count, ApiClient.Config.DefaultFeedItemCount);
            return TaggedGfyFeed.Create(this, count, (await ApiClient.GetTrendingFeedAsync(tag, count, null, options).ConfigureAwait(false)), options);
        }

        /// <summary>
        /// Returns an enumerable of all trending tags
        /// </summary>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<IEnumerable<string>> GetTrendingTagsAsync(RequestOptions options = null)
        {
            return await ApiClient.GetTrendingTagsAsync(null, options).ConfigureAwait(false);
        }

        /// <summary>
        /// Retrieves trending tags populated with gfys
        /// </summary>
        /// <param name="tagCount"></param>
        /// <param name="gfyCount"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<PopulatedTagFeed> GetTrendingTagsPopulatedAsync(int tagCount = UseDefaultFeedCount, int gfyCount = UseDefaultFeedCount, RequestOptions options = null)
        {
            Utils.UseDefaultIfSpecified(ref tagCount, ApiClient.Config.DefaultFeedItemCount);
            Utils.UseDefaultIfSpecified(ref gfyCount, ApiClient.Config.DefaultFeedItemCount);
            return PopulatedTagFeed.Create(this, gfyCount, tagCount, options, await ApiClient.GetTrendingTagsPopulatedAsync(null, tagCount, gfyCount, options).ConfigureAwait(false));
        }

        #endregion

        /// <summary>
        /// Retrieves a feed of all reaction tag feeds in the specified language. The default language is english
        /// </summary>
        /// <param name="count"></param>
        /// <param name="language"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<ReactionTagsFeed> GetReactionGfysAsync(ReactionLanguage language = ReactionLanguage.English, int count = UseDefaultFeedCount, RequestOptions options = null)
        {
            Utils.UseDefaultIfSpecified(ref count, ApiClient.Config.DefaultFeedItemCount);
            return ReactionTagsFeed.Create(this, count, options, await ApiClient.GetReactionGifsPopulatedAsync(language, count, null, options).ConfigureAwait(false), language);
        }

        /// <summary>
        /// Searches the Gfycat website using the provided search text
        /// </summary>
        /// <param name="searchText"></param>
        /// <param name="count"></param>
        /// <param name="options">The options for this request</param>
        /// <returns></returns>
        public async Task<SearchFeed> SearchAsync(string searchText, int count = UseDefaultFeedCount, RequestOptions options = null)
        {
            Utils.UseDefaultIfSpecified(ref count, ApiClient.Config.DefaultFeedItemCount);
            return SiteSearchFeed.Create(this, await ApiClient.SearchSiteAsync(searchText, count, null, options).ConfigureAwait(false), count, searchText, options);
        }

        #region Extras

        private static readonly IReadOnlyDictionary<TokenType, string> _tokensToString = new Dictionary<TokenType, string>()
        {
            { TokenType.FacebookAuthCode, "auth_code" },
            { TokenType.FacebookAccessToken, "access_token" },
            { TokenType.TwitterTokenSecret, "secret" },
            { TokenType.TwitterTokenVerifier, "verifier" }
        };

        /// <summary>
        /// Formats a request token into a Twitter oauth url
        /// </summary>
        /// <param name="requestToken"></param>
        /// <returns></returns>
        public static string GetTwitterRequestTokenUrl(string requestToken) => $"https://api.twitter.com/oauth/authenticate?oauth_token={requestToken}";

        /// <summary>
        /// Creates an authorization URL given a state and a redirect URI
        /// </summary>
        /// <param name="state"></param>
        /// <param name="redirectUri"></param>
        /// <param name="codeResponse">True to return a code response (for authorization response), false to return a token response (implicit authorization)</param>
        /// <returns></returns>
        public string GetBrowserAuthUrl(string state, string redirectUri, bool codeResponse) => $"https://gfycat.com/oauth/authorize?client_id={ClientId}&scope=all&state={state}&response_type={(codeResponse ? "code" : "token")}&redirect_uri={redirectUri}";

        #endregion
    }
}


Webbysite was started by Kieran Headley with a vision to make SEO a transparent solution that fitted all requirements, we will not bamboozle you with numbers or fancy graphs. We will deliver high quality work with actual results that you can see. Our SEO packages are truly bespoke, we charge you for hours and let you choose how we spend the time. We can work with you to help aid you in that decision if you need the help.
Our founder Kieran has over 6 years experience in one of the largest SEO agencies in the UK and also on of the fastest growing SEO agencies. He has experience in working on a multitude of clients from SME's right through to large multinational companies in a wide variety of niches. He is supported by a team of high quality writers, journalists and outreach specialists that are driven to not only make your content come alive but also to get it shared across the web.
Webbysite not only has a great SEO team but also a team of highly skilled developers that have worked on some of the biggest and most advanced systems in the UK.
Get in contact today to speak to the team to start getting your company both online and seen by your audience.


White River's Rosette Collection offers 40 handcarved profiles in Maple, Cherry and Lindenwood ( limited profiles ). This Collection features complimentary sizes and motifs from acanthus, floral, fluer di les and pyramid buttons. Popular motifs and sizes offer architectural detail for the entire project from millwork details to kitchen cabinetry, islands, rangehoods, mantels and transforming specialty cabinetry into furniture. Availability of in-stock profiles by species are noted by pricing per item. These profiles ship unfinished and can stain or paint.