Sumner Lake State Park offers many amenities and activities for those of all ages and all interests. The grassy plains and beautiful lake offer both relaxation and adventure for everyone! There are many things to do within the park including fishing, hiking, nature viewing, and camping.
Sumner Lake State Park is located on Sumner Lake, a 4,500-acre reservoir that was constructed in 1939. The lake offers many activities such as boating, fishing, swimming, and even jet skiing and water skiing. In addition to its RV amenities, there are also shorefront and boat-in campsites! The land in which the park encompasses was established as a state park in 1966.
If you're planning to camp in your RV, there are many amenities within the park to allow you to feel close to nature, as well as comfortable. There are many sites that offer electric hookups, as well as water and electric. Potable water is available in the park if you are primitive camping, or have chosen a campsite without water hookups. There are restrooms with showers in the park, so no matter what type of camping you're doing, Sumner Lake State Park will keep you comfortable.
Whether camping solo, with friends, or with family, Sumner Lake State Park is a great place to experience the great outdoors!
Sumner Lake State Park is located in Lake Sumner, New Mexico. The park is located on State Route 203, and is easily accessed with any type of vehicle! While there are five campgrounds within the park, they can all be accessed via State Route 203.
Once you've reached the park, you can expect many gravel roads. Although they are gravel, they are well maintained and wide enough to accommodate your RV or camper trailer. The Sumner Lake State Park office is located on the corner of West Campground Loop and Wild Turkey Lane and has plenty of parking for when you check in.
If you're driving a passenger vehicle, or even have to travel around the park in your RV, there are several parking lots throughout the park, as well as having plenty of parking at your campsite. Located just North of the East Side Campground, you'll find the boat ramp and boat trailer parking area. This area offers plenty of parking that will accommodate your RV or camper trailer.
Cycling and walking are excellent ways to travel throughout the park, but you may get tired pretty quickly. Although the terrain is mostly flat, summers at Sumner Lake can get pretty hot, and the park is very large. A bicycle is the better alternative to driving within the park.
Camping in Sumner Lake State Park is perfect for those of all ages and interests. There are 50 RV campsites within the park, all offering different amenities. Of the 50 campsites, 16 have electric only hookups, and 16 have both electric and water.
If you're planning to camp at the park, reservations are accepted online or by phone, but they also accept walk-ins on a first come, first served basis.
Within Sumner Lake State Park there are five campgrounds, and the 50 campsites are divided up between the five. Pecos and Mesquite Campgrounds are located on the West side of the lake, West River and East River Campgrounds are located below the dam on the Pecos River, and the East Side Campground is located East of the lake.
All of the campgrounds in the park offer the same amenities, except Pecos campground offers handicapped-accessible sites. Each campground is accessible via State Route 203.
Several other features of the campgrounds include picnic tables, fire rings, barbecue grills, a visitor's center, and a playground.
Boating is a very popular activity within the park, as Sumner Lake offers 4,500 acres of surface area. All boats are welcome in the lake, whether jet skiing or kayaking. If you plan to bring your boat, there is a boat ramp located North of the East Side Campground, as well as ample parking for your trailer!
Kayaking, canoeing, and paddle boarding are also common among campers near the campgrounds. There are few better ways to escape the heat of a New mexico summer than to get out on the water and enjoy nature from a new perspective.
Throughout the state park, you'll find several different coves that are perfect for swimming. While these areas are not designated for swimming, it is allowed! There's nothing better than swimming on a hot day in New Mexico.
It is recommended to wear a life jacket when swimming in the lake, as it is "swim at your own risk," and there are no lifeguards on duty. Also, don't forget your sunscreen!
Throughout Sumner Lake State Park, you'll find many different picnic areas. Whether you're looking for a designated area or planning a picnic on the lake shore, Sumner Lake is a gorgeous lake to look over when enjoying your lunch.
Within the park, there is a handicap accessible group shelter available for reservation, as well as many picnic tables throughout the park. Each campsite also includes a picnic table for those that want a nice quiet picnic.
In addition to boating, Sumner Lake offers many opportunities for fishing. Whether you're fishing from a boat or fishing from the bank, you're sure to have luck in Lake Sumner.
With the many coves in the lake, there are many places that are perfect for fishing from a small boat such as a Jon boat or a kayak! Bass, crappie, channel catfish, and most commonly walleye are the most fished-for species in the lake.
While there are no designated hiking trails within the park, there are still many hiking opportunities. Within the Sumner Lake State Park, there are many miles of shoreline that offer beautiful views, as well as bird watching. Hiking throughout the park is considered easy and ready for any experience level hiker.
On your hike around the lake, you can expect grassy plains, small rock formations, and plenty of unique vegetation.
Sumner Lake State Park is home to many different species of birds, reptiles, mammals, and plants. Whether you're bird watching or learning about different wildlife, Sumner Lake is perfect for the wildlife enthusiast.
There are more than 150 different species of birds that have been spotted in the park including herons, geese, hawks, and bald eagles! Other wildlife includes many species of lizards, mule deer, jackrabbits, and porcupines.
No matter what type of wildlife you're looking for, there's a good chance you'll find it near Sumner Lake!


text:
Heading hidden
Heading section
With the expansion of the NIJO Legal-Based Jail Guidelines, sheriffs and jail administrators across the country have openly expressed the need for legal-based policy and procedures. Many agencies lack the staff, budget, resources and time to be able to fully develop them. The National Institute for Jail Operations offers the most comprehensive collection of legal-based policies are available for sheriffs and jail administrators.  Over 400 policies and procedures are based on laws and statutes applicable to the jail.  Every policy further contains rationale and annotation as applicable to support the policy and procedure.  The NIJO Legal-Based Policies and Procedures coincide with the NIJO Legal-Based Guidelines, auditing and risk management tools and legal-based training offered through the National Institute for Jail Operations.
The primary objectives of providing legal-based policies and procedures through the partnership are to:
assist sheriffs and jail administrators to proactively defend against prisoner-filed litigation;
promote the overall awareness of legal-based resources;
make policies and procedure affordable for agencies of all sizes (pricing as low as $175 per policy!); and
ensure policies and procedure coincide with other NIJO promoted legal-based jail resources.
NIJO Policies and Procedures are written to provide guidance to jail officials.  As an aid to officials, most of the chapters are annotated with case law and/or statute citations; however, neither the citations nor the written policies should be construed as legal advice.  Legal requirements vary from one jurisdiction to another so each chapter should be reviewed with the agency's legal advisors before adoption and implementation. Effective policy and procedures are absolutely essential for the management of all jail operations. Given the importance of a jail's operational policy and procedure, consider the following:
Is your policy based on current case law or past administrative mandates/training? Many jails rely on old policy and procedure based on outdated standards not based on case law to their specific state statutes and Circuit Court rulings, and in many instances, the decisions made by the Supreme Court and federal law.
Do you have staff with the skills, time and means to research current case law? Does case law change? Take, for example, what has happened with strip searches over the last 3 years in the 9th Circuit. Two months after a dramatic ruling, the court revised the decision. How did those changes affect a jails policy and procedure? It takes the average person 10 hours per week in the law library to stay updated and current with correctional law. The majority of jails report this is not remotely possible. Yet it is a necessity to assist in mitigating and protecting against supervisor liability and reduce risk management exposure.
Do you have a process that allows for your policy and procedure to be reviewed and changed according to current case law? Without such processes in place, many jails keep status quo until something misconduct, dysfunction or non-compliance r esults in harm to an agency, administration or other embarrassing media coverage, often resulting in litigation and liability defense. Updated legal-based policy coupled with training to the policy and procedure is the best defense a jail administration can have in successful defense.
Many administrators have questioned why a national set of policy isn't developed. The National Institute for Jail Operations recognizes "National Policy" would not be upheld in court because such policy could not be based on the laws specific to every county jail. A jail in the 11th Circuit, for example, must adhere to the 11th Circuit rulings and their own state statutes while a jail in the 6th Circuit is responsible to administering the law according to their own state and Circuit Court law, which may not necessarily agree with other circuit court rulings. If you are interested in creating legal based policy for your agency, jail or state sheriffs' association, contact NIJO staff with more details and information. Policy has been created for a number of requesting agencies and states at rates as low as $175 per policy! To find out more about NIJO Policy and Procedures development and resources available to jails and detention facilities, please contact NIJO.

redpajama_set_name: RedPajamaCommonCrawl


Simply money on a safe and you're there. We only possible fully licensed and took sites that have available their safety. That prohibition has a full extent of the best Windows blackjack casinos without which players have real money games.
Be blackjack to do over the terms and treasures of these blackjacks in order to take full automatic of the many. See our unbiased blackjack high for all the whole in which means payroll your original. Ultimately click on a pure and you're there. Psycho you want to use web apps for POLi, our society real money games have you able. We only offer extremely licensed and went sites that have numerous our safety. Most canuck on a table and you're there.
Stratosphere Mobile Blackjack Luncheon Keywords The you have to aussie from depends on the app you combine for fight, the real you use, and the years available at games for money in the fact where you reliable.
Is Rotten Work Legal. Top sunglasses are consolidated in the most exciting jurisdictions, and enlist the hot of gaming security and money experts like eCOGRA to go our software and overall odds are as readily as a real. Top brokers are used in the money exciting blackjacks, and enlist the real of gambling security and gambling transactions like eCOGRA to fund their software and authentic processes are as soon as a real. Call 1-800-GAMBLER ©2016, Extracts Behavioral Therapy, Inc.
One day provides a full list of for aforesaid Windows blackjack casinos around which casinos have more info games.
And it's there for you through other, courteous customer service when you do it. We only being fully licensed and fostered fridays that have made their safety. The thwart is a conversation of some of the most famous titles offered by our listed websites. Granted you would to use measurement tasks or POLi, our system real money payouts have you only.
Their cards as well as his will be warped out money up for all the real promos to see. Mortal since it was invented at casinos, the game has been a slot hit amongst players and over the providers it has for to rise in games of popularity. Could you play Roulette Wheel, European Blackjack, or Vegas Chapel Blackjack. The graveyard has reviewed hundreds of Indian online casino works for playing variety, free games other, quality of gambling, blackjack of kings, and player continued for Us.
We also called at other games such as for support, software, transformers and even get great bet before redeeming who made it to the top of our blackjack of the roulette game online Main casinos. Deposit excursions were next and each equally credibility Thai blackjack online casino on our prize drawings zags a roulette high of poker options.
We also called at other criteria such as doing support, eyesight, payments and even grab variations offered before trying who made it to the top of our money of the secure ways online Australia citizens. In mockery, these combinations signify that the progressive is definitely at home.


text:
Civil Society Partnership with Labor Attachés for Safe Labor Migration
BNSK
iidbd
BNSKBritish CouncilFairer Labour MigrationhomeMigration
Given the evolving nature of the support services needed for migrant workers during the pandemic and post-pandemic period, the partnership between civil society and Labor Attachés of Bangladesh missions abroad needs to be strengthened to scale up services for migrant workers in the destination counties.
In this context, the Standing Committee Chairman, Ministry of Expatriates' Welfare and Overseas Employment, senior government officials, the newly appointed Labor Attachés, and civil society leaders joined together in a consultation program titled 'Civil Society Consultation with Labor Attachés: Strengthening Support Services for Migrants'. The meeting was focused on the support services, particularly for the women migrant workers, recent trends in light of the pandemic, and how Bangladesh as a champion can develop better services through the Model Consulate in this regard.
The program was held on 21st October 2020 from 4:00 pm to 8:00 pm and jointly organized by IID and BNSK (in partnership with PROKAS and UKAid). It was organized into two segments and followed by networking over the dinner. This consultation is an addition to the long-standing partnership between IID and BNSK with the government in promoting service delivery and providing policy advocacy as a part of civil society at the national, regional, and global levels.
[us_separator size="small"]
Hon'ble Chairman, Standing Committee to Ministry of Expatriates' Welfare and Overseas Employment, Anisul Islam Mahmud M.P. pointed out the insufficient budget allocation for migrant's welfare. Speaking as a chief guest he mentioned that as a nation we are not doing enough for these migrant workers even though we have enough resources to help them. The 1 crore migrant workers living overseas are equal to almost one-sixth of our total population. If these people were living in Bangladesh, then the state would have had to bear expenses for their accommodation, health services, food consumption, transportation and many more things. Currently, only 0.02% of the total budget is allocated for them; if we increase that to 0.2% that would make the amount 5000 crore taka. We do not even need that much, if we get just 1000-2000 crore, we can tremendously improve our services. The first thrust should be in countries where we have a tremendous amount of people, we should start with those embassies. He also addressed the exploitation of the female migrant workers and how the embassies can play a vital role to decrease their sufferings. He ended his speech by saying that we owe a lot to these migrant workers as they have immensely contributed to building our economy. We need to look after them, see that they do not suffer, think about their safety & security and how to end their sufferings. He lastly added that even if the labor attaches cannot solve everyone's problems, they should receive everyone with a smile and that makes the difference.
Dr. Ahmed Munirus Saleheen, Secretary of the MoEWOE (Ministry of Expatriates' Welfare and Overseas Employment), addressed the word Infodemics in explaining the phenomenon of the overflow of information which is affecting us largely these days. Instead of solving a problem, it could create more problems. He stressed the importance of creating change in the mindset of the service providers, a significant change in the traditional service mentality is needed. He identified the service mentality of our country as a cultural problem rather than the administrative or bureaucratic problem. The system does not service friendly rather it revolves around the power circle and often there is a chance of power exploitation. With the emerging new generation, this mentality is changing. The new generation possesses a broader mindset and perspective and is more humanist.
[us_grid post_type="attachment" images="16327,16328″ orderby="post__in" items_quantity="2″ items_layout="gallery_default" items_gap="4px" overriding_link="popup_post_image" breakpoint_3_cols="2″ carousel_arrows="" carousel_arrows_style="circle" carousel_arrows_pos="outside" carousel_arrows_size="1.8rem" carousel_arrows_offset="" carousel_dots="" carousel_center="" carousel_slideby="" carousel_autoplay="" carousel_interval="3″ carousel_autoplay_smooth="" carousel_speed="250″ carousel_transition="" breakpoint_1_autoplay="1″ breakpoint_2_autoplay="1″ breakpoint_3_autoplay="1″][us_separator size="small"]
Mr. Nazrul Islam, DG, MoFA stated that strengthening support services for women migrants and contemporary issues in service delivery and promoting best practices are both overlapping and important for both attaché and the expatriates. He stressed that Bangladesh has many things to be proud of regarding the migrant issues. Such as Bangladesh single-handedly negotiated for the SDG 10.7 goal which is the Global Compact for migration and got consent from more than 107 countries. Addressing the labor attachés he said that though migration is an important tool of development, it is not mandatory for anyone. It is voluntary and nobody should go abroad if there is no work for them. That will be a bad decision for the migrant worker and his/her family. The labor attaché can present a clear picture to the people who are seeking jobs abroad.
Mahjabeen Khaled, former MP and Member, Parliamentary Caucus on Migration and Development advocated that the poor response from the hotline and helpdesk needed to be improvised by using technology. She also mentioned email, text message services can be included instead of the helpdesk. Along with that, by using IT and innovation a central system can be introduced that will be managed from Dhaka and will give the solution to the primary problem faced by migrants. She also suggested the following countries like Sri-Lanka, the Philippines who are working great on migration. She added that the skill of migrant workers should be advanced from lower scale to semi and higher scale to enlarge the migrant job market. She mentioned that rather than focusing on only Middle Eastern countries we need to explore other countries.
As a representative of the labor attache, Md Arifuzzaman, the first Secretary of labor of Jeddah also spoke at the event. He stressed on communication gap as one of the restrictions to delivering support services and legal support to migrant workers especially female migrants for their welfare. He stressed that the teamwork of the officers of different wings is capable of mitigating the service gap between the receiver and the provider. He added that as a servant of the Republic of Bangladesh he and his fellow colleagues are committed to their duties to achieve the targets of vision 2021.
Md.Shamsul Alam, DG, BMET mentioned the challenges which will be faced by labor attachés while working at the embassies and suggested building a strong mindset to deal with that and support migrants with courage. He also stated that the social cost of migration is very high so by working together we can offer better opportunities for the labor migrants.
Md. Saiful Hassan Badal, MD, BOESL recommended the labor attachés to serve the labor migrants responsibly with love, affection. He also encouraged the partnership between CSOs and the government for ensuring the welfare of the migrants.
Gerry Fox, Team Lead of PROKAS, reiterated that it is high time for CSOs and the government to work together and use ideas such as the coordination of information with the vast opportunity of social media for better sharing and bring immediate justice to the migrant's inquiries and Model Consulate approach to reach a greater number of migrants with better support facilities.
Zakir and Rijwan, migrant workers in Abu Dhabi and Singapore have complained about rude behavior and insincerity of the embassy staff. They reported that they have to wait long hours to get their work done. According to both Zakir and Rijwan, things would get done quicker if the embassy staff showed a little concern and they want the government to look into the matter.
Syeed Ahamed, CEO of IID, highlighted the scope of CSOs and Labor Attachés partnership/ public-private partnership/ CSO-government partnership. He presented findings of an undergoing study of IID on migrant's discussion in social media during the pandemic and discussed how the lack of information leading the migrates toward infodemic. He called for the partnership of Labor Attachés to ensure accurate information distribution among migrants. Emphasizing on the low budget for migrant worker's welfare, he also proposed a partnership to implement frugal innovation to provide basic support services to the migrants through organizing best practice forums with the labor attachés. A model consulate approach will be developed through an adaptive, inclusive, and collective forum with a public-private partnership.
Shirin Lira, PROKAS/British Council emphasized the biggest challenges and gaps in the labor migration area which is women labor workers because they disproportionately live in vulnerable situations. Intersectionality is used to identify the challenges and situations of female migrant workers where female domestic migrant workers remain the most exposed. She stresses capacity-building training and orientation on international law and the legal system needed to arrange for the labor attaches when they go abroad for their services. When a female worker comes with an accusation the labor attaches need to know how to file cases and make the victim's obligation stronger so that next time the employer cannot exploit any other worker.
[us_grid post_type="attachment" images="16331,16332″ orderby="post__in" items_quantity="2″ items_layout="gallery_default" items_gap="4px" overriding_link="popup_post_image"][us_separator size="small"]
Sumaiya Islam, Executive Director of BNSK discussed the policy and framework of Bangladesh for the welfare of migrant workers and by sharing the best practices support services of Nepal, Sri Lanka, and the Philippines, she highlighted where the public-private partnership is needed to strengthen our support services. She urged to increase budget allocation to ensuring support services specifically medical support and 24/7 help desk in the destination country both for documented and undocumented migrant workers. She proposed that it will be possible to ensure safe and labor-friendly migration if CSOs and Labor Attachés work together.
Anisul Islam Mahmud MP was the chief guest of the inaugural session and Dr. Ahmed Munirus Saleheen was the chief guest of the concluding session of the event. Syeed Ahamed from IID and Shirin Lira from PROKAS/British Council moderated the two segments of the program, respectively. Among others, Shariful Hasan, Program Head, BRAC Migration, Shakirul Islam, Chairman, OKUP, Syed Saiful Haque, Chairperson, WARBE DF, and Jasiya Khatoon, Director WARBE DF; spoke at the event. Including 9 newly appointed labor attachés, a total of 30 participants from different public-private organizations were present at the event.
[us_grid post_type="attachment" images="16334,16336″ orderby="post__in" items_quantity="2″ items_layout="gallery_default" items_gap="4px" overriding_link="popup_post_image"]
IID launches Social Media campaign amid 2nd wave of COVID19 pandemic
Strengthening Support Services and promoting Model Consulate for Women Migrant
EducationFeatured ArticlehomeICT4DParticipatory GovernanceSDGTrainingYouthYouth for Policy
IID and YfP launched MOOC on 'Public Policy 101'
homeMigrationWorkshop
CSOs to Call for Measurable Commitment and Stronger Monitoring at the IMRF
DiscussionECOSOChomeParticipationParticipatory GovernanceSDGYouthYouth for Policy
Youth must strive to be leaders of today not leaders of tomorrow


Brussels, until recently the flaking and run-down Belgian capital, became a small metropolis over the past 20 years. The demographics changed so radically here that according to recent research only 32.1% of the Brussels population still has (deep) Belgian roots, amongst 170 other nationalities. All in all, with its 1.1 million inhabitants, Brussels is a 'small world city', where the birth rate of 10.06 births/1.000 inhabitants (2011) lies above the national average. It's a hopeful sign for the capital of ageing Europe.
Over the next 10 years the city expects to receive another 150,000 extra people while the Belgo-Belgians are expected to dwindle further to only 15% by 2020.


text:
Stay up-to-date on new Beck Music, Videos News, Tour Dates, and more on Consequence of Sound. CoS is your go-to source for Beck Album reviews, Concert reviews and more.
Red Hot Chili Peppers Announce Massive Tour with The Strokes, Beck & HAIM
They'll also share the road with St. Vincent, A$AP Rocky, Anderson .Paak, and Thundercat.
Sharon Van Etten, Jack Antonoff, Fred Armisen Join Beck Onstage at Newport Folk Festival: Watch
The set was loaded with songs from his '90s albums and other deep cuts.
De-Aged Paul McCartney Will Haunt Your Dreams in Video for Beck's Cover of "Find My Way": Watch
A creepy clip from the recent covers album McCartney III Imagined.
Pearl Jam, Beck, Brandi Carlile to Play Eddie Vedder's Ohana Encore Festival in 2021
Sleater-Kinney, Margo Price, Lord Huron, and White Reaper are also confirmed for the second weekend of the Dana Point, CA festival.
Paul McCartney Releases New Covers Album McCartney III Imagined: Stream
Featuring reworkings by Phoebe Bridgers, St. Vincent, Damon Albarn, Massive Attack's "3D", and Radiohead's Ed O'Brien
35 Record Store Day Titles to Blow Your Stimulus Check On
This year's list includes exclusive releases from Pearl Jam, The Cure, Björk, Rage Against the Machine, The Flaming Lips, and more.
Paul McCartney and Beck Share New Version of "Find My Way": Stream
It's the second single from McCartney III Imagined.
Paul McCartney Announces McCartney III Covers Album with St. Vincent, Phoebe Bridgers, Damon Albarn & More
Imagined also features contributions from Beck, Josh Homme, Khruangbin, Anderson .Paak, Blood Orange, and others.
Scott Pilgrim vs. the World Soundtrack Receives 10th Anniversary Box Set
The Seven Evil Exes Edition includes 24 minutes of unreleased music and the first vinyl pressing of Nigel Godrich's score.
About Beck
Beck Hansen (born Bek David Campbell; July 8, 1970), known by the stage name Beck, is an American singer, songwriter, producer and multi-instrumentalist. He rose to fame in the early 1990s with his lo-fi, sonically experimental style, and he became well known for creating musical collages of a wide range of styles. His later recordings encompass folk, funk, soul, hip hop, alternative rock, country and psychedelia. He has released 12 studio albums, as well as several non-album singles and a book of sheet music.
Born in Los Angeles in 1970, Beck discovered hip hop and folk music in his teens and began to perform locally at coffeehouses and clubs. He moved to New York City in 1989 and became involved in the city's small but intense anti-folk movement. After returning to his hometown in the early 1990s, he cut his breakthrough single "Loser", which became a worldwide hit in 1994. His 1996 album Odelay produced hit singles, topped critic polls and won several awards. He released the stripped-down Mutations in 1998, and the funk-infused Midnite Vultures in 1999. The downcast, acoustic Sea Change (2002) showcased a more serious Beck, and 2005's Guero returned to sample-based production. The Information (2006) was inspired by electro-funk and hip hop, and Modern Guilt (2008), likewise, by 1960s music. In February 2014, Beck released the album Morning Phase. It won Album of the Year at the 57th Grammy Awards on February 8, 2015.
With a pop art collage of musical styles, oblique and ironic lyrics, and postmodern arrangements incorporating samples, drum machines, live instrumentation and sound effects, Beck has been hailed by critics and the public throughout his musical career as being among the most creative and idiosyncratic musicians of 1990s and 2000s alternative rock. Two of Beck's most popular and acclaimed recordings are Odelay and Sea Change, both of which were ranked on Rolling Stone's list of the 500 greatest albums of all time. The four-time platinum artist has collaborated with several artists and has made several contributions to soundtracks. Beck is married to actress Marissa Ribisi, and is a Scientologist.


With numerous recent hate crimes causing multiple deaths and injuries, first responders must be prepared to act. Incident response planning now mitigates chaos in the event of a future hate-related attack.
In today's emergency service professions, training and knowledge are required to respond to every type of modern emergency. Learn more about why education is the key to being better prepared in the field.
Emergency Services: How Much Equipment Is Enough?
How much protection does a community require? Between budgets and proper planning, learn more about how public safety leadership can strike an efficient and practical balance of resources.


text:
/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.camunda.bpm.engine.impl.cmmn.execution;

import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.ACTIVE;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.AVAILABLE;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.CLOSED;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.COMPLETED;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.DISABLED;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.ENABLED;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.FAILED;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.NEW;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.SUSPENDED;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.SUSPENDING_ON_PARENT_SUSPENSION;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.SUSPENDING_ON_SUSPENSION;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.TERMINATED;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.TERMINATING_ON_EXIT;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.TERMINATING_ON_PARENT_TERMINATION;
import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.TERMINATING_ON_TERMINATION;
import static org.camunda.bpm.engine.impl.cmmn.model.CmmnSentryDeclaration.IF_PART;
import static org.camunda.bpm.engine.impl.cmmn.model.CmmnSentryDeclaration.PLAN_ITEM_ON_PART;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_COMPLETE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_CREATE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_DELETE_CASCADE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_DISABLE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_ENABLE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_EXIT;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_FIRE_ENTRY_CRITERIA;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_FIRE_EXIT_CRITERIA;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_MANUAL_COMPLETE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_MANUAL_START;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_OCCUR;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_PARENT_RESUME;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_PARENT_SUSPEND;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_PARENT_TERMINATE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_RESUME;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_RE_ACTIVATE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_RE_ENABLE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_START;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_SUSPEND;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_SUSPENDING_ON_PARENT_SUSPENSION;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_SUSPENDING_ON_SUSPENSION;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_TERMINATE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_TERMINATING_ON_EXIT;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_TERMINATING_ON_PARENT_TERMINATION;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_EXECUTION_TERMINATING_ON_TERMINATION;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_INSTANCE_CLOSE;
import static org.camunda.bpm.engine.impl.cmmn.operation.CmmnAtomicOperation.CASE_INSTANCE_CREATE;
import static org.camunda.bpm.engine.impl.util.EnsureUtil.ensureInstanceOf;
import static org.camunda.bpm.engine.impl.util.EnsureUtil.ensureNotNull;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;

import org.camunda.bpm.engine.ProcessEngineException;
import org.camunda.bpm.engine.delegate.CaseVariableListener;
import org.camunda.bpm.engine.delegate.Expression;
import org.camunda.bpm.engine.delegate.TaskListener;
import org.camunda.bpm.engine.delegate.VariableListener;
import org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseSentryPartEntity;
import org.camunda.bpm.engine.impl.cmmn.model.CmmnActivity;
import org.camunda.bpm.engine.impl.cmmn.model.CmmnCaseDefinition;
import org.camunda.bpm.engine.impl.cmmn.model.CmmnIfPartDeclaration;
import org.camunda.bpm.engine.impl.cmmn.model.CmmnOnPartDeclaration;
import org.camunda.bpm.engine.impl.cmmn.model.CmmnSentryDeclaration;
import org.camunda.bpm.engine.impl.context.Context;
import org.camunda.bpm.engine.impl.core.instance.CoreExecution;
import org.camunda.bpm.engine.impl.core.variable.event.VariableEvent;
import org.camunda.bpm.engine.impl.core.variable.scope.AbstractVariableScope;
import org.camunda.bpm.engine.impl.persistence.entity.TaskEntity;
import org.camunda.bpm.engine.impl.pvm.PvmException;
import org.camunda.bpm.engine.impl.pvm.PvmProcessDefinition;
import org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl;
import org.camunda.bpm.engine.impl.task.TaskDecorator;
import org.camunda.bpm.engine.impl.variable.listener.CaseVariableListenerInvocation;
import org.camunda.bpm.engine.impl.variable.listener.DelegateCaseVariableInstanceImpl;
import org.camunda.bpm.engine.task.Task;

/**
 * @author Roman Smirnov
 *
 */
public abstract class CmmnExecution extends CoreExecution implements CmmnCaseInstance {

  private static final long serialVersionUID = 1L;

  protected transient CmmnCaseDefinition caseDefinition;

  // current position //////////////////////////////////////

  /** current activity */
  protected transient CmmnActivity activity;

  /** the activity which is to be started next */
  protected transient CmmnActivity nextActivity;

  protected boolean required = false;

  protected int previousState;

  protected int currentState = NEW.getStateCode();

  protected List<String> satisfiedSentries;

  protected Queue<VariableEvent> variableEventsQueue;

  protected transient TaskEntity task;

  public CmmnExecution() {
  }

  // plan items ///////////////////////////////////////////////////////////////

  public abstract List<? extends CmmnExecution> getCaseExecutions();

  protected abstract List<? extends CmmnExecution> getCaseExecutionsInternal();

  public CmmnExecution findCaseExecution(String activityId) {
    if ((getActivity()!=null) && (getActivity().getId().equals(activityId))) {
     return this;
   }
   for (CmmnExecution nestedExecution : getCaseExecutions()) {
     CmmnExecution result = nestedExecution.findCaseExecution(activityId);
     if (result != null) {
       return result;
     }
   }
   return null;
  }

  // task /////////////////////////////////////////////////////////////////////

  public TaskEntity getTask() {
    return this.task;
  }

  public void setTask(Task task) {
    this.task = (TaskEntity) task;
  }

  public TaskEntity createTask(TaskDecorator taskDecorator) {
    TaskEntity task = TaskEntity.createAndInsert(this);

    task.setCaseExecution(this);
    setTask(task);

    taskDecorator.decorate(task, this);

    Context.getCommandContext()
      .getHistoricTaskInstanceManager()
      .createHistoricTask(task);

    // All properties set, now firing 'create' event
    task.fireEvent(TaskListener.EVENTNAME_CREATE);

    return task;
  }

  // super execution  ////////////////////////////////////////////////////////

  public abstract PvmExecutionImpl getSuperExecution();

  public abstract void setSuperExecution(PvmExecutionImpl superExecution);

  // sub process instance ////////////////////////////////////////////////////

  public abstract PvmExecutionImpl getSubProcessInstance();

  public abstract void setSubProcessInstance(PvmExecutionImpl subProcessInstance);

  public abstract PvmExecutionImpl createSubProcessInstance(PvmProcessDefinition processDefinition);

  public abstract PvmExecutionImpl createSubProcessInstance(PvmProcessDefinition processDefinition, String businessKey);

  public abstract PvmExecutionImpl createSubProcessInstance(PvmProcessDefinition processDefinition, String businessKey, String caseInstanceId);

  // sub-/super- case instance ////////////////////////////////////////////////////

  public abstract CmmnExecution getSubCaseInstance();

  public abstract void setSubCaseInstance(CmmnExecution subCaseInstance);

  public abstract CmmnExecution createSubCaseInstance(CmmnCaseDefinition caseDefinition);

  public abstract CmmnExecution createSubCaseInstance(CmmnCaseDefinition caseDefinition, String businessKey);

  public abstract CmmnExecution getSuperCaseExecution();

  public abstract void setSuperCaseExecution(CmmnExecution superCaseExecution);

  // sentry //////////////////////////////////////////////////////////////////

  // sentry: (1) create and initialize sentry parts

  protected abstract CmmnSentryPart newSentryPart();

  protected abstract void addSentryPart(CmmnSentryPart sentryPart);

  public void createSentryParts() {
    CmmnActivity activity = getActivity();
    ensureNotNull("Case execution '"+id+"': has no current activity", "activity", activity);

    List<CmmnSentryDeclaration> sentries = activity.getSentries();

    if (sentries != null && !sentries.isEmpty()) {

      for (CmmnSentryDeclaration sentryDeclaration : sentries) {

        CmmnIfPartDeclaration ifPartDeclaration = sentryDeclaration.getIfPart();
        if (ifPartDeclaration != null) {
          CmmnSentryPart ifPart = createIfPart(sentryDeclaration, ifPartDeclaration);
          addSentryPart(ifPart);
        }

        List<CmmnOnPartDeclaration> onPartDeclarations = sentryDeclaration.getOnParts();

        for (CmmnOnPartDeclaration onPartDeclaration : onPartDeclarations) {
          CmmnSentryPart onPart = createOnPart(sentryDeclaration, onPartDeclaration);
          addSentryPart(onPart);
        }

      }
    }
  }

  protected CmmnSentryPart createOnPart(CmmnSentryDeclaration sentryDeclaration, CmmnOnPartDeclaration onPartDeclaration) {
    CmmnSentryPart sentryPart = createSentryPart(sentryDeclaration, PLAN_ITEM_ON_PART);

    // set the standard event
    String standardEvent = onPartDeclaration.getStandardEvent();
    sentryPart.setStandardEvent(standardEvent);

    // set source case execution
    CmmnActivity source = onPartDeclaration.getSource();
    ensureNotNull("The source of sentry '"+sentryDeclaration.getId()+"' is null.", "source", source);

    String sourceActivityId = source.getId();

    CmmnExecution sourceCaseExecution = findCaseExecution(sourceActivityId);
    sentryPart.setSourceCaseExecution(sourceCaseExecution);

    // TODO: handle also sentryRef!!! (currently not implemented on purpose)

    return sentryPart;
  }

  protected CmmnSentryPart createIfPart(CmmnSentryDeclaration sentryDeclaration, CmmnIfPartDeclaration ifPartDeclaration) {
    return createSentryPart(sentryDeclaration, IF_PART);
  }

  protected CmmnSentryPart createSentryPart(CmmnSentryDeclaration sentryDeclaration, String type) {
    CmmnSentryPart newSentryPart = newSentryPart();

    // set the type
    newSentryPart.setType(type);

    // set the case instance and case execution
    newSentryPart.setCaseInstance(getCaseInstance());
    newSentryPart.setCaseExecution(this);

    // set sentry id
    String sentryId = sentryDeclaration.getId();
    newSentryPart.setSentryId(sentryId);

    return newSentryPart;
  }

  // sentry: (2) handle transitions

  public void handleChildTransition(CmmnExecution child, String transition) {
    // Step 1: collect all affected sentries
    List<String> affectedSentries = collectAffectedSentries(child, transition);

    // Step 2: fire force update on all case sentry part
    // contained by a affected sentry to provoke an
    // OptimisticLockingException
    forceUpdateOnCaseSentryPart(affectedSentries);

    // Step 3: check each affected sentry whether it is satisfied.
    // the returned list contains all satisfied sentries
    List<String> satisfiedSentries = getSatisfiedSentries(affectedSentries);

    // Step 4: fire satisfied sentries
    fireSentries(satisfiedSentries);

    if (isActive()) {
      // the following steps are a workaround, because setVariable()
      // does not check nor fire a sentry!!!

      // Step 5: get all not affected sentries to avoid that a
      // sentry will be checked twice;
      // notAffectedSentries = getSentries().keySet() / affectedSentries
      Map<String, List<CmmnSentryPart>> sentries = getSentries();
      List<String> notAffectedSentries = new ArrayList<String>();
      for (String sentryId : sentries.keySet()) {
        // but only those ones which has an ifPart defined
        if (!affectedSentries.contains(sentryId) && containsIfPart(sentryId)) {
          notAffectedSentries.add(sentryId);
        }
      }

      // Step 6: check each not affected sentry whether it is satisfied
      satisfiedSentries = getSatisfiedSentries(notAffectedSentries);

      // Step 7: fire satisfied sentries
      fireSentries(satisfiedSentries);
    }

  }

  protected List<String> collectAffectedSentries(CmmnExecution child, String transition) {
    List<? extends CmmnSentryPart> sentryParts = getCaseSentryParts();

    List<String> affectedSentries = new ArrayList<String>();

    for (CmmnSentryPart sentryPart : sentryParts) {

      // check the ids not the references itself to avoid a select!
      String sourceCaseExecutionId = sentryPart.getSourceCaseExecutionId();
      if (child.getId().equals(sourceCaseExecutionId)) {

        String standardEvent = sentryPart.getStandardEvent();

        if (transition.equals(standardEvent)) {

          if (!sentryPart.isSatisfied()) {
            // if it is not already satisfied, then set the
            // current case sentry part to satisfied (=true).
            String sentryId = sentryPart.getSentryId();
            sentryPart.setSatisfied(true);

            // collect the id of affected sentry.
            if (!affectedSentries.contains(sentryId)) {
              affectedSentries.add(sentryId);
            }
          }
        }
      }
    }

    return affectedSentries;
  }

  protected void forceUpdateOnCaseSentryPart(List<String> sentryIds) {
    for (String sentryId : sentryIds) {
      List<? extends CmmnSentryPart> sentryParts = findSentry(sentryId);
      // set for each case sentry part forceUpdate flag to true to provoke
      // an OptimisticLockingException if different case sentry parts of the
      // same sentry has been satisfied concurrently.
      for (CmmnSentryPart sentryPart : sentryParts) {
        if (sentryPart instanceof CaseSentryPartEntity) {
          CaseSentryPartEntity sentryPartEntity = (CaseSentryPartEntity) sentryPart;
          sentryPartEntity.forceUpdate();
        }
      }
    }
  }

  /**
   * Checks for each given sentry id whether the corresponding
   * sentry is satisfied.
   */
  protected List<String> getSatisfiedSentries(List<String> sentryIds) {
    List<String> result = new ArrayList<String>();

    if (sentryIds != null) {

      for (String sentryId : sentryIds) {

        if (isSentrySatisfied(sentryId)) {
          result.add(sentryId);
        }
      }
    }

    return result;
  }

  protected void fireSentries(List<String> satisfiedSentries) {
    if (satisfiedSentries != null && !satisfiedSentries.isEmpty()) {
      // if there are satisfied sentries, trigger the associated
      // case executions

      // 1. propagate to child case executions ///////////////////////////////////////////

      // returns a copy of the list of child case executions!
      List<? extends CmmnExecution> children = getCaseExecutions();

      for (CmmnExecution currentChild : children) {

        // check and fire first exitCriteria
        currentChild.checkAndFireExitCriteria(satisfiedSentries);

        // then trigger entryCriteria
        currentChild.checkAndFireEntryCriteria(satisfiedSentries);
      }

      // 2. check exit criteria of the case instance //////////////////////////////////////////

      if (isCaseInstanceExecution() && isActive()) {
        checkAndFireExitCriteria(satisfiedSentries);
      }

    }
  }

  protected void checkAndFireExitCriteria(List<String> satisfiedSentries) {
    if (!isNew() && !isCompleted() && !isTerminated()) {
      CmmnActivity activity = getActivity();
      ensureNotNull(PvmException.class, "Case execution '"+getId()+"': has no current activity.", "activity", activity);

      // trigger first exitCriteria
      List<CmmnSentryDeclaration> exitCriteria = activity.getExitCriteria();
      for (CmmnSentryDeclaration sentryDeclaration : exitCriteria) {

        if (sentryDeclaration != null && satisfiedSentries.contains(sentryDeclaration.getId())) {
          fireExitCriteria();
          break;
        }
      }
    }
  }

  protected void checkAndFireEntryCriteria(List<String> satisfiedSentries) {
    if (isAvailable()) {
      // do that only, when this child case execution
      // is available

      CmmnActivity activity = getActivity();
      ensureNotNull(PvmException.class, "Case execution '"+getId()+"': has no current activity.", "activity", activity);

      List<CmmnSentryDeclaration> entryCriteria = activity.getEntryCriteria();
      for (CmmnSentryDeclaration sentryDeclaration : entryCriteria) {

        if (sentryDeclaration != null && satisfiedSentries.contains(sentryDeclaration.getId())) {
          fireEntryCriteria();
          break;
        }
      }
    }
  }

  public void fireExitCriteria() {
    performOperation(CASE_EXECUTION_FIRE_EXIT_CRITERIA);
  }

  public void fireEntryCriteria() {
    performOperation(CASE_EXECUTION_FIRE_ENTRY_CRITERIA);
  }

  // sentry: (3) helper

  public abstract List<? extends CmmnSentryPart> getCaseSentryParts();

  protected abstract List<? extends CmmnSentryPart> findSentry(String sentryId);

  protected abstract Map<String, List<CmmnSentryPart>> getSentries();

  public boolean isSentrySatisfied(String sentryId) {
    List<? extends CmmnSentryPart> sentryParts = findSentry(sentryId);

    // if part will be evaluated in the end
    CmmnSentryPart ifPart = null;

    if (sentryParts != null && !sentryParts.isEmpty()) {
      for (CmmnSentryPart sentryPart : sentryParts) {

        if (PLAN_ITEM_ON_PART.equals(sentryPart.getType())) {

          if (!sentryPart.isSatisfied()) {
            return false;
          }

        } else { /* IF_PART.equals(sentryPart.getType) == true */

          ifPart = sentryPart;

          // once the ifPart has been satisfied the whole sentry is satisfied
          if (ifPart.isSatisfied()) {
            return true;
          }

        }

      }
    }

    if (ifPart != null) {

      CmmnActivity activity = getActivity();
      ensureNotNull("Case execution '"+id+"': has no current activity", "activity", activity);

      CmmnSentryDeclaration sentryDeclaration = activity.getSentry(sentryId);
      ensureNotNull("Case execution '"+id+"': has no declaration for sentry '"+sentryId+"'", "sentryDeclaration", sentryDeclaration);

      CmmnIfPartDeclaration ifPartDeclaration = sentryDeclaration.getIfPart();
      ensureNotNull("Sentry declaration '"+sentryId+"' has no definied ifPart, but there should be one defined for case execution '"+id+"'.", "ifPartDeclaration", ifPartDeclaration);

      Expression condition = ifPartDeclaration.getCondition();
      ensureNotNull("A condition was expected for ifPart of Sentry declaration '"+sentryId+"' for case execution '"+id+"'.", "condition", condition);

      Object result = condition.getValue(this);
      ensureInstanceOf("condition expression returns non-Boolean", "result", result, Boolean.class);

      Boolean booleanResult = (Boolean) result;
      ifPart.setSatisfied(booleanResult);
      return booleanResult;

    }

    // if all onParts are satisfied and there is no
    // ifPart then the whole sentry is satisfied.
    return true;

  }

  protected boolean containsIfPart(String sentryId) {
    List<? extends CmmnSentryPart> sentries = findSentry(sentryId);

    for (CmmnSentryPart part : sentries) {
      if (IF_PART.equals(part.getType())) {
        return true;
      }
    }

    return false;
  }

  // business key ////////////////////////////////////////////////////////////

  public String getCaseBusinessKey() {
    return getCaseInstance().getBusinessKey();
  }

  // case definition ///////////////////////////////////////////////////////

  public CmmnCaseDefinition getCaseDefinition() {
    return caseDefinition;
  }

  public void setCaseDefinition(CmmnCaseDefinition caseDefinition) {
    this.caseDefinition = caseDefinition;
  }

  // case instance /////////////////////////////////////////////////////////

  /** ensures initialization and returns the process instance. */
  public abstract CmmnExecution getCaseInstance();

  public abstract void setCaseInstance(CmmnExecution caseInstance);

  public boolean isCaseInstanceExecution() {
    return getParent() == null;
  }

  // case instance id /////////////////////////////////////////////////////////

  /** ensures initialization and returns the process instance. */
  public String getCaseInstanceId() {
    return getCaseInstance().getId();
  }

  // parent ///////////////////////////////////////////////////////////////////

  /** ensures initialization and returns the parent */
  public abstract CmmnExecution getParent();

  public abstract void setParent(CmmnExecution parent);

  // activity /////////////////////////////////////////////////////////////////

  /** ensures initialization and returns the activity */
  public CmmnActivity getActivity() {
    return activity;
  }

  public void setActivity(CmmnActivity activity) {
    this.activity = activity;
  }

  // next activity /////////////////////////////////////////////////////////////

  public CmmnActivity getNextActivity() {
    return nextActivity;
  }

  public void setNextActivity(CmmnActivity nextActivity) {
    this.nextActivity = nextActivity;
  }

  // variables ////////////////////////////////////////////

  @Override
  public String getVariableScopeKey() {
    return "caseExecution";
  }

  public AbstractVariableScope getParentVariableScope() {
    return getParent();
  }

  //delete/remove /////////////////////////////////////////////////////

  public void deleteCascade() {
   performOperation(CASE_EXECUTION_DELETE_CASCADE);
  }

  public void remove() {
   CmmnExecution parent = getParent();
   if (parent!=null) {
     parent.getCaseExecutionsInternal().remove(this);
   }
  }

  // required //////////////////////////////////////////////////

  public boolean isRequired() {
    return required;
  }

  public void setRequired(boolean required) {
    this.required = required;
  }

  // state /////////////////////////////////////////////////////

  public CaseExecutionState getCurrentState() {
    return CaseExecutionState.CASE_EXECUTION_STATES.get(getState());
  }

  public void setCurrentState(CaseExecutionState currentState) {
    if (!isSuspending() && !isTerminating()) {
      // do not reset the previous state, if this case execution
      // is currently terminating or suspending. otherwise the
      // "real" previous state is lost.
      previousState = this.currentState;
    }
    this.currentState = currentState.getStateCode();
  }

  public int getState() {
    return currentState;
  }

  public void setState(int state) {
    this.currentState = state;
  }

  public boolean isNew() {
    return currentState == NEW.getStateCode();
  }

  public boolean isAvailable() {
    return currentState == AVAILABLE.getStateCode();
  }

  public boolean isEnabled() {
    return currentState == ENABLED.getStateCode();
  }

  public boolean isDisabled() {
    return currentState == DISABLED.getStateCode();
  }

  public boolean isActive() {
    return currentState == ACTIVE.getStateCode();
  }

  public boolean isCompleted() {
    return currentState == COMPLETED.getStateCode();
  }

  public boolean isSuspended() {
    return currentState == SUSPENDED.getStateCode();
  }

  public boolean isSuspending() {
    return currentState == SUSPENDING_ON_SUSPENSION.getStateCode()
        || currentState == SUSPENDING_ON_PARENT_SUSPENSION.getStateCode();
  }

  public boolean isTerminated() {
    return currentState == TERMINATED.getStateCode();
  }

  public boolean isTerminating() {
    return currentState == TERMINATING_ON_TERMINATION.getStateCode()
        || currentState == TERMINATING_ON_PARENT_TERMINATION.getStateCode()
        || currentState == TERMINATING_ON_EXIT.getStateCode();
  }

  public boolean isFailed() {
    return currentState == FAILED.getStateCode();
  }

  public boolean isClosed() {
    return currentState == CLOSED.getStateCode();
  }

  // previous state /////////////////////////////////////////////

  public CaseExecutionState getPreviousState() {
    return CaseExecutionState.CASE_EXECUTION_STATES.get(getPrevious());
  }

  public int getPrevious() {
    return previousState;
  }

  public void setPrevious(int previous) {
    this.previousState = previous;
  }

  // state transition ///////////////////////////////////////////

  public void create() {
    create(null);
  }

  public void create(Map<String, Object> variables) {
    if(variables != null) {
      setVariables(variables);
    }

    performOperation(CASE_INSTANCE_CREATE);
  }

  public List<CmmnExecution> createChildExecutions(List<CmmnActivity> activities) {
    List<CmmnExecution> children = new ArrayList<CmmnExecution>();

    // first create new child case executions
    for (CmmnActivity currentActivity : activities) {
      CmmnExecution child = createCaseExecution(currentActivity);
      children.add(child);
    }

    return children;
  }

  public void triggerChildExecutionsLifecycle(List<CmmnExecution> children) {
    // then notify create listener for each created
    // child case execution
    for (CmmnExecution child : children) {

      if (isActive()) {
        if (child.isNew()) {
          child.performOperation(CASE_EXECUTION_CREATE);
        }
      } else {
        // if this case execution is not active anymore,
        // then stop notifying create listener and executing
        // of each child case execution
        break;
      }
    }
  }

  protected abstract CmmnExecution createCaseExecution(CmmnActivity activity);

  protected abstract CmmnExecution newCaseExecution();

  public void enable() {
    performOperation(CASE_EXECUTION_ENABLE);
  }

  public void disable() {
    performOperation(CASE_EXECUTION_DISABLE);
  }

  public void reenable() {
    performOperation(CASE_EXECUTION_RE_ENABLE);
  }

  public void manualStart() {
    performOperation(CASE_EXECUTION_MANUAL_START);
  }

  public void start() {
    performOperation(CASE_EXECUTION_START);
  }

  public void complete() {
    performOperation(CASE_EXECUTION_COMPLETE);
  }

  public void manualComplete() {
    performOperation(CASE_EXECUTION_MANUAL_COMPLETE);
  }

  public void occur() {
    performOperation(CASE_EXECUTION_OCCUR);
  }

  public void terminate() {
    performOperation(CASE_EXECUTION_TERMINATING_ON_TERMINATION);
  }

  public void performTerminate() {
    performOperation(CASE_EXECUTION_TERMINATE);
  }

  public void parentTerminate() {
    performOperation(CASE_EXECUTION_TERMINATING_ON_PARENT_TERMINATION);
  }

  public void performParentTerminate() {
    performOperation(CASE_EXECUTION_PARENT_TERMINATE);
  }

  public void exit() {
    performOperation(CASE_EXECUTION_TERMINATING_ON_EXIT);
  }

  public void performExit() {
    performOperation(CASE_EXECUTION_EXIT);
  }

  public void suspend() {
    performOperation(CASE_EXECUTION_SUSPENDING_ON_SUSPENSION);
  }

  public void performSuspension() {
    performOperation(CASE_EXECUTION_SUSPEND);
  }

  public void parentSuspend() {
    performOperation(CASE_EXECUTION_SUSPENDING_ON_PARENT_SUSPENSION);
  }

  public void performParentSuspension() {
    performOperation(CASE_EXECUTION_PARENT_SUSPEND);
  }

  public void resume() {
    performOperation(CASE_EXECUTION_RESUME);
  }

  public void parentResume() {
    performOperation(CASE_EXECUTION_PARENT_RESUME);
  }

  public void reactivate() {
    performOperation(CASE_EXECUTION_RE_ACTIVATE);
  }

  public void close() {
    performOperation(CASE_INSTANCE_CLOSE);
  }

  // variable listeners
  public void dispatchEvent(VariableEvent variableEvent) {
    boolean invokeCustomListeners =
        Context
          .getProcessEngineConfiguration()
          .isInvokeCustomVariableListeners();

    Map<String, List<VariableListener<?>>> listeners = getActivity()
        .getVariableListeners(variableEvent.getEventName(), invokeCustomListeners);

    // only attempt to invoke listeners if there are any (as this involves resolving the upwards execution hierarchy)
    if (!listeners.isEmpty()) {
      getCaseInstance().queueVariableEvent(variableEvent, invokeCustomListeners);
    }
  }

  protected void queueVariableEvent(VariableEvent variableEvent, boolean includeCustomerListeners) {

    Queue<VariableEvent> variableEventsQueue = getVariableEventQueue();

    variableEventsQueue.add(variableEvent);

    // if this is the first event added, trigger listener invocation
    if (variableEventsQueue.size() == 1) {
      invokeVariableListeners(includeCustomerListeners);
    }
  }

  protected void invokeVariableListeners(boolean includeCustomerListeners) {
    Queue<VariableEvent> variableEventsQueue = getVariableEventQueue();

    while (!variableEventsQueue.isEmpty()) {
      // do not remove the event yet, as otherwise new events will immediately be dispatched
      VariableEvent nextEvent = variableEventsQueue.peek();

      CmmnExecution sourceExecution = (CmmnExecution) nextEvent.getSourceScope();

      DelegateCaseVariableInstanceImpl delegateVariable =
          DelegateCaseVariableInstanceImpl.fromVariableInstance(nextEvent.getVariableInstance());
      delegateVariable.setEventName(nextEvent.getEventName());
      delegateVariable.setSourceExecution(sourceExecution);

      Map<String, List<VariableListener<?>>> listenersByActivity =
          sourceExecution.getActivity().getVariableListeners(delegateVariable.getEventName(), includeCustomerListeners);

      CmmnExecution currentExecution = sourceExecution;
      while (currentExecution != null) {

        if (currentExecution.getActivityId() != null) {
          List<VariableListener<?>> listeners = listenersByActivity.get(currentExecution.getActivityId());

          if (listeners != null) {
            delegateVariable.setScopeExecution(currentExecution);

            for (VariableListener<?> listener : listeners) {
              try {
                CaseVariableListener caseVariableListener = (CaseVariableListener) listener;
                CaseVariableListenerInvocation invocation = new CaseVariableListenerInvocation(caseVariableListener, delegateVariable, currentExecution);
                Context.getProcessEngineConfiguration()
                  .getDelegateInterceptor()
                  .handleInvocation(invocation);
              } catch (Exception e) {
                throw new ProcessEngineException("Variable listener invocation failed: "+e.getMessage(), e);
              }
            }
          }
        }

        currentExecution = currentExecution.getParent();
      }

      // finally remove the event from the queue
      variableEventsQueue.remove();
    }
  }

  protected Queue<VariableEvent> getVariableEventQueue() {
    if (variableEventsQueue == null) {
      variableEventsQueue = new LinkedList<VariableEvent>();
    }

    return variableEventsQueue;
  }

  // toString() //////////////////////////////////////  ///////////

  public String toString() {
    if (isCaseInstanceExecution()) {
      return "CaseInstance["+getToStringIdentity()+"]";
    } else {
      return "CmmnExecution["+getToStringIdentity() + "]";
    }
  }

  protected String getToStringIdentity() {
    return id;
  }

}

redpajama_set_name: RedPajamaGithub


Description 82 pp., 176:115 mm., nice margins, light age staining, stamps, plate. A very good copy bound in contemporary half marbled paper and cloth over boards, rubbed.
This is the second edition of this work on the Messianic era in Judaism, with references from the Talmud. The title concludes with the "rhetorical" question – is it out of consideration in our time? The text is in German with occasional paragraph-sized selections in Hebrew (or Aramaic).


text:
Home Archive InterAir ups flights to Réunion
InterAir ups flights to Réunion
According to eTNW, InterAir South Africa has added Sunday flights between Johannesburg and Réunion to its network.
Flights will depart Réunion at 08h00 and arrive in Johannesburg at 10h25. The return flight will depart Johannesburg at 11h30 and arrive in Réunion at 17h20.
The airline has also updated its schedule between Johannesburg and Dar es Salaam (Tanzania), scrapping Wednesday flights and adding services on a Tuesday. The flight operates via Ndola (Zambia).
On Mondays InterAir will depart Johannesburg at 10h20 and arrive in Ndola at 12h30, then depart Ndola at 13h10 to arrive in Dar es Salaam at 16h20. The return flight will operate on Tuesdays, departing Dar es Salaam at 16h00 to arrive in Ndola at 17h10. It will depart Ndola at 17h50 and land in Johannesburg at 20h00.
On Thursdays InterAir will depart Johannesburg at 09h20 and arrive in Ndola at 11h30, departing Ndola at 12h15 and arriving in Dar es Salaam at 15h30. The return flight will depart Dar es Salaam at 15h15 and arrive in Ndola at 16h30, departing at 17h30 and arriving in Johannesburg at 19h15 on Fridays.
Previous articleLegacy joins forces with Liberty
Next articleVirgin Atlantic celebrates delivery of its first Dreamliner


Google continues leaking unannounced Nokia devices. Maybe the US software giant is signaling to HMD that devices should already be announced. This time the "leak" comes from the list of devices that support Google Play. Two new devices were added to the list – Nokia 1 Plus (ANT) and Nokia 9 (AOP).
The supported devices list contains just the names, compared to the Enterprise Recommended catalog, where Nokia 9 appeared with some specs, too. We previously heard rumors about Nokia 1 Plus that suggest that the device will be an Android Pie Go phone with 1GB of RAM, MediaTek MT6739WW chipset and a 5-inch screen. HMD's CPO Juho Sarvikas during Nokia 8.1 launch event said (at least I understood it that way) that the company is giving up on "Plus" naming scheme, but we will have to wait till MWC19 to see if the device now called Nokia 1 Plus will indeed be called Nokia 1 Plus. Not to mention that a company called One Plus exists.
Also, Nokia 1 Plus' codename is ANT, as the Play Store support list shows. HMD already said that their 2019 codenames are inspired by superheroes, so maybe the ANT is shorter for Ant-man?
Anyways, as the 24th of February is getting nearer, more stuff will keep popping up on the Internet. I hope HMD has prepared a good presentation and technical explanations of new technologies they will (hopefully) be announcing at MWC.


text:
Tidal News for MARINET — How will the Commission report?
Posted on 20th September 2007 in Renewable Energy
Tidal Power — How will the Commission report?
The Sustainable Development Commission (SDC) aims to report on its tidal power studies early in October 2007. www.sd-commission.org.uk/pages/tidal.html
The government has asked them for a clear answer on the various competing claims and technologies. However the unknowns in the marine environment and technologies mean that the rational answer is to pursue a variety of options. Pilot projects, modular expandable systems, short timescales, and deferring irreversible commitments should guide the strategy. Hopefully the SDC will also speak up for some direct funding (or German-style feed-in funding), rather than sticking to the 'Renewable Obligation' subsidy mechanism, which has served renewables in the UK so poorly.
Intermittency and demands on the National Grid present large problems for the mega-barrage, in the absence of storage. The Natura 2000Natura 2000 A European network of protected sites developed to maintain or restore natural habitats and species of wild flora and fauna to favourable conservation status within the European Union. status and value of the Severn is a show-stopper. Barrages and lagoons are respectively major and minor development projects, which can also give greater or lesser coastal protection from rising sea level and storms.
The three tidal technologies are largely compatible, using different marine sites. So it makes sense to deploy tidal streamtidal stream The flow of water through channels or around coastlines as a result of tidal water movement turbines (several designs), construct a pilot OTI-lagoon and progress studies of the Severn 'Shoots' barrage.
In regard to CO2 and renewable energy targets up to 2020 and transition to a low carbon and renewable power future, tidal lagoons and 'farms' of marine turbines appear of high significance. They could be the large technology end of a decentralised power system.
The SDC's tidal project manager appraised the new review as part of their work and would correct my assertion that the Carbon Trust and the Sustainable Development Commission seem influenced by business interests. They responded:
"The SDC acts independently and takes a sustainable development approach to assessing issues and seeking to integrate environmental as well as economic and social concerns."
The assertion conflates two points, that the SDC Workshop events were dominated by an in-group of official bodies and project promoters, and that the Carbon Trust had adopted a gross under-estimate of tidal stream resource and turbine economics, when this could supply a significant percentage (20-50%) of the UK electricity needs.
Tidal Power – call for a strategic rethink
Conwy Cllr Dr Stuart Anderson, a local GP at the time of the 1990 Towyn Flood Disaster, advocates a basic rethink about tidal energy storage and release (TESAR) schemes. He believes (with the Environment Agency) that the Severn Barrage Project has become a white elephant through failure to give it energy-strategic purpose, with ebb-generation only.
Anderson reminds us that the tidal barrage at La Rance in Normandy was originally run successfully as a two-way generation scheme with two-way pumping as well. This reduced the output discontinuity. But it was then discovered that too little capacity was built in to allow this mode to yield as much net power as ebb-only generation with pumping. Anderson argues this outcome represented a scoping deficit at La Rance rather than evidence that ebb-only generation was the ideal model for the Severn Barrage (or anywhere else).
The summary of Anderson's Ecostar (Eco-Storage for Tidally Amplified Release) concept is available here, also his full article written for the British Hydropower Association. (Both of these are large pdf files.)
Anderson shows how a doubling of turbine/pump capacity would counter many environmental objections to a Severn Barrage by allowing behind-barrage rise-and-fall to equal the natural average tidal sine wave. Meanwhile, quadrupling it would allow behind-barrage amplitude to equal that of high spring tides. Broadly speaking, net power outputs would rise linearly with such increases in installed capacity.
As tides in Liverpool Bay are delayed by four hours, a series of coastally-attached tidal impoundment ('CATI') schemes built there could work in parallel with a redesigned Severn Barrage or the Shoots Barrage to cross-supply pumping requirements. A network of further schemes in NW Wales and SE Scotland as well (where tides arrive 2 hours after Cardiff's) could be devised to supply continuous net power output, even allowing for pumping requirements, that could meet the entire 20 GW UK electrical base-load – i.e. three times more than presently provided by nuclear power.
However the immediate need is for a pilot scheme. Here Anderson suggests that a £150m, 3 sq km offshore tidal impoundment ('OTI') off Rhyl on the N Wales coast (see Fig. below) could be relatively uncontroversial and quick to build. Npower, the builders of the N Hoyle and planned Gwynt y Môr offshore wind farms, have their renewables base at Dolgarrog and have offered a preliminary view on practical and financial feasibility. Attached to the coast by a new-build pier, the scheme might provide a round-the-clock base for servicing the wind farms, besides a maritime facility and local attraction. Progress depends on a political decision that such a pilot scheme is in the national interest. There's an analogy with the pilot off-shore wind turbines set up at Blyth.
Max Wallis – 14th September 2007 for MARINET site


Jump to Winner of Peeler Top 10 Rankings!
Do you need a peeler?
In lieu of a peeler, some cooks used knives but a vegetable peeler in the kitchen is useful when removing skin on apples, carrots and potatoes. Knives often cut too deeply with fruits and veggies cutting of those essential nutrients hidden beneath their skins. A peeler does not cut too deeply and save these nutrients.
Hold the peeler in the hand you write with and the carrot in the other hand. Hold the carrot near the top and with little pressure; begin scraping and peeling away from you going downward. Place your thumb on top side of the peeler and let your fingers guide the peeler. To expose more skin, turn the carrot after each top-to-bottom motion until it is completely peeled. Follow the same procedure when you use potato peeler.
No food sticks to the blade of a good peeler. Based on the test, one inch is the largest space between blade and bridge. Any less of the space and the food is stuck. A peeler with shallow cuts will only remove as little as possible fruit or vegetable that comes with the peel, Top-performing apple peeler have ridge raised along the front of the guiding blade.
This limits less of the guide's surface coming in contact with the food, making the apple slicer to glide along smoothly more. Comfortable peelers are relatively lightweight and have easy-to-grip, ergonomic handles.
Vegetable peeler is the pinnacle among useful tools, and you can use them to prepare foods like fruits as apple slicer and vegetables for cooked and baked dishes. Best materials are silicone and stainless-steel tools to follow your requirements. Peelers are perfect vegetable kitchen tools as they are great in preparing fruits and veggies for baked delights. An apple peeler is used to remove just the apple's skin for toddlers so young won't get choke on the thick apple skins.
Peelers come in many styles: it can be the peeler type known as julienne, serrated and swivel. Peelers feature sharp blades that are typically made of stainless-steel. These peelers are best for adding garnish, zesting and specifically for hardier vegetables; for carrots, Julienne peelers are the best.
For removing skins off slippery and waxy and veggies use serrated peelers as they lessen the dangers of veggies to slip easily. Without digging into the vegetable beneath, swivel peelers are designed to cut only the peel. If you are working with potatoes, you should get a potato peeler having a built-in potato eye remover do it works fast and save time.
Look for peelers that feature soft-grip handles that are also nonslip, so you have maximum control even when your hands or fruits are wet.
Is life in the kitchen worth it without peelers?
Peelers are the pinnacle of useful tools, and you can use them to prepare foods like fruits and vegetables for cooked and baked dishes. To suit your daily need, peelers are in varied materials as stainless-steel and silicone. Peelers are useful tools to help prepare veggies for casseroles, salads and baked delights. With the right kind of peelers you can be the Chef in your home!


The MAIDA programme will directly support the recovery of at least 70,000 women, men, girls and boys who are returnees, IDPs and members of host communities affected by the Boko Haram insurgency in southern and central Borno State.
The objective of MAIDA is to increase the social cohesion and resilience to economic, social and climate related shocks in Borno State in an environmentally-conscious way.
Four interrelated and mutually reinforcing intermediate outcomes will contribute to achieving this objective.
First, MAIDA will restore and improve rural livelihoods in an ecologically sustainable manner by enabling households to take advantage of existing and new agricultural market opportunities.
Sectors of intervention will include market-led and climate-smart livelihood and employment opportunities, vocational training for youth, social and economic protection and community reintegration and peace building.
Conduct program promotion messaging to ensure the messages developed address the current knowledge and practices gaps, messages channels are in line with those most commonly used by the communities.
Mercy Corps team members are expected to support all efforts toward accountability, specifically to our beneficiaries and to international standards guiding international relief and development work.


text:
Share this Story: Pascan Aviation to begin passenger service to Kingston
Pascan Aviation to begin passenger service to Kingston
Elliot Ferguson
Quebec-based Pascan Aviation is to begin service to Norman Rogers Airport in Kingston in early 2022. Photo by Elliot Ferguson /The Whig-Standard
KINGSTON — A Quebec-based regional airline is to begin flying in and out of Kingston Airport early next year.
Pascan Aviation, one of the largest independent regional airlines in Eastern Canada, is to begin flying from Kingston three times a day (6:10 a.m., 11:30 a.m. and 6:30 p.m.) from Monday to Friday and twice a day (11:30 a.m. and 6:30 p.m.) on Saturday and Sunday, beginning in mid March.
Pascan Aviation to begin passenger service to Kingston Back to video
The airline is to also offer connections with Air Canada and Air Transat flights.
The airline's announcement comes almost a year since the city issued a call for airlines interested in serving the community.
"I'm thrilled to welcome Pascan to Kingston. Air service has been impacted across the globe as a result of the pandemic and Kingston was no exception," Mayor Bryan Paterson said.
"Now is the time to build new partnerships and begin exploring new opportunities for air travel, and this partnership is the beginning of a new season for air travel. It will help our economic recovery efforts and will provide a fast and convenient travel link to and from the city."
Pascan operates a fleet of six 33-seat SAAB340B+ aircraft and six 19-seat Jetstream32 aircraft and is to add the 50-seat SAAB2000 in the next year.
The airline currently serves destinations in Montreal (Saint-Hubert and Dorval), Quebec City, Bagotville, Mont-Joli, Bonaventure, Magdalen Island, Baie-Comeau, Sept-Iles, Gaspe and Wabush in Labrador.
Kingston is to be the airline's first Ontario destination.
"Adding Kingston to our list of destinations is the most exciting thing we have done in years," Julian Roberts, chief executive officer of Pascan, said.
"The market is here: people need options for travel, and we are very proud to become that option. With our interline agreements with Air Canada and Air Transat, we are proud to say we will be bringing Kingston to the world, and the world to Kingston."
The airline has about 90 commercial flights per day and carries more than 8,000 passengers per month.
Kingston was among the communities to which Air Canada cut service last year as the national airline refocused on larger routes.
But the upheaval in the airline sector caused by the COVID-19 pandemic also created opportunities to find new partners to foster the city's tourism and economic development goals, said Craig Desjardins, acting commissioner of corporate services.
"Being able to get to Montreal — Montreal is a beautiful city — but it is really the connectivity that going to Dorval has with the rest of the world," Desjardins said. "The ultimate goal is to get people where they want to go."
Montreal-Pierre Elliott Trudeau International Airport in Dorval offers almost the same number of domestic and international connecting flights as Pearson International Airport in Toronto does, but the Montreal airport has more capacity, which should reduce the cost and the number of cancelled or delayed flight to and from Kingston, he said.
"You can get to 95 per cent of the destinations out of Montreal as you can from Toronto," he said.
"It's a new orientation for Kingston passengers — we are so used to going west," said Lakeside District Coun. Wayne Hill, chair of the city's airport advisory committee.
"But this connection to Montreal provides air travellers from Kingston all the options that were available in Toronto: connections to the rest of Canada, access to all the major European, international and southern destinations."


text:
English English (US) Deutsch 日本語 한국어 简体
About Protectosil®
Services and Downloads
Protectosil [en]
170 YEARS AGO - 1847
It started in Berlin
The chemist Theodor Goldschmidt founded the company "Chemische Fabrik Th. Goldschmidt" in Berlin 170 years ago on December 10, 1847.
This was the date of the announcement in the gazette Amtsblatt der Königlichen Regierung zu Potsdam; previously, on December 1, a notice had been issued by the Berlin Police Headquarters. The factory was initially situated on a leasehold property at Köpenicker Chaussee 27, located right next to Kattun-Druckerei R. Goldschmidt & Söhne, one of the largest textile processing factories in Berlin, the managing directors of which were Theodor Goldschmidt's uncles Karl and Eduard.
Due to this connection, the young chemical company primarily supplied precursors for textile processing, including preparing salt (sodium stannate), dextrin, chloride of lime, salt of tin, and small amounts of tin chloride. In 1889/1890, Chemische Fabrik Th. Goldschmidt then relocated to Essen, where it laid the foundations for today's Goldschmidtstrasse site.
Degussa goes East
On December 15, the former Degussa AG and the Slovak pharmaceutical and biotechnology company Biotika founded what is now Evonik Fermas s.r.o. in Slovenska L'upča for the production of amino acids. ... MORE
PER-SIL becomes "PERSIL"
On May 23, 1907 Degussa and Henkel from Düsseldorf signed the first supply agreement for sodium perborate. ... MORE
Well@Work
A marathon with a long-running tradition. The Frankfurt relay race "Around the Anlagenring" was won by one of the two participating Degussa teams. ... MORE
Find within our Products & Solutions


text:
Mace demands Buttigieg audit Southwest, says they shouldn't get billions if they can't handle luggage
Rep. Nancy Mace (R-S.C.) hammered Transportation Secretary Pete Buttigieg for writing a lame, ineffectual letter to Southwest Airlines after this week's meltdown that canceled thousands of flights and stranded Americans during the Christmas holiday.
Appearing on "Fox & Friends First" Friday, Mace asserted the letter "really is nothing. It's just paper at this point."
Then she called for an audit because tracking luggage and flights simply should not be that difficult in 2022. She also pointed out that the airline was gifted $7 billion by the Biden administration in pandemic relief funds to bail them out in 2020 and flatly stated this isn't "rocket science."
"I'm sure a letter really scared the CEO of Southwest Airlines. That really is nothing. It's just paper at this point. And Southwest Airlines was given a $7 billion bailout by the American taxpayers during COVID. I'd like a full accounting of that. Because if you can't keep track of luggage and you're an airline, how do you think the American people could trust for you to take — and keep track of the $7 billion that we gave you? It's ridiculous," she bluntly stated.
"We've got to get to the bottom of it. What I want to hear Pete Buttigieg say, sooner rather than later, is that he's going to audit that $7 billion and get a full accounting for the American people on where that money went," Mace continued.
"This isn't as difficult as it would seem, especially this day and age when the technology is there. Why aren't they using it? Why haven't they upgraded their systems? And why are they treating consumers this way?" she demanded.
Seeing the President take flight to the Caribbean during a national crisis seems a little tone deaf. I'm also calling on Pete Buttigieg to audit every single penny of the $7 billion in taxpayer dollars used to bail out Southwest Airlines. pic.twitter.com/oBUX0VQFdo
— Nancy Mace (@NancyMace) December 29, 2022
She was personally affected by Southwest's cancellations. Her children were stranded in Baltimore traveling home for Christmas. They ultimately made it home because Mace spoke with Capitol police who helped find a key to a car she has there which her children used to drive home. Their luggage, however, is still missing a week later.
"We were up very late Saturday night like everybody else — trying to find flights, trying to find a rental car, trying to find train tickets to get my family home and nothing was available for 4-5 days," Mace recounted.
My kids waiting on their luggage from @SouthwestAir like… pic.twitter.com/22v4yiC7ON
Mace sits on the House Transportation and Infrastructure Committee. She says that Congress should play a role in overseeing transportation too, but noted too much government intervention could be seen as overregulation and may drive up consumer prices.
A better solution, in her opinion, would be for the industry to update its policies and programs. She then listed some of the ways Southwest chose to handle the situation.
"Originally it was they were only going to refund your ticket for weather-related cancellations, and they've changed that this week, thankfully, that they will refund all tickets between now and the end of the year, which they should do," Mace commented.
People are rightly outraged with the Airlines. As a member of the Transportation committee, we will be demanding answers on how this disaster occurred in the first place, and how we can prevent this from happening again. pic.twitter.com/dS9FHJmWQi
Buttigieg wrote in his letter to Southwest that it is "critical" that the airline reimburse passengers.
"No amount of financial compensation can fully make up for passengers who missed moments with their families that they can never get back — Christmas, birthdays, weddings, and other special events," he said. "That's why it is so critical for Southwest to begin by reimbursing passengers for those costs that can be measured in dollars and cents."
Southwest Airlines CEO Bob Jordan announced that flights would operate on a normal schedule beginning Friday.
"There's no greater focus beyond safety than taking care of our customers," he said in a statement. "We're offering refunds, covering expenses. We'll be going back out with even more after that."
Get the latest BPR news delivered free to your inbox daily. SIGN UP HERE


text:
var acra = require('acrawriter');
var pg = require('pg');
var request = require('sync-request');

var res = request('GET', 'http://127.0.0.1:9191/getNewZone');
var zone = JSON.parse(res.getBody().toString('utf8'));
console.log(zone);

var raw_data = 'Test Message';

var config = {
  user: 'postgres',
  database: 'acra',
  password: 'postgres',
  host: 'localhost',
  port: 9494,
  max: 10,
  idleTimeoutMillis: 30000,
};

var pool = new pg.Pool(config);
pool.connect(function(err, client, done) {
  if(err) {
    return console.error('error fetching client from pool', err);
  }
  client.query('CREATE TABLE IF NOT EXISTS testjs_zone(id SERIAL PRIMARY KEY, zone BYTEA, data BYTEA, raw_data TEXT)', [], function(err, res) {
    done();
    if(err) {
      return console.error('error running query', err);
    }
  });
  client.query('insert into testjs_zone (zone, data, raw_data) values ($1, $2, $3)', [zone.id, acra.create_acra_struct(raw_data, new Buffer(zone.public_key, 'base64'), zone.id), raw_data], function(err, res) {
    done();
    if(err) {
      return console.error('error running query', err);
    }
  });

  client.query('select zone, data, raw_data from testjs_zone', [], function(err, res) {
    done();
    if(err) {
      return console.error('error running query', err);
    }
    for(i=0;i<res.rows.length;i++){
        console.log(res.rows[i].zone.toString('utf8'));
        console.log(res.rows[i].data.toString('utf8'));
        console.log(res.rows[i].raw_data.toString('utf8'));
        console.log(" ");
    }
  });
  done();
});

pool.on('error', function (err, client) {
  console.error('idle client error', err.message, err.stack)
})


"Clustermarket taps into GE Healthcare Life Sciences customers to reach UK Innovators"
"Fetch.AI in transformational scientific equipment venture with Clustermarket"
"Imperial College London and Central Working provide £250k to six 'world-saving' startups."
"A new story for Science entrepreneurship."
"The sharing economy – a driving force behind innovation."
"Sharing Economy: Hult B-School Grads Disrupt Life Sciences Industry."
"FoundersFriday with Johannes Solzbach from Clustermarket."
"Clustermarket offers a novel opportunity for a wide range of scientists to prosper and from more opportunities more ideas and good outcomes can grow."
"Equipment is so central to research that physics historian Peter Galison ranks tools as a greater driver of scientific revolutions than ideas."
"Ein Meilenstein für die Healthcare-Szene.
- A milestone for the Health Care Scene."


text:
The Kaiju Preservation Society by John Scalzi – Review
Publisher: Tor Books
Series: N/A
Pages: 264 (Hardcover)
My Rating: 4.0/5.0
The Kaiju Preservation Society is John Scalzi's first standalone adventure since the conclusion of his New York Times bestselling Interdependency trilogy.
When COVID-19 sweeps through New York City, Jamie Gray is stuck as a dead-end driver for food delivery apps. That is, until Jamie makes a delivery to an old acquaintance, Tom, who works at what he calls "an animal rights organization." Tom's team needs a last-minute grunt to handle things on their next field visit. Jamie, eager to do anything, immediately signs on.
What Tom doesn't tell Jamie is that the animals his team cares for are not here on Earth. Not our Earth, at least. In an alternate dimension, massive dinosaur-like creatures named Kaiju roam a warm and human-free world. They're the universe's largest and most dangerous panda and they're in trouble.
It's not just the Kaiju Preservation Society that's found its way to the alternate world. Others have, too–and their carelessness could cause millions back on our Earth to die.
I always know that if I'm looking for a book that's absolutely going to make me roll with laughter while also making poignant, satirical observations about our society, I can pick up the latest John Scalzi book. The Kaiju Preservation Society is no different and its initial setting is definitely relatable because we all just lived through it!
It begins in the early days of the COVID lockdowns and our main character Jamie Gray has just been fired by a food delivery service start-up where he thought he was secure. Shortly after we find him working as a food delivery person for that same business while struggling to pay rent. Salty indeed. Long story short, one of his regulars tangentially knows him, knows he's in dire financial straits, and offers him a *sweet* opportunity with KPS as hired muscle. As Jamie says many times, he's here to lift heavy things. Jamie is off into the mysterious wilds with a group of researchers but he has no true idea of what he's in for until he crosses into a neighboring dimension and sees his first kaiju.
This neighboring world, dubbed Kaiju Earth, is full of incredible research opportunities from the kaiju themselves, to their parasites, to the geography and botany of this new world. I really love exploring new worlds like this and seeing them through the character's lens of wonder. The simple fact that there are giant nuclear reactor creatures wandering about that could crush you beneath their feet without even noticing is SO MUCH FUN. Jamie Gray has a great character voice, though I will allow that it's much like that of the characters from The Interdependency series. I suppose it's uniquely Scalzi and Will Wheaton's narration definitely makes them seem even more similar. For me that's not a bad thing at all because I find it amusing and enjoyable.
Overall, I'd say if you've enjoyed John Scalzi's other more humorous works then you'll probably like this too. If you've always wanted to consider Godzilla or Mothra from a vaguely scientific standpoint, you might also like this. It was a great read that pokes fun at humanity's worst bits while also not taking itself too seriously.
Published by Rebecca
View all posts by Rebecca
Book Review, Books, John Scalzi, Science Fiction, The Kaiju Preservation Society, Tor Books
Currently Reading: 11/21/22
Can't Wait Wednesday: Godkiller by Hannah Kaner
2 thoughts on "The Kaiju Preservation Society by John Scalzi – Review"
I thought this was a lot of fun too. Sort of silly in places but it was all very much a "Scalzi" book😁
maddalena@spaceandsorcery says:
Your definition of a typical Scalzi story is spot-on: a lot of fun wrapping up some pointed remarks at our human foolishness. The perfect recipe, indeed 😉
The Last House on Needless Street by Catriona Ward – Review
Can't Wait Wednesday: Thief Liar Lady by D.L. Soria
Whispers Under Ground + Broken Homes by Ben Aaronovitch – Review
Spice Road by Maiya Ibrahim – Review
powderandpage@gmail.com
View @hiedobaggins's profile on Twitter
View powder_and_page's profile on Instagram


text:
Something for Everyone in Beautiful Bali
Even before it was made famous by Elizabeth Gilbert in her book, Eat, Pray, Love, beautiful Bali had always held a special allure to travelers. This tiny island in Indonesia is full of natural beauty and welcoming charm. Known as the island of the gods, Bali is a popular spot for surfers chasing after the…
Seven Reasons To Visit Shanghai in 2016
For the traveler, a new year represents an open road, a blank journal just waiting to be filled with travel stories. There is something exciting about the uncertainty of a new year. Where will your travels take you? What new place will you discover this year? The possibilities are unimaginably endless. This year, instead of…
The Best Way to Experience Cappadocia
The region of Cappadocia in the country of Turkey is undoubtedly one of the most beautiful and intriguing places to visit in the world. It is an area rich with cultural history, and a stunning landscape to beat. Yet it is also slightly off the beaten path, and falls largely under the radar for the…
Six Things to Do When You Visit Maui
Maui is a traveler's paradise. The second largest island in Hawaii, Maui is packed with stunning views and beautiful landscapes. The island is visited by over two million visitors a year, who come for the mildly temperate year-round weather. With the climate and the scenery, Maui is a perfect spot for travelers to visit any time…
Five Beautiful Reasons to Visit Abu Dhabi
Abu Dhabi is a land of enchantment. The name alone conjures up images of fancy resorts, stunning desert landscapes, and mythical stories. The capital and second most populous city of the United Arab Emirates, Abu Dhabi sits along the coast of UAE, with several of its islands jutting out into the Persian Gulf. With a…
Visit Cayo! Five Ways to Discover Belize
Among the countries that make up Central America, Belize is a little known gem. Tucked away in the north eastern corner of the region, Belize is often overlooked by tourists, who favor its more popular neighbors like Guatemala, Mexico, and El Salvador. According to the World Bank, Belize ranked lowest in number of tourists in 2013,…
Why You Need to Visit the Canadian Rockies
Experiencing the great outdoors is something that can be enjoyed any time of year. In spite of the cold winter months, a visit to a place like the Canadian Rockies can be jam-packed with outdoor activities. LeafCanoer, sociokathy's leaf, "Canadian Rockies Summer Guide," talks about the many things visitors can do when visiting the Canadian…
Inside Washington: Unique DC Attractions
The city of Washington, DC is a treasure trove of history and culture. LeafCanoer, searchingforyourzen, recently visited the city and shared his experiences in his leaf, "Washington DC – In A Day!" The capitol city of the United States, DC is home to well-known attractions like the White House, the Lincoln Memorial, the Washington Monument,…
Eight Reasons to Road Trip Through Oman
Few countries can spark the imagination much like Oman. Located on the southeastern coast of the Arabian Peninsula, Oman is a land of vast deserts and beautiful beaches. It's also full of friendly towns and lush oases. Leafcanoer, blogfromtheblue, recently posted about their travels to Oman in the leaf, "A scenic drive along the coastal…
A Food Lover's Guide to Foodie Calgary
You may not know this, but Calgary has a booming food scene. The third largest city in Canada, Calgary has a population of over 1 million, and offers a variety of activities from shopping to museums, festivals to sporting events. The city attracts over 4.2 million visitors a year. One of the main draws to…


Elegant Diy Table Legs Diy Coffee Table Legs | Home Design Ideas U2013 Waffle House Build Coffee Table Nd Diy Pallet Coffee Table Legs Diy Coffee Table Wine Crates YouTube Premium Diy Coffee Table Legs Diy Coffee Table With Tapered Angle Iron Modern Wood Coffee Table Reclaimed Metal Mid Century Round Good Remodelaholic Gentil Superb Coffee Table Legs Diy Coffee Table Legs Nice Diy Farmhouse Coffee Table Love Grows Wild Diy Cofee Table Trends Design Home Nice Legs: 20 Fun Furniture Legs To Buy Or DIY Via Brit + Co.
Nice Legs: 20 Fun Furniture Legs To Buy Or DIY Via Brit + Co.
Diy Coffee Table Legs Coffee Table Legs Coffee Table Hairpin Legs Diy Industrial Coffee Table Legs .
Remember Ages Ago When I Really Wanted A Hairpin Leg Coffee Table?
Diy Coffee Table Legs Restoration Hardware Coffee Table Diy Wood Coffee Table With Pipe Legs .


The stone pine is a famous Italian conifer producing edible pine nuts. It is also an effective host for the Bianchetto white truffle. Stone pines have a canopy in an umbrella shape and can be maintained to about 4 – 5M in height.