text:
World Population Day 2020
Friday 10 July 2020 MSI Reproductive Choices Contraception, Safe abortion and post abortion care, Maternal health
Humanitarian situations (4)
Centres (1)
Filter by location Mexico Nepal USA Burkina Faso Ghana Democratic Republic of the Congo Nigeria Senegal Sierra Leone Kenya Zambia Bolivia Madagascar Myanmar South Africa Uganda UK Cambodia Ethiopia Zimbabwe Bangladesh Australia Papua New Guinea India
Every year, on 11th July, World Population Day aims to draw attention to issues facing the global population, including the importance of reproductive health and gender equality. This year, as healthcare systems across the world combat Covid-19, MSI is urging national leaders to prioritise access to safe reproductive healthcare to ensure no woman is left behind in the fight for equality.
In 2015, United Nations' Member States gathered together to lay the foundations for the future of development. They agreed that over the next 15 years, strategies to address inequality would adhere to 17 Sustainable Development Goals (SDGs), which recognise that a range of social needs, including education, health, and gender equality, must be incorporated into any development strategy.
At MSI, with over 40 years' experience delivering life-changing healthcare, we know how essential Sexual and Reproductive Health & Rights (SRHR) are to the prosperity of people across the world. Reproductive choice enables individuals to make the decisions that are best for themselves, their families, and their futures. Our experience tells us that reproductive choice is key to the fight for a more resilient, sustainable, and equal world.
But as we write this, the world is in the midst of a global pandemic, and our experience also tells us that in times of crisis, essential women's health services are often deprioritised, despite the fact the need for SRHR does not disappear. During the first few weeks of the Covid-19 lockdown in Ghana, our call centre saw a 400% increase in the number of calls they received from women requesting services. Our programme in Nepal, too, received an increase in calls from women concerned about their ability to access our services. When governments do not classify SRHR services as essential, movement restrictions mean that people are unable to travel to access them. This, together with an increase in stigma for accessing care and the diversion of health resources to the Covid-19 response, has resulted in restricted access for women across the world.
Women will always require safe SRHR services, and when they lose access to contraception, safe abortion, and maternal health services, the consequences can be devastating. During the Ebola crisis in Sierra Leone, as many, if not more, women died due to a lack of access to reproductive healthcare than from the virus itself. Maintaining safe access to safe SRHR can save lives during a crisis; it's essential that national bodies prioritise them.
As we look ahead to a decade wherein the fight against climate change will be key, it's more important than ever that efforts are made to prioritise the role of SRHR in safeguarding women's rights. The climate crisis is taking a growing toll on the already vulnerable communities MSI serves, particularly women and girls, exacerbating existing levels of inequality and poverty. But we know that when women and girls are given the tools to decide whether and when to have children, the health, livelihoods and resilience of not only them as individuals, but also their families and their communities, increase significantly.
Covid-19 is a reminder that if we want to achieve what the United Nations set out to five years ago, governments must protect access to safe, reproductive healthcare. When each person's fundamental right to voluntary, rights-based family planning services is fully realised, the benefits for the health, well-being and lives of women and families is dramatic, and if realised across the globe, progress in development could take a giant leap forward.
This World Population Day, join us in raising awareness of the importance of safe reproductive healthcare by sharing this blog with your network using the #SRHRisEssential and #StandUpForSRHR hashtags.


Lightweight and comfortable above all !
During the development of the BAGHEERA, weight reduction was achieved by optimizing the construction and careful choice of materials; creating a harness without compromise, down to the slightest details. The BAGHEERA makes active piloting instinctive, enabling the pilot to anticipate the air mass, producing a sensation of extraordinary glide.
The BAGHEERA is special in how it distributes support along the lumbar spine, virtually eliminating any pressure points. This allows the pilot to realize long unforgettable lights without developing fatigue due to discomfort.
Attention to the smallest details !
The removable speedbag can be removed and reassembled in 30 seconds! Even the Small speedbag can be fitted to the M harness for pilots with short legs. The BAGHEERA is, above all, very stable feeling with a semi-rigid seatboard and split-leg design. Using the inter-leg adjustment, it is possible to switch between a classic seatboard-style feel and a split-leg hammock-style feel. This adjustment can be made in-flight in a simple and intuitive way, allowing the pilot to adapt the harness to conditions in the moment.
"The BAGHEERA is a very comfortable harness, which allows you to save energy on long flights. The hybrid inter-leg adjustment between a classic seatboard-board style feel and a split-leg hammock-style feel is a marvel. One is free to choose according to the airmass, and all the adjustments are easily accessible in the air. This harness is just like its manufacturer, full of humility and full of very beautiful surprises. The BAGHEERA must be tried at least once in your life! It is likely it will become your next partner in the skies."


text:
Drexel's URBN Center: A Promise Kept
When Allen Sabinson became dean of the Antoinette Westphal College of Media Arts & Design, he stood before his new faculty and staff and promised them a new building. He admits it was a bold and risky move. But just six years later, he made good on his promise.
Around this time next year, the college will operate out of the new URBN Center at 35th and Market Streets inside the 130,000-square-foot former Institute of Scientific Information (ISI) office building, designed by Robert Venturi. The center also includes a 13,000-square-foot annex, a former daycare center at 34th and Filbert Streets designed by Bower, Lewis & Thrower Architects, to house the college's design programs.
"I still keep pinching myself," a delighted Sabinson says.
In September 2011, Drexel's Board of Trustees approved the financing package for construction of the new center, which will house four of the college's seven total departments.
"When I got the word, I immediately sent an email to faculty and staff," Sabinson recalls. "Then I took my fiancée out to dinner and ordered a very expensive bottle of champagne."
For Sabinson, the URBN Center becoming a reality is the source of tremendous satisfaction.
"I had a lengthy career in film and television with great successes— I've worked on projects that have won Emmys and Golden Globes. But I cannot think of an accomplishment that has given me more pleasure," he says.
"I knew that if we did not improve the facilities, this college could not achieve its natural destiny," he adds. "Westphal has the potential to be one of the most elite design colleges in the country—that destiny is in our hands."
Currently, Westphal's departments are spread throughout nine different buildings across campus. One particular sore spot is the geographic separation of the departments of architecture and interior design, two disciplines that are "two sides of the same coin," Sabinson says. "These departments need to be together." In the new URBN Center, they'll be mere feet apart, rather than city blocks.
For exhibition space, the college currently has 750 square feet in its Leonard Pearlstein Gallery in Nesbitt Hall. The new annex at 34th and Filbert Streets will have 4,000 square feet of exhibition space and the URBN Center will have "highly flexible" exhibition space throughout the rest of the building.
"We have never been able to showcase to each other, to the public, the work that we produce except with a couple of 30-year-old exhibit cases," Sabinson says.
There will be a designated exhibition space for Drexel's Historic Costume Collection, which has been stored and exhibited disparately over decades. "These are important and valuable works of art and now we will have a place to house and exhibit them in a temperature-controlled environment," he explains.
Some of the building's other features include:
• A large main lobby with a prominent digital media screen, displays of student work, lounges and informal meeting areas and a café.
• MAD Dragon Enterprises, Drexel's student-run record label, will gain office, operations and seminar space accessible from the main lobby. Design & Merchandising students will have a highly-visible storefront display window in which to practice the craft, business and design skills of visual merchandising to complement an online store.
• The second floor and the second mezzanine level will feature a large motion capture studio, compositing lab, gaming research facility and multiple high-end computer studios for animation, modeling and interactive design.
• The third floor of the URBN Center offers expanded reconfigurable studio space for the Fashion Design programs, as well as sewing labs and a CAD design studio, a fabric dying and printing studio, a state-of-the-art fashion research lab, a SHIMA-SEIKI computerized knit prototyping studio, and a runway for class critiques and informal fashion shows.
• The new Leonard Pearlstein Gallery will also include a black box theater and a 125-seat screening room intended to have the best sound and projection in Philadelphia.
• Woven throughout the entire URBN Center will be faculty offices, conference and seminar rooms, extensive pin-up space for critique and sharing of student work, student lounges and flexible "opportunity spaces."
Sabinson expects the faculty will be most pleased with the design of the new center—mostly because they had a hand in it.
"I wanted to include the college's faculty designers," Sabinson says. "I wanted a process where they felt fully engaged but would meet design expectations. So, every program was involved in the design process."
"What this building will mean to the faculty and to the students will outlive me," he adds. "It will impact generations."
For more information on the URBN Center, click here.

redpajama_set_name: RedPajamaCommonCrawl


text:
Online Video Game
Earning Games
Street Games
Women Sports
Upper Lake can be a very good international water sports activities venue: ICF expert
Erika Norman August 29, 2022
Bhopal: Better cleansing and progressed infrastructure can turn Upper Lake into one of the excellent venues for water sports activities competitions, stated Csaba Szanto, technical professional of International Canoe Federation (ICF), right here on Saturday. In one of a kind chat, Szanto advised TOI that he changed into Bhopal to attend the global canoe championship at Upper Lake. Szanto, a Hungarian national with more than five decades devoted to the canoe dash, has coached Olympians and novices' rankings. He has contributed to the development of the canoe subject in many nations across the globe.
Szanto preferred the efforts of championship organizers. "With restrained sources, the organizers have given their first-class to conduct such an critical championship," stated Szanto. However, he was concerned approximately the great of water for the championship. As a long way as the wind is worried, there's no such trouble on the venue. However, my problem is satisfactory for water. This isn't always a massive problem and by means of overcoming it, the venue could be converted into an international one," stated Szanto.
He stated Bhopal could host even bigger activities in the future. "I would love to see Bhopal conducting extra activities within the future. It requires the authority's guide also. I am satisfied to look that Indian Kayaking and Canoeing Association (IKCA) has completed a terrific process in setting up the championship," stated Szanto. About India's presence on the global level in kayaking and canoeing, Szanto said, "India is going proper. Players need to go higher to make India's presence felt inside the international circuit. I assume that water sports activities are being promoted. This recreation has an amazing destiny in the USA.
As a professional competitor in Sprint Canoe for 15 years and a member of the Hungarian countrywide crew for 10 years, Szanto has to his credit over a dozen countrywide championships, numerous medals in global competitions and a bronze medal on the World Championships. From 1975 to 1990, he served as head instruct for a club in Budapest, skilled the Hungarian national canoe team for seven years, and coached USA Olympic team for three years. Since 1991, Szanto has worked for the International Canoe Federation in several essential capacities. In the route of his career, he has attended seven Olympic Games and 20 World Championships.
Bhopal: Breaking an 8-year long curse, Kayaking champion Rajina Kiro gained a medal at the continued global meet in Bhopal on Saturday. The 35-12 months-old, who's additionally a sup-inspector in Andaman and Nicobar police, bagged silver medal in K-4. Flashing her silver boon, Rajina went emotional on the podium. "This medal method lots for me. It has given me confidence that there is lots of game left in me.
Sharing her enjoy, she introduced, "My ultimate medal got here in Asian Championship in 2011. Since then, I have to set my exceptional. However, fortune turned not on my face. I am thankful for Bhopal for allowing me to contest and win the medal for u . S. A. Participated thrice in Asian Games, Rajina had little time for instruction. "It isn't easy to take education time when you are into a relatively responsible career like the police. In something little time I had for education, I completely devoted myself to the sport. Even for the Bhopal championship, Rajina had taken special permission. She has to join the election responsibility right now.
Boosted after the win, Rajina now has her eyes at the 2020 Olympics. "Indian women kayaking group has never qualified for the Olympics. I will strive to interrupt that jinx and leave no stone unturned now," she brought. About the occasion, Rajina said, "This is a good way to popularise this sport in the united states of America. Indian players got the opportunity to contest in opposition to overseas players of their domestic. We can conquer bottlenecks and prepare ourselves for alternative global meets. Rajina is also educating budding players in Andaman. "India has a number of talent in Kayaking, only a higher exposure is needed," she suggested.
Bhopal: Former minister Laxmi Kant Sharma, his brother, and BJP MLA Umakant Sharma and 50 others had been booked by means of police in Vidisha district for allegedly violating the poll code of conduct. Chairman of the Hindu Utsav Samiti Om Soni has additionally been charged with equal sections. District BJP president Rakesh Jadon has condemned the police motion. Sources say action turned into taken after the video went viral on social media on Friday. The MLA Umakant was scolding some law enforcement officials throughout the Holika-Dahan occasion in Sironj (Vidisha).
The incident took place in Sironj which has a lifestyle of lighting up Holi pyre with a gunshot. Police officers had objected to using guns, mentioning the version code of conduct. MLA got annoyed and entered into heated arguments with the police. The video had long passed virally. The MLA and his supporters are annoying the BJP price tag for Laxmikant Sharma from Vidisha.
Erika Norman
Travelaholic. Introvert. Certified coffee enthusiast. Beer expert. Web trailblazer. Bacon geek. Spent 2002-2009 lecturing about human growth hormone in Hanford, CA. Spent several months developing strategies for teddy bears in Prescott, AZ. Earned praised for my work exporting chess sets in the financial sector. Uniquely-equipped for working on xylophones in Africa. Uniquely-equipped for getting to know cannibalism in Salisbury, MD. Developed several new methods for developing strategies for wieners in West Palm Beach, FL.
Phoenix cousins are swimming stars
Goa requested to take name on watersports at Morjim, Mandrem
Jeremy Buendia Calls Out Bodybuilding Legend Dexter Jackson And Sergio Oliva Jr.
Erika Norman September 29, 2022
People are swooning over a 'buff' bodybuilding monkey
Cycling: Galedo leads ITT winners in national championships
Erika Norman September 7, 2022
Horse race in Manikganj to have fun Independence Day
Hosting Fifa U-17 World Cup 2020 will positioned Indian women's soccer on international map: Bembem Devi
Horse Racing At Parx Casino
How to Do a Behavior Boot Camp? – The Process
The Best Golf Courses In Idaho
How to Host an Ice Hockey Olympic Games
How to Swim Faster in the Pool
Swimming: Podium protests a element of the beyond – FINA executive Marculescu
A Thousand Splendid Runs
Grand Theft Auto's Diamond Casino shall we cash be became chips
Concerns aired about Suffolk Downs' plans for horse racing at fairgrounds
Lionel Messi Suspended from Argentina's Opening World Cup Qualifier
Copyright © PiuPlayer - All rights reserved.


Learn from producers about their gourmet goods.
No fuss, comfortable touring service.
"You are not the average traveller. We are not the average tour company"
Join a tour or design your own – be prepared for an exceptional experience.
Just 90 minutes from Melbourne, we operate seven days per week. If you are an "experience seeker" and enjoy "Aussie hospitality" you will enjoy our tours.


text:
O Cedefop
Only part of our content is available in the language you selected. See what content is available in Polski.
Germany: the new Recognition Act
Around 2.9 million people living in Germany have migrant backgrounds and acquired their highest vocational qualification in another country. Often, however, they are unable to find employment matching their qualification. Germany's new law to improve the assessment and recognition of professional qualifications acquired abroad aims to contribute to better and more uniform regulation.
The Assessment and Recognition of Foreign Professional Qualifications Act ('Recognition Act'), which entered into force on 1 April 2012, introduces a standardised national procedure and criteria for the assessment of foreign professional qualifications - at least for professions that are regulated by federal law. It improves the opportunities for people who gained their qualifications abroad to work in their trained profession. The act also makes Germany a more attractive workplace for international skilled staff.
The debate surrounding the German qualifications framework (DQR) took place in autumn 2011. The German qualifications framework has its origins in the European qualifications framework (EQF) and pursues objectives and purposes which are not merely national. Germany subjected itself to the European process to improve understanding and comparability of qualifications in different countries and thus foster the mobility of citizens. The DQR debate coincided with preparations for the law to improve the assessment and recognition of vocational education and training qualifications acquired abroad. Although the two processes took place completely independently of each other, the correlations are obvious.
Education and training attainment
EQF
Mobility of learners and workers
Recognition of qualifications
European qualifications framework (EQF)
Sieć agencji UE
Polityka w zakresie cookies
Polityka w zakresie ochrony danych osobowych
Publiczny dostęp do dokumentów


When should one begin their holiday baking if they want to give out cookie platters the week before Christmas? Last year I did all my baking in 2 days and it nearly killed me, but I don't want to do it too far in advance or the cookies won't be fresh. I tried freezing cookies once but they ended up all ice crystally and didn't taste right.
Typically, cookies with high butterfat content will stay fresh for about a week at room temperature. Cookies that can be frozen should last 3 -4 months if undisturbed at 0°F.
The storage method all depends on the type of cookie. Remember, do not attempt to package any cookies for storage until they have cooled completely.
Soft cookies typically do not freeze well. Store them in an air tight container. If the cookies begin to dry out, add a slice of fresh bread or 1/2 of an apple to the container to help balance the moisture.
Crisp cookies freeze well. You can use freezer bags, just slide a sheet of waxed paper between each layer. Thaw at room temperature. If you live in a dry climate, just cover the cookies for short term storage. If you live in a humid one, you'll need an airtight container. Crisp cookies may be recrisped in an oven for 3-5 minutes on an ungreased baking sheet.
Cookies containing meringue cannot be frozen. Well, they could, but you'll be left with a nasty weepy cookie.
Brownies freeze very well in an airtight container or freezer bag.
Decorated cookies typically do not freeze well due to the moisture content of the frosting. (Those decorated with sprinkles should be OK) After the frosting has hardened store these cookies at room temperature in an airtight container with a sheet of wax paper between layers.
Cookies that contain dairy products, such as cream cheese, with the exception of butter need to be refrigerated.
Cookies with moist centers, should be stored in a loosely covered container. These typically do not freeze well.
Lowfat cookies do not freeze well, it's due to their higher water content.
Now, about that cookie dough.
Do not freeze dough containing only egg whites. It is too delicate for the freezer. If the dough has whole eggs, it should freeze well.
Rolled cookie dough can be rolled out into sheets that will be ready to cut when thawed. Depending on the directions roll out to 1/2″ or 1/4″. Place on a floured baking sheet and freeze. When fully frozen, layer in shallow container or freezer bag, with wax paper between the layers. Remove as needed from the freezer and allow to thaw in the refrigerator. Cut the cookies and bake according to the recipe's directions.
Cookie dough will last 3 – 4 months if frozen in air tight packaging.
This is our first Christmas in the neighborhood and I was wondering at Cookie Exchange Etiquette? When to return the cookies? How many, how much? Who gets cookies? All very confusing.
I just made some rolled sugar cookies and frosted them with an egg-white frosting. The frosting hardened overnight and I used waxed paper between layers, but some of the frosting still stuck and some of the cookies looked bad.
My mom suggested freezing them because she thought the moisture from the cookies in the closed container softened up the frosting. I thought maybe it was the cheap waxed paper I was using. . . . any thoughts?


text:
"""
Profile CRUD, import/export, storage, and buildings
"""

import json
import copy

from celery.result import AsyncResult
from django.contrib import messages
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User, Group
from django.core.mail import mail_admins
from django.db import IntegrityError
from django.db.models.aggregates import Avg, Count, Max, Min, StdDev, Sum
from django.http import HttpResponse, JsonResponse, Http404, HttpResponseBadRequest, HttpResponseForbidden
from django.shortcuts import get_object_or_404, render, redirect, reverse
from django.template import loader
from django.template.context_processors import csrf
from django.utils.html import mark_safe
from django.utils.text import slugify

from herders.decorators import username_case_redirect
from herders.forms import RegisterUserForm, CrispyChangeUsernameForm, DeleteProfileForm, EditUserForm, \
    EditSummonerForm, EditBuildingForm, ImportSWParserJSONForm
from herders.models import ArtifactInstance, MonsterInstance, RuneCraftInstance, RuneInstance, Summoner, MaterialStorage, MonsterShrineStorage, Building, BuildingInstance, ArtifactCraftInstance
from herders.profile_parser import validate_sw_json
from herders.rune_optimizer_parser import export_win10
from herders.tasks import com2us_data_import
from herders.views.compare import _get_efficiency_statistics

from bestiary.models import GameItem, RuneCraft, Rune, Artifact, Monster, Fusion

def register(request):
    form = RegisterUserForm(request.POST or None)

    if request.method == 'POST':
        if form.is_valid():
            if User.objects.filter(username__iexact=form.cleaned_data['username']).exists():
                form.add_error('username', 'Username already taken')
            elif User.objects.filter(email__iexact=form.cleaned_data['email']).exists():
                form.add_error(
                    'email',
                    mark_safe(
                        f'Email already in use. You can reset your password if you forgot it.'
                    )
                )
            else:
                new_user = None
                new_summoner = None

                try:
                    # Create the user
                    new_user = User.objects.create_user(
                        username=form.cleaned_data['username'],
                        password=form.cleaned_data['password'],
                        email=form.cleaned_data['email'],
                    )
                    new_user.save()
                    new_user.groups.add(Group.objects.get(name='Summoners'))
                    new_summoner = Summoner.objects.create(
                        user=new_user,
                        summoner_name=form.cleaned_data['summoner_name'],
                        public=form.cleaned_data['is_public'],
                        dark_mode=form.cleaned_data['dark_mode'],
                        consent_report=form.cleaned_data['consent_report'],
                        consent_top=form.cleaned_data['consent_top'],
                    )
                    new_summoner.save()

                    # Automatically log them in
                    user = authenticate(
                        username=form.cleaned_data['username'], password=form.cleaned_data['password'])
                    if user is not None:
                        if user.is_active:
                            login(request, user)
                            return redirect('herders:profile_default', profile_name=user.username)
                except IntegrityError as e:
                    if new_user is not None:
                        new_user.delete()
                    if new_summoner is not None:
                        new_summoner.delete()

                    form.add_error(
                        None, 'There was an issue completing your registration. Please try again.')
                    mail_admins(
                        subject='Error during user registration',
                        message='{}'.format(e),
                        fail_silently=True,
                    )

    context = {'form': form}

    return render(request, 'herders/register.html', context)

@login_required
def change_username(request):
    user = request.user
    form = CrispyChangeUsernameForm(request.POST or None)

    context = {
        'form': form,
    }

    if request.method == 'POST' and form.is_valid():
        try:
            user.username = form.cleaned_data['username']
            user.save()

            return redirect('username_change_complete')
        except IntegrityError:
            form.add_error('username', 'Username already taken')

    return render(request, 'registration/change_username.html', context)

def change_username_complete(request):
    return render(request, 'registration/change_username_complete.html')

@username_case_redirect
@login_required
def profile_delete(request, profile_name):
    user = request.user
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    form = DeleteProfileForm(request.POST or None)
    form.helper.form_action = reverse('herders:profile_delete', kwargs={
                                      'profile_name': profile_name})

    context = {
        'form': form,
    }
    if is_owner:
        if request.method == 'POST' and form.is_valid():
            logout(request)
            user.delete()
            messages.warning(
                request, 'Your profile has been permanently deleted.')
            return redirect('news:latest_news')

        return render(request, 'herders/profile/profile_delete.html', context)
    else:
        return HttpResponseForbidden("You don't own this profile")

@username_case_redirect
@login_required
def following(request, profile_name):
    return_path = request.GET.get(
        'next',
        reverse('herders:profile_following', kwargs={
                'profile_name': profile_name})
    )

    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    followed_by = {f.pk: f for f in summoner.followed_by.all()}
    friends = {
        f.pk: {
            'obj': f,
            'following': True,
            'followed_by': False,
        } for f in summoner.following.all()
    }

    for f_pk, f_obj in followed_by.items():
        if f_pk in friends:
            friends[f_pk]['followed_by'] = True
        else:
            friends[f_pk] = {
                'obj': f_obj,
                'following': False,
                'followed_by': True,
            }

    friends = sorted(list(friends.values()), key=lambda el: (-el['following'], -el['followed_by']))

    context = {
        'is_owner': is_owner,
        'profile_name': profile_name,
        'summoner': summoner,
        'friends': friends,
        'view': 'following',
        'return_path': return_path,
    }

    return render(request, 'herders/profile/following/list.html', context)

@username_case_redirect
@login_required
def follow_add(request, profile_name, follow_username):
    return_path = request.GET.get(
        'next',
        reverse('herders:profile_default', kwargs={
                'profile_name': profile_name})
    )

    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()
    new_follower = get_object_or_404(Summoner, user__username=follow_username)
    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if is_owner:
        summoner.following.add(new_follower)
        messages.info(request, 'Now following %s' % new_follower.user.username)
        return redirect(return_path)
    else:
        return HttpResponseForbidden()

@username_case_redirect
@login_required
def follow_remove(request, profile_name, follow_username):
    return_path = request.GET.get(
        'next',
        reverse('herders:profile_default', kwargs={
                'profile_name': profile_name})
    )

    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()
    removed_follower = get_object_or_404(
        Summoner, user__username=follow_username)
    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if is_owner:
        summoner.following.remove(removed_follower)
        messages.info(request, 'Unfollowed %s' %
                      removed_follower.user.username)
        return redirect(return_path)
    else:
        return HttpResponseForbidden()

@username_case_redirect
@login_required
def profile_edit(request, profile_name):
    return_path = request.GET.get(
        'next',
        reverse('herders:profile_default', kwargs={
                'profile_name': profile_name})
    )
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    user_form = EditUserForm(request.POST or None, instance=request.user)
    summoner_form = EditSummonerForm(
        request.POST or None, instance=request.user.summoner)

    context = {
        'is_owner': is_owner,
        'profile_name': profile_name,
        'summoner': summoner,
        'return_path': return_path,
        'user_form': user_form,
        'summoner_form': summoner_form,
    }

    if is_owner:
        if request.method == 'POST' and summoner_form.is_valid() and user_form.is_valid():
            summoner_form.save()
            user_form.save()

            messages.info(request, 'Your profile has been updated.')
            return redirect(return_path)
        else:
            return render(request, 'herders/profile/profile_edit.html', context)
    else:
        return HttpResponseForbidden()

@username_case_redirect
@login_required
def storage(request, profile_name):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if is_owner:
        craft_mats = []
        monster_mats = []
        monster_shrine_mats = []
        summoner_material_storage = {
            ms.item.com2us_id: ms for ms in MaterialStorage.objects.select_related('item').filter(owner=summoner)}

        essences = {gi.com2us_id: gi for gi in GameItem.objects.filter(
            category=GameItem.CATEGORY_ESSENCE)}
        essence_elements = {
            key: {
                'name': None,
                'field_name': None,
                'element': None,
                'qty': [0, 0, 0],
            } for key in ['magic', 'fire', 'water', 'wind', 'light', 'dark']
        }
        essence_lvl = ['low', 'mid', 'high']

        for key, essence in essences.items():
            slug_split = essence.slug.split('-')
            element = slug_split[0]
            if not essence_elements[element]['name']:
                essence_elements[element]['name'] = ' '.join(
                    essence.name.split(' ')[::2])  # drop `low`, `mid`, `high`
            if not essence_elements[element]['field_name']:
                essence_elements[element]['field_name'] = '_'.join(
                    slug_split[::2])  # drop `low`, `mid`, `high`, connect with `_`
            if not essence_elements[element]['element']:
                essence_elements[element]['element'] = element  # only element

            essence_elements[element]['qty'][essence_lvl.index(
                slug_split[1])] = summoner_material_storage[key].quantity if key in summoner_material_storage else 0
        essence_mats = list(essence_elements.values())

        craft_categories = [
            GameItem.CATEGORY_CRAFT_STUFF,
            GameItem.CATEGORY_RUNE_CRAFT,
            GameItem.CATEGORY_ARTIFACT_CRAFT,
        ]
        crafts = {gi.com2us_id: gi for gi in GameItem.objects.filter(
            category__in=craft_categories).order_by('com2us_id')}
        for key, craft in crafts.items():
            craft_mats.append({
                'name': craft.name,
                'field_name': craft.slug.replace('-', '_'),
                'qty': summoner_material_storage[key].quantity if key in summoner_material_storage else 0,
            })

        material_monsters = {gi.com2us_id: gi for gi in GameItem.objects.filter(
            category=GameItem.CATEGORY_MATERIAL_MONSTER).order_by('category')}
        for key, material_monster in material_monsters.items():
            monster_mats.append({
                'name': material_monster.name.replace('White', 'Light').replace('Red', 'Fire').replace('Blue', 'Water').replace('Gold', 'Wind'),
                'field_name': material_monster.slug.replace('-', '_').replace('white', 'light').replace('red', 'fire').replace('blue', 'water').replace('gold', 'wind'),
                'qty': summoner_material_storage[key].quantity if key in summoner_material_storage else 0,
            })

        # Monster Shrine, may be moved to other page
        for monster_shrine in MonsterShrineStorage.objects.select_related('item').filter(owner=summoner).order_by('item__awaken_level', 'item__name'):
            monster_shrine_mats.append({
                'name': monster_shrine.item.name,
                'img': monster_shrine.item.image_filename,
                'field_name': f'shrine_{monster_shrine.item.com2us_id}',
                'qty': monster_shrine.quantity,
            })

        context = {
            'is_owner': is_owner,
            'profile_name': profile_name,
            'summoner': summoner,
            'essence_mats': essence_mats,
            'craft_mats': craft_mats,
            'monster_mats': monster_mats,
            'monster_shrine_mats': monster_shrine_mats,
        }

        return render(request, 'herders/profile/storage/base.html', context=context)
    else:
        return HttpResponseForbidden()

@username_case_redirect
@login_required
def storage_update(request, profile_name):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if is_owner and request.POST:
        field_name = request.POST.get('name')
        try:
            new_value = int(request.POST.get('value'))
        except ValueError:
            return HttpResponseBadRequest('Invalid Entry')

        essence_size = None
        if 'essence' in field_name:
            field_name, essence_size = field_name.split('.')

        field_name = field_name.split('_')
        if essence_size:
            field_name.insert(1, essence_size)
        field_name = '-'.join(field_name)  # slug

        if 'angelmon' in field_name:
            field_name = field_name.replace('light', 'white').replace(
                'fire', 'red').replace('water', 'blue').replace('wind', 'gold')

        try:
            item = MaterialStorage.objects.select_related(
                'item').get(owner=summoner, item__slug=field_name)
            item.quantity = new_value
            item.save()
        except MaterialStorage.DoesNotExist:
            # ignore some strange 'UNKNOWN ITEM'
            game_item = GameItem.objects.get(slug=field_name)
            item = MaterialStorage.objects.create(
                owner=summoner, item=game_item, quantity=new_value)
            item.save()
        except GameItem.DoesNotExist:
            return HttpResponseBadRequest('No such item exists')

        return HttpResponse()
    else:
        return HttpResponseForbidden()

@username_case_redirect
def buildings(request, profile_name):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return render(request, 'herders/profile/not_found.html')

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    context = {
        'summoner': summoner,
        'is_owner': is_owner,
        'profile_name': profile_name,
    }

    return render(request, 'herders/profile/buildings/base.html', context)

@username_case_redirect
def buildings_inventory(request, profile_name):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return render(request, 'herders/profile/not_found.html')

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    all_buildings = Building.objects.all().order_by('name')

    building_data = []
    total_glory_cost = 0
    spent_glory = 0
    total_guild_cost = 0
    spent_guild = 0

    for b in all_buildings:
        bldg_data = _building_data(summoner, b)
        if b.area == Building.AREA_GENERAL:
            total_glory_cost += sum(b.upgrade_cost)
            spent_glory += bldg_data['spent_upgrade_cost']
        elif b.area == Building.AREA_GUILD:
            total_guild_cost += sum(b.upgrade_cost)
            spent_guild += bldg_data['spent_upgrade_cost']

        building_data.append(bldg_data)

    context = {
        'is_owner': is_owner,
        'summoner': summoner,
        'profile_name': profile_name,
        'buildings': building_data,
        'total_glory_cost': total_glory_cost,
        'spent_glory': spent_glory,
        'glory_progress': float(spent_glory) / total_glory_cost * 100,
        'total_guild_cost': total_guild_cost,
        'spent_guild': spent_guild,
        'guild_progress': float(spent_guild) / total_guild_cost * 100,
    }

    return render(request, 'herders/profile/buildings/inventory.html', context)

@username_case_redirect
@login_required
def building_edit(request, profile_name, building_id):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)
    base_building = get_object_or_404(Building, pk=building_id)

    try:
        owned_instance = BuildingInstance.objects.get(
            owner=summoner, building=base_building)
    except BuildingInstance.DoesNotExist:
        owned_instance = BuildingInstance.objects.create(
            owner=summoner, level=0, building=base_building)

    form = EditBuildingForm(request.POST or None, instance=owned_instance)
    form.helper.form_action = reverse(
        'herders:building_edit',
        kwargs={'profile_name': profile_name, 'building_id': building_id}
    )

    context = {
        'form': form,
    }
    context.update(csrf(request))

    if is_owner:
        if request.method == 'POST' and form.is_valid():
            owned_instance = form.save()
            messages.success(
                request,
                f'Updated {owned_instance.building.name} to level {owned_instance.level}'
            )

            response_data = {
                'code': 'success',
            }
        else:
            template = loader.get_template(
                'herders/profile/buildings/edit_form.html')
            response_data = {
                'code': 'error',
                'html': template.render(context),
            }

        return JsonResponse(response_data)
    else:
        return HttpResponseForbidden()

def _building_data(summoner, building):
    percent_stat = building.affected_stat in Building.PERCENT_STATS
    total_upgrade_cost = sum(building.upgrade_cost)
    if building.area == Building.AREA_GENERAL:
        currency = 'glory_points.png'
    else:
        currency = 'guild_points.png'

    try:
        instance = BuildingInstance.objects.get(
            owner=summoner, building=building)
        if instance.level > 0:
            stat_bonus = building.stat_bonus[instance.level - 1]
        else:
            stat_bonus = 0

        remaining_upgrade_cost = instance.remaining_upgrade_cost()
    except BuildingInstance.DoesNotExist:
        instance = None
        stat_bonus = 0
        remaining_upgrade_cost = total_upgrade_cost
    except BuildingInstance.MultipleObjectsReturned:
        # Should only be 1 ever - use the first and delete the others.
        instance = BuildingInstance.objects.filter(
            owner=summoner, building=building).first()
        BuildingInstance.objects.filter(
            owner=summoner, building=building).exclude(pk=instance.pk).delete()
        return _building_data(summoner, building)

    return {
        'base': building,
        'instance': instance,
        'stat_bonus': stat_bonus,
        'percent_stat': percent_stat,
        'spent_upgrade_cost': total_upgrade_cost - remaining_upgrade_cost,
        'total_upgrade_cost': total_upgrade_cost,
        'upgrade_progress': float(total_upgrade_cost - remaining_upgrade_cost) / total_upgrade_cost * 100,
        'currency': currency,
    }

@username_case_redirect
@login_required
def import_export_home(request, profile_name):
    return render(request, 'herders/profile/import_export/base.html', context={
        'profile_name': profile_name,
        'view': 'importexport'
    })

def _get_import_options(form_data):
    return {
        'clear_profile': form_data.get('clear_profile'),
        'default_priority': form_data.get('default_priority'),
        'lock_monsters': form_data.get('lock_monsters'),
        'minimum_stars': int(form_data.get('minimum_stars', 1)),
        'ignore_silver': form_data.get('ignore_silver'),
        'ignore_material': form_data.get('ignore_material'),
        'except_with_runes': form_data.get('except_with_runes'),
        'except_light_and_dark': form_data.get('except_light_and_dark'),
        'except_fusion_ingredient': form_data.get('except_fusion_ingredient'),
        'delete_missing_monsters': form_data.get('missing_monster_action'),
        'delete_missing_runes': form_data.get('missing_rune_action'),
        'ignore_validation_errors': form_data.get('ignore_validation'),
    }

@username_case_redirect
@login_required
def import_sw_json(request, profile_name):
    errors = []
    validation_failures = []
    request.session['import_stage'] = None
    request.session['import_total'] = 0
    request.session['import_current'] = 0

    if request.POST:
        request.session['import_stage'] = None
        request.session.save()

        form = ImportSWParserJSONForm(request.POST, request.FILES)
        form.helper.form_action = reverse('herders:import_swparser', kwargs={
                                          'profile_name': profile_name})

        if form.is_valid():
            summoner = get_object_or_404(
                Summoner, user__username=request.user.username)
            uploaded_file = form.cleaned_data['json_file']
            import_options = _get_import_options(form.cleaned_data)

            if form.cleaned_data.get('save_defaults'):
                summoner.preferences['import_options'] = import_options
                summoner.save()

            try:
                data = json.load(uploaded_file)
            except ValueError as e:
                errors.append('Unable to parse file: ' + str(e))
            except AttributeError:
                errors.append('Issue opening uploaded file. Please try again.')
            else:
                schema_errors, validation_errors = validate_sw_json(
                    data, request.user.summoner)

                if schema_errors:
                    errors.append(schema_errors)

                if validation_errors:
                    validation_failures += validation_errors

                if not errors and (not validation_failures or import_options['ignore_validation_errors']):
                    # Queue the import
                    task = com2us_data_import.delay(
                        data, summoner.pk, import_options)
                    request.session['import_task_id'] = task.task_id

                    return render(
                        request,
                        'herders/profile/import_export/import_progress.html',
                        context={'profile_name': profile_name}
                    )
    else:
        form = ImportSWParserJSONForm(
            initial=request.user.summoner.preferences.get('import_options', {})
        )

    context = {
        'profile_name': profile_name,
        'form': form,
        'errors': errors,
        'validation_failures': validation_failures,
        'view': 'importexport',
    }

    return render(request, 'herders/profile/import_export/import_sw_json.html', context)

@username_case_redirect
@login_required
def import_status(request, profile_name):
    task_id = request.GET.get('id', request.session.get('import_task_id'))
    task = AsyncResult(task_id)

    if task:
        try:
            return JsonResponse({
                'status': task.status,
                'result': task.result,
            })
        except:
            return JsonResponse({
                'status': 'error',
            })
    else:
        raise Http404('Task ID not provided')

@username_case_redirect
@login_required
def export_win10_optimizer(request, profile_name):
    summoner = get_object_or_404(Summoner, user=request.user)

    export_data = export_win10(summoner)

    response = HttpResponse(export_data)
    response['Content-Disposition'] = f'attachment; filename={request.user.username}_swarfarm_win10_optimizer_export.json'

    return response

def _get_stats_summary(summoner):
    report = {
        "runes": {},
        "artifacts": {},
        "monsters": {
            'Count': MonsterInstance.objects.filter(owner=summoner).count() + (MonsterShrineStorage.objects.filter(owner=summoner).aggregate(count=Sum('quantity'))['count'] or 0),
            'Nat 5⭐': MonsterInstance.objects.filter(owner=summoner, monster__natural_stars=5).count(),
            'Nat 4⭐': MonsterInstance.objects.filter(owner=summoner, monster__natural_stars=4).count(),
        },
    }
    runes_summoner_eff = _get_efficiency_statistics(
        RuneInstance, summoner, count=True, worth=True)
    for key in runes_summoner_eff.keys():
        report["runes"][key] = runes_summoner_eff[key]

    artifacts_summoner_eff = _get_efficiency_statistics(
        ArtifactInstance, summoner, count=True)
    for key in artifacts_summoner_eff.keys():
        report["artifacts"][key] = artifacts_summoner_eff[key]

    monsters_shrine = MonsterShrineStorage.objects.select_related(
        'owner', 'item').filter(owner=summoner, item__natural_stars__gte=4)
    for monster in monsters_shrine:
        report['monsters'][f'Nat {monster.item.natural_stars}⭐'] += monster.quantity or 0

    return report

@username_case_redirect
@login_required
def stats(request, profile_name):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if not is_owner:
        return render(request, 'herders/profile/not_public.html', {})

    context = {
        'is_owner': is_owner,
        'profile_name': profile_name,
        'stats': _get_stats_summary(summoner),
        'view': 'stats',
        'subviews': {type_[1]: slugify(type_[1]) for type_ in RuneCraft.CRAFT_CHOICES},
    }

    return render(request, 'herders/profile/stats/summary.html', context)

def _get_stats_runes(summoner):
    stats = {stat[1]: 0 for stat in sorted(
        Rune.STAT_CHOICES, key=lambda x: x[1])}
    qualities = {quality[1]: 0 for quality in Rune.QUALITY_CHOICES}
    qualities[None] = 0
    report_runes = {
        'summary': {
            'Count': 0,
            'Worth': 0,
        },
        'stars': {
            6: 0,
            5: 0,
            4: 0,
            3: 0,
            2: 0,
            1: 0,
        },
        'sets': {rune_set[1]: 0 for rune_set in sorted(Rune.TYPE_CHOICES, key=lambda x: x[1])},
        'quality': copy.deepcopy(qualities),
        'quality_original': copy.deepcopy(qualities),
        'slot': {
            1: 0,
            2: 0,
            3: 0,
            4: 0,
            5: 0,
            6: 0,
        },
        'main_stat': copy.deepcopy(stats),
        'innate_stat': copy.deepcopy(stats),
        'substats': copy.deepcopy(stats),
    }
    report_runes['innate_stat'][None] = 0
    runes = RuneInstance.objects.select_related('owner').filter(owner=summoner)

    rune_substats = dict(Rune.STAT_CHOICES)

    report_runes['summary']['Count'] = runes.count()
    for rune in runes:
        for sub_stat in rune.substats:
            report_runes['substats'][rune_substats[sub_stat]] += 1

        report_runes['stars'][rune.stars] += 1
        report_runes['sets'][rune.get_type_display()] += 1
        report_runes['quality'][rune.get_quality_display()] += 1
        report_runes['quality_original'][rune.get_original_quality_display()] += 1
        report_runes['slot'][rune.slot] += 1
        report_runes['main_stat'][rune.get_main_stat_display()] += 1
        report_runes['innate_stat'][rune.get_innate_stat_display()] += 1
        report_runes['summary']['Worth'] += rune.value or 0

    summoner_eff = _get_efficiency_statistics(RuneInstance, summoner)
    for key in summoner_eff.keys():
        report_runes["summary"][key] = summoner_eff[key]

    return report_runes

@username_case_redirect
@login_required
def stats_runes(request, profile_name):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if not is_owner:
        return render(request, 'herders/profile/not_public.html', {})

    context = {
        'is_owner': is_owner,
        'profile_name': profile_name,
        'runes': _get_stats_runes(summoner),
        'view': 'stats',
        'subviews': {type_[1]: slugify(type_[1]) for type_ in RuneCraft.CRAFT_CHOICES},
    }

    return render(request, 'herders/profile/stats/runes/base.html', context)

def _get_stats_rune_crafts(summoner, craft_type):
    if craft_type in RuneCraft.CRAFT_GRINDSTONES:
        stats = {stat[1]: 0 for stat in sorted(
            RuneCraft.STAT_CHOICES, key=lambda x: x[1]) if stat[0] in RuneCraft.STAT_GRINDABLE}
    else:
        stats = {stat[1]: 0 for stat in sorted(
            RuneCraft.STAT_CHOICES, key=lambda x: x[1])}
    sets = {rune_set[1]: 0 for rune_set in sorted(
        RuneCraft.TYPE_CHOICES, key=lambda x: x[1])}
    sets[None] = 0
    qualities = {quality[1]: 0 for quality in RuneCraft.QUALITY_CHOICES}
    report = {
        'sets': copy.deepcopy(sets),
        'quality': copy.deepcopy(qualities),
        'stat': copy.deepcopy(stats),
        'summary': {
            'Count': 0,
            'Worth': 0,
        },
        'detailed': {
            stat: {
                "total": 0,
                "sets": {
                    set_: {"total": 0, "qualities": copy.deepcopy(qualities)}
                    for set_ in sets.keys() if set_ is not None
                }
            }
            for stat in stats.keys()},
    }
    rune_crafts = RuneCraftInstance.objects.select_related(
        'owner').filter(owner=summoner, type=craft_type)

    for record in rune_crafts:
        set_ = record.get_rune_display()
        quality = record.get_quality_display()
        stat = record.get_stat_display()

        report['summary']['Count'] += record.quantity or 0
        report['sets'][set_] += record.quantity or 0
        report['quality'][quality] += record.quantity or 0
        report['stat'][stat] += record.quantity or 0

        if record.value:
            report['summary']['Worth'] += record.value * record.quantity or 0

        if set_:
            report['detailed'][stat]['total'] += record.quantity or 0
            report['detailed'][stat]['sets'][set_]["total"] += record.quantity or 0
            report['detailed'][stat]['sets'][set_]["qualities"][quality] += record.quantity or 0

    return report

@username_case_redirect
@login_required
def stats_rune_crafts(request, profile_name, rune_craft_slug):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if not is_owner:
        return render(request, 'herders/profile/not_public.html', {})

    craft_types = {slugify(type_[1]): {"idx": type_[0], "name": type_[
        1]} for type_ in RuneCraft.CRAFT_CHOICES}
    craft_type = craft_types.get(rune_craft_slug, None)
    if craft_type is None:
        return HttpResponseBadRequest()

    context = {
        'is_owner': is_owner,
        'profile_name': profile_name,
        'crafts': _get_stats_rune_crafts(summoner, craft_type["idx"]),
        'craft_type': craft_type['name'],
        'immemorial': 'Immemorial' in craft_type['name'],
        'view': 'stats',
        'subviews': {type_[1]: slugify(type_[1]) for type_ in RuneCraft.CRAFT_CHOICES},
    }

    return render(request, 'herders/profile/stats/runes/crafts.html', context)

def _get_stats_artifacts(summoner):
    qualities = {quality[1]: 0 for quality in Artifact.QUALITY_CHOICES}
    report = {
        'summary': {
            'Count': 0,
        },
        'quality': copy.deepcopy(qualities),
        'quality_original': copy.deepcopy(qualities),
        'slot': {artifact_slot[1]: 0 for artifact_slot in (Artifact.ARCHETYPE_CHOICES + Artifact.NORMAL_ELEMENT_CHOICES)},
        'main_stat': {stat[1]: 0 for stat in sorted(Artifact.MAIN_STAT_CHOICES, key=lambda x: x[1])},
        'substats': {effect[1]: 0 for effect in sorted(Artifact.EFFECT_CHOICES, key=lambda x: x[1])},
    }
    artifacts = ArtifactInstance.objects.select_related(
        'owner').filter(owner=summoner)

    artifact_substats = dict(Artifact.EFFECT_CHOICES)

    report['summary']['Count'] = artifacts.count()
    for artifact in artifacts:
        for sub_stat in artifact.effects:
            report['substats'][artifact_substats[sub_stat]] += 1

        report['quality'][artifact.get_quality_display()] += 1
        report['quality_original'][artifact.get_original_quality_display()] += 1
        report['slot'][artifact.get_precise_slot_display()] += 1
        report['main_stat'][artifact.get_main_stat_display()] += 1

    summoner_eff = _get_efficiency_statistics(ArtifactInstance, summoner)
    for key in summoner_eff.keys():
        report["summary"][key] = summoner_eff[key]

    return report

@username_case_redirect
@login_required
def stats_artifacts(request, profile_name):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if not is_owner:
        return render(request, 'herders/profile/not_public.html', {})

    context = {
        'is_owner': is_owner,
        'profile_name': profile_name,
        'artifacts': _get_stats_artifacts(summoner),
        'view': 'stats',
        'subviews': {type_[1]: slugify(type_[1]) for type_ in RuneCraft.CRAFT_CHOICES},
    }

    return render(request, 'herders/profile/stats/artifacts/base.html', context)

def _get_stats_artifact_crafts(summoner):
    report = {
        'summary': {
            'Count': 0,
        },
        'quality': {quality[1]: 0 for quality in Artifact.QUALITY_CHOICES},
        'slot': {artifact_slot[1]: 0 for artifact_slot in (Artifact.ARCHETYPE_CHOICES + Artifact.NORMAL_ELEMENT_CHOICES)},
        'substats': {effect[1]: 0 for effect in sorted(Artifact.EFFECT_CHOICES, key=lambda x: x[1])},
    }
    artifacts = ArtifactCraftInstance.objects.select_related(
        'owner').filter(owner=summoner)

    for artifact in artifacts:
        report['substats'][artifact.get_effect_display()] += artifact.quantity or 0
        report['quality'][artifact.get_quality_display()] += artifact.quantity or 0
        report['slot'][artifact.get_archetype_display(
        ) or artifact.get_element_display()] += artifact.quantity or 0
        report['summary']['Count'] += artifact.quantity or 0

    return report

@username_case_redirect
@login_required
def stats_artifact_crafts(request, profile_name):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if not is_owner:
        return render(request, 'herders/profile/not_public.html', {})

    context = {
        'is_owner': is_owner,
        'profile_name': profile_name,
        'artifact_craft': _get_stats_artifact_crafts(summoner),
        'view': 'stats',
        'subviews': {type_[1]: slugify(type_[1]) for type_ in RuneCraft.CRAFT_CHOICES},
    }

    return render(request, 'herders/profile/stats/artifacts/crafts.html', context)

def _get_stats_monsters(summoner):
    report = {
        'summary': {
            'Count': 0,
            'In Storage': 0,
            'Outside Storage': 0,
            'Max Skillups': 0,
            'Fusion Food': 0,
            'In Monster Shrine Storage': 0,
        },
        'stars': {
            1: 0,
            2: 0,
            3: 0,
            4: 0,
            5: 0,
            6: 0,
        },
        'natural_stars': {
            i: {
                "fusion": {
                    "elemental": 0,
                    "ld": 0,
                },
                "nonfusion": {
                    "elemental": 0,
                    "ld": 0,
                },
            } for i in range(1, 6)},
        'elements': {element[1]: 0 for element in Monster.NORMAL_ELEMENT_CHOICES},
        'archetypes': {archetype[1]: 0 for archetype in Monster.ARCHETYPE_CHOICES},
    }
    monsters = MonsterInstance.objects.select_related('owner', 'monster', 'monster__awakens_to', 'monster__awakens_from',
                                                      'monster__awakens_from__awakens_from', 'monster__awakens_to__awakens_to').prefetch_related('monster__skills').filter(owner=summoner)
    monsters_fusion = [
        f'{mon.product.family_id}-{mon.product.element}' for mon in Fusion.objects.select_related('product').only('product')]
    free_nat5_families = [19200, 23000, 24100, 24600, 1000100, 1000200]

    report['summary']['Count'] = monsters.count()
    for monster in monsters:
        if monster.monster.archetype == Monster.ARCHETYPE_MATERIAL:
            report['summary']['Count'] -= 1
            continue

        if monster.in_storage:
            report['summary']['In Storage'] += 1
        else:
            report['summary']['Outside Storage'] += 1
        if monster.skill_ups_to_max() == 0:
            report['summary']['Max Skillups'] += 1
        report['stars'][monster.stars] += 1

        mon_el = "elemental" if monster.monster.element in [
            Monster.ELEMENT_WATER, Monster.ELEMENT_FIRE, Monster.ELEMENT_WIND] else "ld"
        if f'{monster.monster.family_id}-{monster.monster.element}' in monsters_fusion or monster.monster.family_id in free_nat5_families:
            report['natural_stars'][monster.monster.natural_stars]['fusion'][mon_el] += 1
        else:
            report['natural_stars'][monster.monster.natural_stars]['nonfusion'][mon_el] += 1

        report['elements'][monster.monster.get_element_display()] += 1
        report['archetypes'][monster.monster.get_archetype_display()] += 1

        if monster.monster.fusion_food:
            report['summary']['Fusion Food'] += 1

    monsters_shrine = MonsterShrineStorage.objects.select_related(
        'owner', 'item').filter(owner=summoner)

    for monster in monsters_shrine:
        if monster.item.archetype == Monster.ARCHETYPE_MATERIAL:
            continue

        report['summary']['Count'] += monster.quantity or 0
        report['summary']['In Monster Shrine Storage'] += monster.quantity or 0
        report['stars'][monster.item.natural_stars] += monster.quantity or 0

        mon_el = "elemental" if monster.item.element in [
            Monster.ELEMENT_WATER, Monster.ELEMENT_FIRE, Monster.ELEMENT_WIND] else "ld"
        if f'{monster.item.family_id}-{monster.item.element}' in monsters_fusion or monster.item.family_id in free_nat5_families:
            report['natural_stars'][monster.item.natural_stars]['fusion'][mon_el] += monster.quantity or 0
        else:
            report['natural_stars'][monster.item.natural_stars]['nonfusion'][mon_el] += monster.quantity or 0

        report['elements'][monster.item.get_element_display()
                           ] += monster.quantity or 0
        report['archetypes'][monster.item.get_archetype_display()
                             ] += monster.quantity or 0

    return report

@username_case_redirect
@login_required
def stats_monsters(request, profile_name):
    try:
        summoner = Summoner.objects.select_related(
            'user').get(user__username=profile_name)
    except Summoner.DoesNotExist:
        return HttpResponseBadRequest()

    is_owner = (request.user.is_authenticated and summoner.user == request.user)

    if not is_owner:
        return render(request, 'herders/profile/not_public.html', {})

    context = {
        'is_owner': is_owner,
        'profile_name': profile_name,
        'monsters': _get_stats_monsters(summoner),
        'view': 'stats',
        'subviews': {type_[1]: slugify(type_[1]) for type_ in RuneCraft.CRAFT_CHOICES},
    }

    return render(request, 'herders/profile/stats/monsters/base.html', context)

@username_case_redirect
@login_required
def set_consent(request):
    data = request.POST
    c_report = (data['consent-report'] == 'true')
    c_top = (data['consent-top'] == 'true')

    summoner = request.user.summoner
    summoner.consent_report = c_report
    summoner.consent_top = c_top
    summoner.save()

    return redirect(request.META.get('HTTP_REFERER'))

redpajama_set_name: RedPajamaGithub


text:
Producer Says 'Bachelor...
Bachelor, Bachelor Pad
Producer Says 'Bachelor Pad' Will Probably Return in 2014!
Oh, yeah…this is happening again, people!
It looks like the reality gods are shining down on us, my fellow lovers of bad TV!
Mike Fleiss, the man behind The Bachelor and The Bachelorette, gave us hope that we haven't seen the last of Bachelor Pad! The producer recently let it slip to Entertainment Weekly that the show's cancellation may not be permanent!
"I thought it might be good to give it a break for a little while — let the fans starve for it a little bit so that next summer when it comes back…I have a good feeling it will be back next summer," he said.
Yes, kids, this means that we may have many more summer nights of sitting in front of our TVs watching some douchebag argue about how some other douchebag is more of a douche than him, all while banging some girl in the STD-filled hot tub! Yesssss!
There will be no 'Bachelor Pad' this summer, as The Ashley told you a few months back. Apparently, Mike Fleiss had a good reason for nixing the 2013 season of the show.
"I really wanted to give it a break because I did not feel like we had enough superstars to populate the pad," he told Entertainment Weekly.
By 'superstars' he means people that make it interesting to watch. For example, who didn't enjoy watching Ed Swiderski's drunken hi-jinks? Or Vienna Girardi and Kasey "Guard and Protect Your Heart" Kahl's epic fights/cry-fests? Hearing Fleiss say this lets the guys currently being featured on Desiree Hartsock's season of 'The Bachelorette' know that they'll need to step it up a bit in the trainwreck department if they hope to land a spot on 'The Pad' in 2014!
Tags: Bachelor Pad, Bachelor Pad 2014, Mike Fleiss, Summer Reality Shows


Chances are you've already heard Sydney Voice Over Artist and Actress Katherine Hynes. Having voiced leading national and international brands, she's helped you choose which car to drive, where to bank, and what shampoo to use. She's even helped thousands of Australians fall in love.
Katherine's natural, warm, knowledgable and trustworthy tones are ideal for television and radio advertising, TV and radio promos, narration, and corporate reads. As a TV and film actress with 20 years experience in Australia and the US, clients delight in her ability to take direction and add depth and nuance to scripts. One moment she's the smooth and grounded 'voice of reason'... next, she's 'having-coffee-with-a-friend' conversational.
Katherine is experienced in ADR, and post sync of international TVCs for the local market. US clients please note she is SAG eligible with US and Australian citizenships/passports.
Our clients say her professional relaxed demeanor make her a dream to work with.
To hire Katherine Hynes for your project, click now on the 'book Katherine' button located on the right.
Listen to Katherine's Demos by clicking the links below.


It is compulsory in accordance with your franchise agreement that the Public Liability Insurance is obtained via Jim's.
We also have a partnership with Real Insurance for Home and Car Insurance.
Please click the banners below to obtain a quote, or click on the relevant link on the right side of this page.


Add: Mine Thauk Village, Inle, Nyaung Shwe, Shan State, Myanmar.
Inle Lake is stunning and to appreciate the extensive natural waterways from the lake shores of Aureum Resort and Spa offers unsurpassed luxury accommodation of villas built over the waters and shores of one of Myanmar's most stunning natural and cultural wonders, Inle Lake.
Each expansive villa is elegantly decorated with generous space for bathroom and lotus ponds and lavishly equipped with amenities. With private outdoor terrace for viewing a spectacular sunset over the lake and hills beyond, Aureum Resort is the perfect location in which to explore the wonders of this unique destination.
Add: Inlay Lake, Nyaung Shwe T/S, Southern Shan State, Republic of the Union of Myanmar.
Inle Resort is blessed with a vantage location in a unique tourist destination but beyond the physical hardware of the resort, the distinctive difference that sets it apart from its competitors must be the Resort Management and the Employees. Every senior manager at "Inle Resort & Spa" comes with operating experience from international hotels in Myanmar backed by an experienced Yangon Sales & Reservations Team for effective customer relationship management.
You can expect the highest standards of service at "Inle Resort & Spa", as you would have from the "Mandalay City Hotel" for this inimitable culture sets us apart from our competitors; an intangible quality that keeps our valued guests returning again and again and drives us to deliver the best service and value in the industry..
Villa Inle Resort & Spa, a brand new deluxe Hotel in Inle Lake, the culture and Nation icon of Myanmar.
Spread over more than 20 acres on the eastern fringe of Inle Lake in Nyaung Shwe township. Our boutique hotel features 27 secluded lakeside villas, and is the ideal choice for those seeking a unique experience, away from mass-market tourism.
All villas at Villa Inle Resort & Spa are designed to harmoniously blend in with the natural environment of the Lake. Featuring hand-selected local paintings, high wooden ceilings, and spacious living areas and bathrooms, they radiate a sensation of luxury and comfort.
All rooms of this Spa Resort include every facilities a modern traveller expects–king size beds, air conditioning with heating facility, LCD television and WiFi access – while the lakefront balconies and floor-to-ceiling windows create a sense of intimacy with the natural environment of Inle lake, Myanmar. From your villa, you can watch as fishermen glide by on the lake, and flocks of migratory and native birds take off from the surrounding treetops. Villa Inle resort & Spa, which feature thousands of native trees and plants of Inle Lake, are framed by both the lake and the mountains of Shan State. To enhance the sense of seclusion and privacy and also reduce our hotel impact on the environment, we have deliberately kept the number of rooms in the hotel to a minimum.
When not exploring the Lake, allow our highly trained spa therapists to pamper you in our " Inle Spa ". It's guaranteed to rejuvenate and invigorate mind, body and soul.
Our hotel restaurant and bar is the ideal place to unwind at the end of the day, sipping a cocktail or eating the Shan or Inlelake traditional food as the sun sets above the lake.
While many guests visiting Myanmar spend only one or two days at Inle Lake, we encourage visitors to take their holiday at a more leisurely pace in order to better appreciate the beauty of this amazing Shan Hills as well as the Spa Resort itself. With an emphasis on individuality and luxury, Villa Inle Resort & Spa caters to those looking for an exclusive and unique experience – one that cannot be found anywhere else in Myanmar except Inle Lake.
The InleLake View Resort & Spa is the only deluxe boutique Hotel of international standard on the shores of Inle Lake, built on 25 acres of lush land of trees and flowers, ideally located in a picturesque area overlooking the Inle lake.
?The resort is just 30 minutes drive from the Heho's airport and with direct access to the lake from the Hotel jetty.?
The Inle lake is one of the chief tourist attractions of Northern Myanmar. Inle means 'small lake', implying that there is a larger lake. It is the second largest lake in Myanmar, the largest being Indawgyi. Roughly speaking ,it is about eight miles long and three miles broad. It lies over 2900 ft. above sea level and is surrounded by mountains. Hence, you can imagine bow beautiful it will be.
Tourists visit Bagan to study its ancient pagodas that constitute architectural and artistic wonders. But they go to Inle to enjoy peace, quiet, fine weather and natural beauty. There must be few places indeed that can beat inle in providing rest and recreation to travel-weary tourists. Life is leisurely there and time doesn't fly, but crawls! Speed boating across a vast, clear and calm expanse of water among blue, mountain ranges itself is thrilling experience rarely encountered in humdrum city life. The inle region teems with exotic sights and experiences.
An afternoon at the bungalow-above-the-water will sweep away your cares and worries for the duration of your stay in the region. One sight that will rivet your attention is a leg-rower, the most famous and unique feature of Inlay. Another unique sight is that of floating islands made up of compost and silt.
The enterprising lake-dwellers called Inthars use them as beds for vegetables and flowers. All visitors to the region are also fascinated by its famous hand-loom industry and its beautiful products. Another unusual attraction of Inlay is its floating markets. One special attraction of the region for Buddhists is the Phaungdaw Oo Pagoda where five ancient images of the Buddha reside.
The Inthars reverse the images so much that they have gilded them over and over until thy now appears to be balls of gold! The lake is especially crowded with visitors when the festival of the Pagoda is held in October featuring spectacular boat races. The pagoda is the most famous one in Northern Myanmar and Inlay is one of the regions where Buddhism flourishes to great heights. Consequently, you can find grand monasteries there with a large number of monks and novices studying and practicing Dharma-the Doctrine-in them..
Add: Nga Phe Chaung Village, Inle, Shan State.
There are 12 Traditional Inthar Style Deluxe Cottages with imposing teak-wood and delightful furnishing. Each Cottage is constructed with pure teak-wood with balconies which let you enjoy the atmosphere of the Lake from your own private terrace. This well-appointed accommodation of the Paramount Inle Resort offers modern comfort and facilities.
There are 16 Superior Teak rooms in total harmony while incorporating the Inle Lake style of architecture with all modern comforts in a tradition setting. It is your taste of paradise with magical setting.
Bath Room - 04 sqm.


Polycore Technology Co., Ltd is a complex corporation which is engaged in the products developing, manufacturing and marketing. The major business of Polycore Technology is falling in Commercial Refrigerated assembly products and light weight, high strength structure material solution. Mainly products are night blind (thermal curtain), light cover, air curtain (air flow),double curve toughened glass, refrigerant connection copper pipes, AFC Composite board applied in commercial refrigerator display showcase and light weight stiffness strength ratio structure material includes plastic honeycomb, aluminum honeycomb, paper honeycomb and so on. The employees of Polycore Technology are dedicated to bringing customers the best combination of quality products, on-time delivery and competitive pricing. Sales people and in-house service representatives help manage your project from inception through execution. We specialize in helping customers find innovative ways to improve product, uncover new applications and reduce costs. Polycore Technology provides all products with superior and stable quality, excellent service and long relationship confidence and gotten high reputation from global friends.


For almost 100 years, the ACLU has worked to defend and preserve the individual rights and liberties guaranteed by the Constitution and laws of the United States The ACLU works tirelessly in courts, legislatures, and communities.
In addition to this litigation, they are working with their affiliates to advocate for policies that make it easier for US citizens to vote, such as the expansion of same-day and online voter registration.
There will also be time for personal stories from some of our members who have witnessed or suffered from Voter Suppression.
RAFFLE: Bring extra money for a chance to win a prize.
Stay tuned for Democrats Abroad Costa Rica election announcements, new by-laws, and AGM notice.


text:
Siren Queen: A Novel
Siren Queen by Nghi Vo
Published by Tordotcom
Genres: Fiction, Fantasy, Literary
After the penetrating reality of displacement in An Unlasting Home I opted to change reading direction and dive into fantasy. My choice, Siren Queen, led me deep into a 1920s Hollywood that was at once recognizable, but darkly surreal. A world one young American Chinese woman is desperate to be a part of, but only on her own terms.
This premise alone gives Nghi Vo plenty of material, but by making the novel a fantasy she takes Siren Queen to the next level. Hollywood is one big cauldron of black magic, run by men who chew through actresses and actors alike. The goal is not to just become a star, but to have control over one's life, something very few achieve.
For Luli there is no other choice. Her family runs a laundry in Los Angeles, onerous work that keeps them one level above abject poverty. As Chinese they're unwelcome in much of LA and so seldom venture out of Chinatown. But she has no such qualms. She acknowledges that from the moment she saw her first silent movie she was "poisoned to the core by ambition and desire."
She goes beyond dreaming of the world of movies to actively making it happen—hanging out on sets, working for free as an extra. Luli finds an old actress who, for the price of 20 years off her life, tells her how to get into the office of the biggest studio head of them all and how to get him to give her a contract. What she doesn't share with Luli is what might happen if she succeeds.
Vo builds a multilayered, vivid world of the debauchery of 1920s Hollywood, when starlets were drugged, the casting couch held sway, and bright young things were used up and tossed away. Except in Siren Queen's world the metaphors are real. The chosen young women literally burn with an incandescent glow that slowly dims as they're wrung out. Nothing is real. Bodies, teeth, accents, everything is scrubbed, reshaped, and magicked into what the moviegoing public wants to see. The only way to survive is to decide which of the pipers is the right one to pay.
My only issue is that building such a multilayered stage, so replete with details, means momentum can be lost in the story. Vo's descriptions of Luli's world are visceral in their descriptiveness, but while she is fighting for her life, the urgency doesn't translate into velocity on the page. Instead, there is a languid feel to her movements that meant I was able to pick up the book and put it away for days. I never lost interest, but neither did I tear through the novel.
This results in a disconnect between the intriguing nature of the story itself and the languor on the page. Because Siren Queen is compelling. It's not just about the superficialities, but the very realness of discrimination against race and sexual preference in Hollywood at the time. Luli quickly learns everyone has a secret and as she fights to reach her dream she realizes she is even more of an outcast than she originally thought.
From there Siren Queen ripples out into darker and more insidious magic until reaching an apex where screen stars are bartering their souls away for beauty and fame. Uneven pacing aside, Vo creates a fantastical parable that expands on what was a corrupt system, rigged by men in power to stay in power.
*I received a free copy of this book from Tor in exchange for an honest review.*
3.5 Star Books
By Nghi Vo
Mexican Gothic: A Novel
Hell Hath No Fury: Mini-Reviews
Daughter of Smoke & Bone
The Leftovers by Tom Perrotta
Six Best Books of 2020
Running: A Novel by Cara Hoffman
Mirrorland: A Novel
The Blazing World
The Goldfinch by Donna Tartt
Queenie: A Novel
The Beauty of Your Face
A Girl is a Body of Water
Eligible: A Modern Retelling of Pride and Prejudice
Mothers' Week: The Island of Sea Women
The Chosen and the Beautiful
My 6 Favorite Debuts of 2021
Filed Under: Book Reviews, Fiction Tagged: 1920s, fantasy, Hollywood
Thank you for the interesting review.What makes this fantasy instead of historical fiction? I would think with the book being set in the 1920's it would be the later.
Between the setting and slow pace, and the 3 stars the book doesn't sound like it would be for me.
I don't think of it as historical fiction because nothing about it is true. It's a fantasy of black magic that happens to be set in the past.
I liked her other book, The Chosen and the Beautiful better.


Compare GiffGaff £60.68 contract plans on 14 mobile handsets.
Newly released phones on GiffGaff network for £60.68 are listed below.
Choose the best selected GiffGaff £60.68 deal on contracts tariff or compare other offers on each handset with same tariff.


Who's in?? I know I am!
Right guys time to move front and centre rather than just lookin at the thread!!! We can win this one, I feel it!!- DEATH OR GLORY!!!! Who's playing?
Sign up, your clan needs you!!!!!!
so far Me, Leon and Sky....who else?
PS - Maps are Backlot and Bloc, so get your "tactical thinking caps" on guys. Lets see if we can get on TS for around 19.00-19.15???
Thanks Sky...I missed the same round!! does anyone have the last screenshot? It should be Bloc 5-2 to TDP???
Next time we will get an all out win.
Also notice how Jay has jumped to their team at the end. Glory hunter!!


Hooray for being back to my semi-regular schedule! This past week has let me sleep in entirely too much (something I don't think I've ever worried about saying), and by the time I woke up at the crack of noon, I just didn't have the will to fend off my precious boy and get down to business. Part of that, I think, is that because I knew I wouldn't be able to start any job while I had to spend the whole week with my son (and the fact that he was too sick for us to really go out anywhere), something in my brain decided that the week was already shot, so why bother? The best I managed to accomplish was hastily thrown on pajama pants and the same T-shirt I'd been wearing the day before. It has been said that one should dress for the job he wants, not the one he has, but I wasn't dressing for either. I know that my life's ambition is to live out an existence free from the tyranny of pants, but there are children living in the apartment with me, and as the year is steadily spinning by, I am reminded of a quote most frequently attributed to Mark Twain in regard to the area in which I live, "The coldest winter I ever spent was a summer in San Francisco." This quote may have been debunked, but the sentiment holds true nonetheless.
Last week I read a wonderful article by Kate Bracy about the necessity of actually dressing like you want to get anything but lounging done throughout the day. I'd never really thought about it before, but it has hung around enough in my mind that I was inspired to put on my pants and sit down at my laptop to write this. Since coming back to California, I have been taking my son to school almost every day, and that involves dressing in such a manner as to avoid the judgment of others, calls to the authorities, and frostbitten portions of my anatomy. By the time I got back home, I would usually be caffeinated enough to pound out my thoughts in an occasionally humorous format, and toy with the notion of trying to get a nap in before I had to go back to the school to pick the Minkey up. This past week, with nothing urgent to occur before three o'clock in the afternoon, all sense of urgency was gone, and with it, decorum and my annoyingly consistent work ethic. I fell into the trap that I frequently complain to my wife about: no one was taking this writing thing seriously, and this time, I couldn't even claim the moral high ground.
To be fair, last night I was battered by a brutal case of insomnia, and only managed to steal about seven and a half winks (based on a standard conversion rate of forty winks to a full night's sleep, or five winks an hour) before I snapped wide awake again with heartburn and leg pain. I've tried reading (the problem with that is that I actually like to read, and will casually neglect sleep just to finish the next chapter (or ten, if I'm rereading Jim Butcher), listening to music (and say, this album that I haven't listened to in ages is really good!), listening to audiobooks (since no one here will read me a bedtime story), and finally succumbing to the demon of conflagratory addictions, with a cigarette or three. Amazingly, nothing has done the trick, and it's my sincere hope that I can keep it together until my wife gets back this afternoon. I know that she'll be tired, but there were plenty of times when I had to jump into Dad Mode after a long day at work (with a 3 hour commute) because she was exhausted on her day off. But honestly, it's not really the same thing, as my wife takes care of so many things with just a quiet determination, never seeking out the praise which she so richly deserves, whereas I am fairly pleased with myself if I manage to get out of bed.
The main difference between us on housework, however, is in the nature of how we react to the multiplication of filth due mostly to those also living with us. The apartment could be cleaned from top to bottom, floors swept and mopped, dishes done and put away, garbage and recycling dumped outside into their proper bins, and within a couple of hours, the whole place looks trashed again, with our kitchen sink overflowing with more dishes than it seems reasonable for so few people to have used, and the floors appear worse than before they were cleaned, as the spots of white linoleum stand out in greater contrast to the spilled drinks and tracked in fruit snacks. I am the sort of person who will do the cleaning, and wash the dishes… within reason. If the sink is empty when I go to bed, and I wake up to find a pot, two pans, five plates, a small (complete) set of flatware, and six cups in there in the morning, my first reaction is that the people who made such a production the evening before (cooking a meal for only themselves), are capable of taking care of their mess. I enter the living room in the morning to find barely touched cups of juice on the table, and an array of plates with half-eaten food, offered up like some sort of invocation to the Gods of the Cucarachas.
And so I believe that the only way to teach our adult children that they need to take care of this themselves is to refuse to do anything until either of them lifts a finger. I am a guy, and Chaos is my element of choice. I could wait out just about anybody while the world around me fell to pieces. I'm sure I could outlast the grownup kids. But this will never happen, because my wife doesn't have the will to let everything go all to hell. "Think of the children," she'll plead to me in Spanish, referring to our son and grandson. And she's right, of course, but I still think we're doing our daughter and her boyfriend a disservice by bailing them out of the sty which they've created, instead of allowing them to develop that instinct for preservation for themselves. That being said, I know myself, and I must be careful not to throw too many stones. I don't know. I think the reason I'd like to win the lottery (more than fancy houses and never having to work again) is to be able to ensure that my wife will never again be forced to worry about the cleanliness of where she's living.
Somehow I got from the necessity of pants to singing the praises of my wife. I'm not surprised, for there are many praises I have yet to sing, but I do find it fascinating just how much better of a person my wife is in comparison with me. Hers is the irresistible force, mine, the immovable object. O.C.D. versus Apathy. All bets are off on this one.


You, Presenting!® Case Interview Skills: Why I Love and Eat Bananas--Every Day!
Why I Love and Eat Bananas--Every Day!
I've heard both pros and cons about bananas in recent years. I've decided to just overlook the cons and go strictly with the pros.
Why? Am I in denial or being naive? No.
Almost everything we take into our bodies, both natural and packaged, has something in it that the 'experts' will tell us is not good for us. Whether fruits, veggies, or hotdogs, 'they' know best, right? Wrong. I will not give up my bananas or any fruit simply because someone else tells me they have too much sugar, or not enough Vitamin C, or they're low in fiber. Experts don't know everything. Bananas are simply too good to let go. And I won't!
With that, I offer this site that shares some of the powerful benefits of bananas. Your fears are hereby assuaged. Eat and be happy!
Please note: This site is part of Muscle Prodigy and this particular page addresses men's health issues but the benefits of bananas apply to both men and women. If you want more info on these bennies, simply search 'benefits of bananas' in Google or any other browser and you'll find more than you thought you'd ever want to know!


Cecile and Lorin's wedding at the Pulgas Water Temple in Redwood City. Reception was at Michael's at Shoreline in Mountain View. Harpist: Stephanie Janowski, www.harpeggio.com Videographer: Cameron, www.cameronheather.com. Check out Cam's Youtube channel! He does some really amazing wedding clips from his video footage.


REASSIGN OWNED changes the ownership of database objects owned by any of the old_roles to new_role.
The name of a role. The ownership of all the objects in the current database, and of all shared objects (databases, tablespaces), owned by this role will be reassigned to new_role.
REASSIGN OWNED is often used to prepare for the removal of one or more roles. Because REASSIGN OWNED does not affect objects in other databases, it is usually necessary to execute this command in each database that contains objects owned by a role that is to be removed.
The DROP OWNED command is an alternative that simply drops all of the database objects owned by one or more roles. DROP OWNED requires privileges only on the source role(s).
The REASSIGN OWNED command does not affect any privileges granted to the old roles for objects that are not owned by them. Use DROP OWNED to revoke those privileges.
The REASSIGN OWNED command is a Greenplum Database extension.


text:
Dept of Marketing Management opens Incubator Center, Language Center and Mini Digitized Library
31st August 2020Management & Commerce, News
The Department of Marketing Management being one of the leading and innovative departments in the Faculty of Management Studies and Commerce of the University of Sri Jayewardenepura, launches a new venture by establishing a Business Incubator Center, Digitalized Library and a Language Center. All these centres are funded the World Bank ELTA/ELSE project which was...
46th Convocation of University of Sri Jayewardenepura – Notice to FMSC Graduands
28th August 2020Convocation, Management & Commerce, News
46th Convocation of the University of Sri Jayewardenepura will be held on 2nd & 3rd November 2020 at the Bandaranaike Memorial International Conference Hall for the conferment of degrees. Eligible first degree graduands of the Faculty of Management Studies & Commerce are required to handover the completed convocation application forms as the following schedule to...
28th August 2020Academic, Vacancies
The University of Sri Jayewardenepura invites applications from prospective candidates for vacancies as indicated below. Faculty of Humanities and Social Sciences POST OF SENIOR PROFESSOR/ PROFESSOR Department of Sociology POST OF SENIOR PROFESSOR The application should be accomplished with the following in terms of the University Grants Commission Circular 05/2015 dated...
Researchers at the Centre for Dengue Research, USJ awarded grant for to combat arboviral disease
27th August 2020News, Research
Prof. Neelika Malavige and Dr. Chandima Jeewandara from USJ are to launch the Asian and American Center for Arbovirus Research and Enhanced Surveillance program at the Centre for Dengue Research, University of Sri Jayewardenepura Researchers at the Centre for Dengue Research at the University of Sri Jayewardenepura received funding from the National Institute of Allergy...
Two New Departments of the FHSS Gazetted
27th August 2020Humanities and Social Science, News
Two new departments; The Department of Music and Creative Technology and the Department of Information and Communication Technology that will be added as 15th and 16th departments of the Faculty of Humanities and Social Sciences have been gazetted by Gazette extraordinary on 30th July 2020. Read Sinhala Gazette>> Read English Gazette>>
Faculty of Management Studies and Commerce – Examinations for the First Year & Third Year
27th August 2020Management & Commerce, News
For all students sitting for the 1st & 3rd year examinations, This is to bring to your notice that the First Year & Third Year First Semester End Examination are rescheduled to be held from 07.09.2020 onwards. Study leave for students will be granted from 31.08.2020 to 06.09.2020. Therefore, while you are requested to prepare...
46th Convocation of the University of Sri Jayewardenepura – Notice to FAS Graduands
27th August 2020Applied Sciences, Convocation, News
46th Convocation of the University of Sri Jayewardenepura will be held on 02nd & 03rd November 2020 at the Bandaranaike Memorial International Conference Hall for the conferment of degrees. Eligible first degree graduands of the Faculty of Applied Sciences are required to handover the completed convocation application forms as the following schedule to the Examinations...
Vacancy for the post/s of Temporary Assistant Lecturer (Tutor) in 2020 Department of English and Linguistics, USJ
27th August 2020Vacancies
Expressions of Interest are invited for an interview/s to consider graduates' suitability for the post/s of Temporary Assistant Lecturer (aka Tutor), Department of English and Linguistics, University of Sri Jayewardenepura, for a period of one year, as per the following preliminary requirements Candidates graduated in the academic years 2019 or 2020 with Second Class Upper...
Deepest Sympathy in Regards to the Demise of Former Dean of FHSS, Prof. Stanly Silva
24th August 2020News
The University of Sri Jayawardenepura wishes to express its deepest sympathy in regards to the demise of former dean of the Faculty of Humanities and Social Sciences and Professor (Retired) at the Department of Social Statistics; Prof. Stanly Silva. The remains lie at No. 402/8, 6th Lane, Bogahawila Road, Kottawa. The funeral will take place...
USJ joins the Efforts to Digitize PCR Test Report Generation
Department of Computer Science, Faculty of Applied Sciences, University of Sri Jayewardenepura, in collaboration with EchonLabs (Private) Limited developed, deployed and donated a comprehensive cloud-based Laboratory Information Management System to the Molecular Diagnostic Laboratory at the Infectious Diseases Hospital (IDH), Angoda, Sri Lanka. This project was coordinated by Dr. Ravindra De Silva (Senior Lecturer) from...


In Brighton there is a place called 'The Royal Pavillion'. It was magnificent on the outside... Inside? .. wow... Unfortunately we weren't allowed to take pictures, but just let me say this: 'here be dragons' doesn't cover it.
rené: Are you sure we're in the right country at all?


Faithful 15 year old Border Collie.
All my work is printed individually for each order by the best printer I have found. No image will have more than 150 prints, each accompanied by a Certificat of Authenticity signed by myself.


text:
Scholarships & Funds
Class Gift
Impact of Your Support
A named fund becomes a forever symbol of the bond between the Institute, the individual who is honored, and those who loved the individual.
Honor an individual or the memory of a loved one by establishing a permanently endowed fund in his or her name.
Endowment funds can be established to support excellence throughout the Institute. Donors may specify the purpose for which an endowed fund is to be used, in accordance with institutional needs and policy. Some examples are:
Programs, centers, and departments
Teaching, research, and projects
Through an endowed fund, the donor transfers assets to the Institute, which are carefully managed in conjunction with Partners Treasury to protect the principal as a long-term investment, while distributing income each year for the purpose specified.
An endowed fund may be built over several years, and additional gifts may be added to an endowed fund at any time.
A minimum of $50,000 is required to establish an endowed fund.
Current Use Funds
A current use fund provides another opportunity to create a named fund. It differs from an endowed fund in that the gift is available for use in the fiscal year in which the Institute receives the gift.
A current use fund can be used to support scholarship or a particular program, center, or project. A current use fund can be funded with an outright gift or through a planned gift or bequest.
The minimum amount to establish a current use fund is $10,000.
Your gifts help create opportunity and success.
Our alumni, students, community partners, and friends play an integral part to help carry out our mission to prepare tomorrow's healthcare leaders.