text:
Iran: IRGC-linked credit firm clients demanding stolen money returned
Clients of Iran's IRGC-linked Caspian credit firm rallying outside the Central Bank in Tehran – May 15, 2019
Iran, May 15, 2019 - Clients of the Caspian credit firm, linked to the Iranian regime's Revolutionary Guards (IRGC), held a protest rally on Wednesday outside the mullahs' Central Bank demanding their stolen money and savings returned.
The protesters were holding signs reading:
"State media is controlled by thieves; We can only voice our demands in the streets."
The protesters were also seen chanting:
"We have been expressing our demands for three years; Haven't seen one person who listens."
"Only our country has such massive cases of embezzlement"
"Only in our country justice becomes a joke"
"Only in our country, the court system becomes meaningless"
"Only in our country, the wealth is being plundered on a national scale"
"Only in our country cruelty is actually supported"
"Neither the judges nor the state, no one cares about the people"
Caspian credit firm clients rallying in Tehran, Iran
Caspian credit firm clients protesting outside the regime's Central Bank – Tehran, Iran
The term "deposit losers" in Iran is a new socioeconomic expression. This term is said to be a part of the Iranian people whose financial deposits have been deposited by governmental financial institutions or other approved organizations for buying a home or a vehicle, etc. but have not been returned to them and even illegally blocked. Hence, these people are called Deposit losers. But the concept recently used by these people themselves is "looted", which is a more precise expression of this phrase. These financial and credit institutions are affiliated with the Revolutionary Guards and other military and civilian organizations of the Iranian regime.
Currently, the "looted" movement in Iran has become a mass movement in cities such as Tehran, Rasht, Mashhad, and others that are taking place in the form of protests, sit-ins and marches against the economic corruption in Iran's banking system or government institutions and banks.
This movement, which was initially just a guild movement, began to develop itself as a political movement right after the expansion of protests and the lack of accountability of Iranian regime officials to the people whose property was plundered, and with slogans against Hassan Rouhani's government, became more radicalized.
The history of private financial institutions in the Iranian Regime
The state-owned ISNA news agency wrote on June 5, 2017:
"There are now 7,000 credit institutes in operation. Licenses issued by the Central Bank for credit institutes indicate that more than 6,000 of these institutions did not have any permission from the Central Bank which is responsible to monitor the market activity."
ISNA then concludes: "The cluster of credit institutions, money exchanges, leasing agencies, cash holders and credit cooperatives including unauthorized credit institutions, especially unauthorized banks, over the past few years are considered as a factor of disorder in the banking system."
Protests by looted customers of Iranian credit institutions
What is the law of the regime itself in this regard?
According to the rules of the Iranian regime, "getting people's money as a deposit" and then refusing to return it, in the field of law and criminal act, is considered as robbery and betrayal in trust and it will have a penalty.
But so far, the problem is that none of the institutions or banks that stole the deposit of these people have been punished or tried under the law.
According to Iran's criminal code, what has happened to "financial institutions" regarding people's deposited money, whether it is considered as robbery or treachery in lending or both, can be subject to legal penalties.
When did these banking institutions find legal standing?
The legalization of Iranian credit institutions was approved during the Islamic Consultative assembly in 2004 under the presidency of Mohammad Khatami.
According to Valiollah Saif, former chairman of the Central Bank of Iran, these unauthorized financial institutions were formed in the 90s and 2000s. On July 10, 2017, he told the IRNA news agency, "As I have repeatedly said, unlawful institutions are an issue inherited from previous governments and I and my colleagues in the Central Bank were just the heirs of this disastrous situation. In fact, the history of the development of such institutes is largely due to the decades of the 90s and 2000s. At that time, the Ministry of Cooperatives issued credentials as credit cooperatives. The police (Nirooy-e-Entezami) also issued permits for loan funds (Sandughhay-e-Gharzolhasane)
"Unfortunately, some profitable individuals, with permissions from unrelated institutions, have taken actions that have caused disruption in recent years. These people, in the absence of being monitored by the relevant authorities and institutions, mistreated public trust and turned their limited activity into major and quasi-bank activities, adding daily to its volume.
"And since the founders and shareholders of unauthorized institutions did not specialize in banking, they only borrowed the deposits by unusual methods using deceptive promises and offering attractive benefits. The managers of illegal institutions accumulated losses on their deposits with a promise of higher returns on deposits and lending to previous deposits from new deposits, and this resulted in a large percentage of the original deposits to be lost."
The scale of financial corruption and competition of "banks" with unauthorized institutions
State-run IRNA news agency wrote on July 10, 2017: "Unauthorized financial institutions have been trying to attract the bank customers with any kind of tricks, including promises of big profits and so on. On the other hand, in a vulgar market reaction, major banks were also found to be in a disproportionate competition to keep thousands of billions of rials of liquidities out of their resources."
But those who lost their investments in this trap are not the big banks, but the depositors, or in other words the "looted" who deposited all their savings in these banks and financial institutions.
According to Hossein Ali Haji Daligani, MP:
"People are worried because about 20 million of the population of this country are involved in various institutions such as Caspian, Fereshtegan, Arman, Samen, and others. The current condition of these credit institutions causes them to be unable to refund people's deposits. Their answer is that since they've deposited their money right after 2017, whatever they have earned or deposited is considered as the initial deposit, or in other words, the capital market is at stake." (Government news agency Tasnim, July 11, 2019)
"Iran" newspaper wrote about such financial institutions:
"According to information provided by the Central Bank over the years in which the Central Bank has been the subject of oversight of financial and credit institutions, nearly 6,000 institutions have been established with the permission of other organizations. During this period, police(Niruy-e-Entezami) has issued licenses for 5,000 mortgage funds, also the Ministry of Cooperatives has issued licenses to 1000 cooperatives."
Based on the report of this government newspaper, some of these unauthorized institutions, which according to the law were obliged to obtain a license from Central Bank, had thousands of branches across the country, attracting millions of depositors, and taking hold of part of the country's liquidity.
According to "Iran" newspaper: "One of the most famous and largest unauthorized financial and credit institutions was 'Mizan,' which was established with the congregation of some judiciary retirees!"
There are two responsible groups in the current state of banks and the financial and economic crisis in the country:
In an article on July 17, 2017, the government website "Tasnim," affiliated to the terrorist Quds Force of the Revolutionary Guards, quoted Abdul Hussein Khosrowpanah, a cleric teaching at the seminary:
"Today, these banks are confronting the country and paralyzing the economy. There are two groups who are responsible in the current situation of banks and the financial and economic crisis in the country, and should be held accountable:
"First, some jurists who regularly pass religious justifications for loans and bank profits and judge on the validity (legality) of these activities by using jurisprudential titles, and sometimes disguise themselves behind religious reasonings to justify themselves and close their eyes to the negative effects of banking activities.
"The second group is some of the country's economists who gain their own profit from their private organizations and companies by providing large amounts of loans and profits which bring them many benefits.
"I said something a year ago which some people didn't like it and it was the fact that this 'jurisprudence' is in the service of the capitalist system; the meaning of that is that the jurisprudence of this group of jurists serves the capitalist system of those mentioned economists ... I hope that before the banking system of the country hurts the legitimate system of the Islamic Republic, we address the problems ... and save the economy of the country from collapse."
State-run Khabar Online website also wrote in this regard: "The biggest shareholder of this illegal group is the Revolutionary Guard Corps and Basij and their own banks."
The most famous legal and illegal financial institutions in Iran
Some of the most famous institutes that can be mentioned here are:
Institutions that were created before approving the Act of the Uncoordinated Monetary Market Regulation in 2004: These institutions have been established without official permission from government institutions and there are no statistics available about them. However, many government officials are unofficially involved in them.
Credit institutions licensed by the Central Bank of the Islamic Republic:
Towse-e Credit Institute
Kowsar Credit Institute
Melal Credit Institute
Nour Credit Institute
Caspian Credit Institute
Institutions that had been integrated with each other and licensed after March 2010:
Baran Financial and Credit Institute
Samen alHojaj Financial and Credit Institute
Pishgamane-Yazd Financial and Credit Institute
Salehin Financial and Credit Institute
Askaryeh Financial and Credit Institute
Ferdowsi Financial and Credit Institute
Ghavamin Financial and Credit Institute
Karsazane-Ayandeh Financial and Credit Institute
Mowlalmovaheddin Financial and Credit Institute
Hafez Financial and Credit Institute
Mizan Cooperative credit related to the regime's judiciary retirees
Thamen Credit Institute affiliated with the Revolutionary Guards Cooperative Foundation
Virtual organizations licensed in 2011:
Mehr Financial and Credit institute belonging to the Basij
Kowsar Credit Institute affiliated with Ministry of Defense
Reyhaneh Gostar Moshiz Financial and Credit Institution
Financial Institutions established in 2013:
Arman Credit Institute consists of the merger of Fereshtegan, Ferdowsi, and Afzal Toos Financial and Credit Institutions.
Samenolhojaj Credit Institute
Melal Credit Institute, under the establishment
Kowsar Credit Institute, under the establishment
Nur Credit Institute consists of the merger of Pishgaman, Karsazane-Ayandeh, and Reyhaneh Gostar Moshiz Financial and Credit Institutions.
Financial Institutions transformed into banks:
Sina Financial institution was renamed Sina Bank (The former Bonyad Financial & Credit Institute)
Ansar Financial and Credit Institute was renamed Ansar Bank. Former Ansarolmujahedin savings fund and loan (Gharzolhasaneh) affiliated with Revolutionary Guards
Iranian Financial and Credit renamed to Hekmat-Iranian bank. (Affiliated to the cooperative foundation of Military Forces of Islamic Republic of Iran)
Mowlalmovaheddin Financial and Credit institute renamed to Iran Zamin Bank
Ghavamin Financial and Credit institute renamed to Ghawamin Bank. (Affiliated with state security police forces). Etemade-Iranian Financial and Credit Institute wasn't approved by Central Bank so merged to Ghawamin Bank
Ayandhara Bank was the merger of Salehin and Ativ Financial and Credit Institutes
Mehr Financial and Credit Institute renamed to Mehr Eghtesad Bank (Under establishment) (Affiliated to the Basij)
The widespread crisis of the plundered
Such institutions have been a problem in the society since the early 2010s, causing some media networks to refer to aspects of the issue of plundered people.
The crisis, which emerged during the presidency of Hassan Rouhani and Valiollah Saif as the Central Bank chairman, began when after 2013, they increased the interest on deposits so that they could recoup their monthly liquidity deficit by attracting new investors. At the same time, the judiciary and the Central Bank announced the possibility of a deficit of their assets in the media, which resulted in the onslaught of the "plundered" people to get back their money. This caused a shortage of liquidity and bankruptcy of institutions, and depositors even often failed to get their initial deposits back.
The negative effects of the failure to refund public deposits by these institutions affected the lives of millions of Iranians directly and indirectly. The looted people first attempted to withdraw their deposits by trying legal ways, but after their fruitless pursuits, despite the tyranny and repression dominated by the ruling organs of society, they formed scattered crowds behind the doors of the same institutions. They found one another united with the same common pain and held constant daily gatherings that became known as the looted rally.
These constant gatherings began to turn to small regular protest rallies and they gradually became demonstrations and rallies against government officials and heads of regime institutions.
Rallies by bankrupt depositors lead to massive protests
Perhaps the first protests of depositors of Iranian credit institutions date back to 2016-2017. The small demonstrations merged and quickly turned into a formidable community of Iranians who were able to hold rallies for the same subject. A demonstration was held in several places simultaneously in Tehran and other cities, and it became renowned as the protest of the looted.
Small movements of these people could be called a turning point in the history of Iran's popular protests in the atmosphere of repression of the ruling tyranny in Iran. After the protests of the looted depositors spread throughout Iran, other classes of the Iranian community also realized that they could make protest rallies for their demands. Given the role of regime officials and institutions in creating this situation, many of these protest rallies gradually became political demonstrations against government corruption.
The protests formed in the face of economic and trade-related problems are the tip of the iceberg, most of which are the political dissatisfaction and desire of Iranians to overthrow the dictatorial regime. The people of Iran, who have been oppressed and suppressed for 40 years, and deprived of their basic rights and freedoms, present themselves in the organized movements of economic and trade problems as an excuse to begin their protests. Meanwhile, the general uprising of January 2018 was apparently due to an increase in the price of eggs, but the unrest spread in more than 140 cities and the slogans quickly changed against the Iranian regime, and people called for the overthrow of the dictatorship.
The protest of the looted people continues in the context of Iran's nationwide uprisings of 2018, and in conjunction with the protest movements of other segments of the Iranian society. It is a new factor that has further driven a rift between the Iranian regime and its public and non-public affiliated organs on the one hand and the people of Iran on the other. And this is what has provoked fear in the Iranian government.
Iran poverty
Iran protest plundered shareholders
Tehran Facing the Crisis of Large Number of 'IRGC' Commanders Getting Killed
Spokesman: U.S. military trains dozens of Syrian fighters
Syria regime unsure it will continue Geneva talks: negotiator
Maryam Rajavi welcomes stronger EU sanctions, emphasizes on comprehensive sanctions
MARYAM-RAJAVI-MESSAGE
PM: Ankara will no longer honor migrant deal if EU fails to
No deal to end Cyprus's decades-old division as talks crumble
Lebanese businessman wanted by US for financing Hezbollah detained in Morocco
[Video] Royce on Morning Joe: U.S. Must Crack Down on Assad's War


text:
Bill seeks to curb Zardari's powers
Parliament debates bill to shift Pakistan president's sweeping powers to prime minister.
Both houses of Pakistan's parliament will debate the 18th Amendment Bill for three days [AFP]
The move is expected to end months of political tensions, but it was not immediately clear when the national assembly would vote on it.
"The Friday meeting has been adjourned and no date has been confirmed," Kamal Hyder, Al Jazeera's correspondent in the Pakistani capital, Islamabad, said.
Both the upper and lower houses of parliament can debate the issue for up to three days.
Presidential changes
Known as the 18th Amendment Bill, the legislation seeks to reverse constitutional changes adopted by Pervez Musharraf, the former military ruler, effectively turning Zardari into a titular head of state.
"This [reform] package ... ensures provincial autonomy, judicial autonomy and effectively strengthens parliamentary democracy in the country"
Ishtiaq Ahmed,
associate professor at Quaid-e-Azam University
Drafted by a parliamentary committee made up of all political groups, the bill is expected to be passed by more than the two-thirds majority needed.
Ishtiaq Ahmed, an associate professor of international relations at Islamabad's Quaid-e-Azam University, said the move to undo reforms put in place under a military regime was important for Pakistan's institutional development.
"This package ... goes beyond stripping the president of Pakistan of arbitrary powers, it ensures provincial autonomy, judicial autonomy and effectively strengthens parliamentary democracy in the country," he told Al Jazeera.
Asked if the move would transfer too many powers to the prime minister, Ahmed said: "In a parliamentary system the chief executive has to be the prime minister, not the president."
Under the bill, the president would lose the power to dismiss the prime minister. It would also allow prime ministers to be eligible to stand for three terms in office.
That would allow Nawaz Sharif, the opposition party leader, who has already served two terms before being toppled in Musharraf's 1999 coup, to again become prime minister.
Corruption charges
The president would also no longer be able to dissolve elected parliaments or appoint the commander of Pakistan's armed forces, as has been done in the past.
Zardari would also lose the power to appoint judges to a commission consisting of senior judges and government figures.
The bill has been heralded as a move that could ease instability in Pakistan, but it could also pave the way for corruption cases to be brought against the president.
The government is facing mounting pressure from the supreme court to reopen corruption cases against Zardari after it threw out a controversial amnesty law in December.
Zardari has summoned a joint session of parliament on Monday and will be addressing the combined session, Farhatullah Babar, the presidential spokesman, said.
Resignation announced
In another development on Friday, Anwar Mansoor, Pakistan's attorney-general, resigned over what he said was the government's obstruction of supreme court orders to investigate the president for corruption.
Mansoor said the law ministry had been denying him access to documents needed to carry out the supreme court order.
"The supreme court is our top institution, and there is no way you can defy its orders," he said after announcing his resignation.
The supreme court has zeroed in on one case that had been taken up by the Swiss government against Zardari that was halted in 2008 under the amnesty.
Zardari and his late wife Benazir Bhutto, the assassinated former prime minister, were found guilty in absentia in a Geneva court in 2003 of laundering millions of Swiss francs.
They were handed six-month sentences and fined, but both punishments were automatically suspended when they appealed.

redpajama_set_name: RedPajamaCommonCrawl


Geocon handled the immersion dimensioning for the five tunnel segments that make up the Limerick Tunnel in Ireland. These units measure approximately 100 by 25 by 8.5 metres (L x W x H). The segments were immersed in September 2008.
The five tunnel segments were installed in the River Shannon near Limerick in Southwest Ireland. The tunnel, which has a total length of some 900 metres, links Coonagh and Bunlicky. The immersion was part of the 'Limerick Southern Ring Road Phase II' project. This was the final stage in the construction of a ring road around Limerick City, which diverts a considerable share of the traffic in this area away from Limerick city centre.
Before immersing the tunnel segments, the team needed to install so-called tiles in pits dredged especially for this purpose in the riverbed. It was necessary to precisely align these tiles (which can measure up to 6.5 by 6.5 by 1.5 metres) with the tunnel axis under water. Due to strong tidal fluctuations, the team had to account for length variations in the immersed joints. These fluctuations could also be accommodated on the secondary end of the segment through the installation of sliding panels on the tile supports.
The detailed planning showed that installing the final segment between sheet piling and under the jacks would not be feasible within the space of a single tide. That is why halfway through the immersion operation, the team temporarily allowed the receding water to lower the segment on supporting tiles. The complex positioning operation was subsequently rounded off during the next tide.
Geocon used RTK-GPS and total stations to position the tiles, as well as an underwater gyroscope.
The five tunnel segments were immersed with the aid of self-tracking total stations.


On April 14th, the ArchitekturPreis Berlin e.V. invites into the KutscherHaus for a discussion about housing and integration solutions for refugees . GRAFT founding partner Wolfram Putz and Dr. Gerd Ellinghaus will present the new firm "Heimat2" along with representatives from Berlin politics, real estate, and the construction industry.


Arrays are widely used data type in 'C' language. It is a collection of elements of similar data type. These similar elements could be of all integers, all floats or all characters. An array of character is called as string whereas and array of integer or float is simply called as an array. So array may be defined as a group of elements that share a common name and that are defined by position or index. The elements of an arrays are store in sequential order in memory.


Hate to feel like I'm just a cut-and-paste blogger, so I want to mention that I enjoyed a local screening of 'Soul Food Junkies'. Byron Hurt, the documentary maker, came to Rhode Island and showed his film at Miriam Hospital to health care workers, and later at an event open to the public at the Cathedral of Life Christian Assembly in Olneyville.
The film is an impressive balancing act– recognizing the centrality of food as culture, family and comfort– and the pleasure it brings. Also presenting the evidence that an un-balanced diet will take years off your life.
'Soul Food Junkies' was selected to show on PBS, date to be announced.
This short post is a taste, a larger portion will follow.
← Is Your Congress Breeding Bolsheviks?


7: Three-pointers by the Warriors' Klay Thompson.
9: Assists by Shaun Livingston of the Warriors in 23 minutes off the bench.
15: Rebounds by Houston big man Dwight Howard.
18: Points scored by the Warriors' Draymond Green.
18: Points scored by Houston star James Harden.
18: Assists by the Rockets.
18.5: The Rockets' shooting percentage from three-point land.
19: Points scored by Howard.
19: Minutes played by Curry.
21: Three pointers for the Warriors, an NBA playoff record.
21: Margin by which Golden State outscored Houston in the third quarter (41-20).
22: Missed three-pointers by the Rockets.
38: Assists by the Warriors.
39: Bench points for Houston.
56: Bench points for the Warriors – 22 of which were scored by Andre Iguodala.


text:
Q: Run ansible as root with specific sudoers My issue is that I have one server where the sudoers for the ansible user is like this:
ansible ALL=(root) NOPASSWD: /usr/bin/su - root
Hence, the only way to switch to the root user is:
sudo su - root

When I try to run the below ansible playbook:
---
- name: Configure Local Repo server address
  hosts: lab
  remote_user: ansible
  become: yes
  become_user: root
  become_method: runas

  tasks:
    - name: test whoami
      become: yes
      shell:
        cmd: whoami
      register: whoami_output
    - debug: var=whoami_output

    - name: Deploy local.repo file to the hosts
      become: yes
      copy:
        src: /etc/ansible/files/local.repo
        dest: /etc/yum.repos.d/local.repo
        owner: ansible
        group: ansible
        mode: 0644
        backup: yes
      register: deploy_file_output
    - debug: var=deploy_file_output

I got the following error:
ansible-playbook --private-key /etc/ansible/keys/ansible_key /etc/ansible/playbooks/local_repo_provisioning.yml
PLAY [Configure Local Repo server address] *****************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************************************************
ok: [10.175.65.12]

TASK [test whoami] *****************************************************************************************************************************************************************************************************************************
changed: [10.175.65.12]

TASK [debug] ***********************************************************************************************************************************************************************************************************************************
ok: [10.175.65.12] => {
    "whoami_output": {
        "changed": true,
        "cmd": "whoami",
        "delta": "0:00:00.003301",
        "end": "2023-01-15 17:53:56.312715",
        "failed": false,
        "msg": "",
        "rc": 0,
        "start": "2023-01-15 17:53:56.309414",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "ansible",
        "stdout_lines": [
            "ansible"
        ]
    }
}

TASK [Deploy local.repo file to the hosts] *****************************************************************************************************************************************************************************************************
fatal: [10.175.65.12]: FAILED! => {"changed": false, "checksum": "2356deb90d20d5f31351c719614d5b5760ab967d", "msg": "Destination /etc/yum.repos.d not writable"}

PLAY RECAP *************************************************************************************************************************************************************************************************************************************
10.175.65.12               : ok=3    changed=1    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

When I tried to use become_method: sudo I got the "Missing sudo password" message. Further, when I tried become_method: su I got the "Timeout (12s) waiting for privilege escalation prompt:" message.

All in all, would someone know how to explain how ansible runs the commands deppending on the "become_method" set? Is there a way to switch to the root user with that kind of sudoers conf?
Thanks in advance!

redpajama_set_name: RedPajamaStackExchange


Paraffin are colorless chemical compounds also known as alkane. They are a primary component of natural gas and petroleum. Paraffins with less than five carbon atoms per molecule are typically gaseous at room temperature, those with five to 15 carbon atoms are liquid in form, and those with more than 15 carbon atoms per molecule are solids. This chemical is commonly used in the production of various skin products, such as creams, lotions, lip balm, soap, and eczema ointments.
There are only a few side effects of paraffins. Most of the side effects of this chemical are skin-related because it is usually applied topically. Liquid paraffin is a variant of petroleum commonly known as mineral oil. It has been criticized because it does not exactly moisturize the skin, or it only moisturizes the skin temporarily. Several skin experts said that this chemical compound can clog pores, promote the development of comedonal acne, and cause breakouts. People are advised to not use products with paraffins as a safety precaution.
The body organs that can be harmed by paraffins are limited because there is not much information on its health hazards.
Ingestion of liquid paraffin or inhalation of paraffin candle fumes may cause negative effects, such as nausea, vomiting, headaches, or benzene pollution which can cause lung cancer.
Paraffins in wax form is applied to the face, hands, feet, and body in making the skin moisturized and softer during spa treatments.
Paraffins can cause harm to the skin. People with extremely sensitive skin can experience heat rash, known as prickly heat, from applying paraffin to the skin. This condition is characterized by tiny red bumps on the face, neck, and upper torso, which can cause itchiness and discomfort. In addition, people with chemical sensitivities can get minor swelling or breakouts from paraffin wax treatments.
People with hypertension, diabetes, or varicose veins should refrain from getting paraffin treatments because it can lead to abnormal sensations, numbness, and hindrance of blood circulation among diabetic people.
Paraffins are colorless chemical compounds that can be in solid, liquid, and gas forms. They are a major component of natural gas and petroleum. It can cause breakouts and prickly heat when applied to the skin. Moreover, it can cause vomiting, nausea, or headache when inhaled or ingested. It can also be harmful to people with hypertension, diabetes, or varicose veins.


text:
Q: AssertionError: Status expected:<200> but was:<400> when testing in junit My controller:
@GetMapping(value = "/ecotox", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Object> getEcotox(@RequestParam("core") List<String> core, @RequestParam("date") List<String> date,
        @RequestParam("state") String state, @RequestParam("area") List<String> area,
        @RequestParam("type") List<String> type, @RequestParam("analyt") String analyt,
        @RequestParam("wp") String wp, @RequestParam("subDesc") String subDesc,
        @RequestParam("anaMonitor") List<String> anaMonitor, @RequestParam("ecoMonitor") List<String> ecoMonitor,
        @RequestParam("subType") List<String> subType, @RequestParam("needed") List<String> needed,
        @RequestParam("notify") List<String> notify, @RequestParam("available") List<String> available,
        @RequestParam("phase") List<String> phase, @RequestParam("subAvailable") List<String> subAvailable,
        @RequestParam("subShipped") List<String> subShipped, @RequestParam("external") List<String> external,
        @RequestParam("valid") List<String> valid, @RequestParam("contract") List<String> contract) {
        FilterInputModel model = new FilterInputModel(core, date, state, type, area, analyt, wp, subDesc,
        anaMonitor, ecoMonitor, subType, needed, notify, available, phase, subAvailable, subShipped, external, valid, contract);
    return new ResponseEntity<>(vaultService.getFilteredFields(model), HttpStatus.OK);
    }

My ControllerTest:
@Test
void getEcotoxTest() throws Exception {

List<Object> response = new ArrayList<>();
when(vaultServiceTest.getFilteredFields(model))
        .thenReturn(response);

this.mockMvc.perform(MockMvcRequestBuilders.get("/api/ecotox")
        .contentType(MediaType.APPLICATION_JSON_VALUE)
        .accept("application/json"))
        .andExpect(MockMvcResultMatchers.status().isOk())
        .andExpect(result -> assertEquals(response, result.getAsyncResult()));
}

EDIT:
And here's an error Message:
Status expected:<200> but was:<400>
Expected :200
Actual   :400
<Click to see difference>

java.lang.AssertionError: Status expected:<200> but was:<400>
    at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59)
    at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122)
    at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:627)
    at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:212)
    at hr.ogcs.ltt.api.lttapi.controller.LttControllerTest.getEcotoxTest(LttControllerTest.java:84)

    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)

When I call the method I got java.lang.AssertionError: Status expected:<200> but was:<400> error.
I'm using Jackson.


text:
Biografia
Maksimova ha iniziato a praticare la ginnastica ritmica all'età di cinque anni, e nel 2008 è entrata a far parte della squadra della Russia. Debutta ai campionati mondiali nel 2009 a Mie e l'anno seguente viene relegata tra le riserve.

Dal 2013 comincia a far parte stabilmente della squadra russa e in seguito ne diventa il capitano.

Ha rappresentato la  ai Giochi olimpici di , con cui si è laureata campionessa nel concorso a squadre.

Ha vinto la medaglia d'argento ai Giochi olimpici di  nel concorso a squadre, gareggiando sotto la sigla , a seguito dell'esclusione della Russia per doping di Stato.

Palmarès

Per la Russia
Giochi olimpici
 Rio de Janeiro 2016: oro nella gara a squadre.

 Campionati mondiali di ginnastica ritmica
Mie 2009: oro nei 5 cerchi, bronzo nell'all-around e nei 3 nastri / 2 funi.
Kiev 2013: oro nei 2 nastri / 3 palle, bronzo nell'all-around.
Smirne 2014: oro nei 2 nastri / 3 palle.
Stoccarda 2015: oro nell'all-around e nelle 6 clavette / 2 cerchi, argento nei 5 nastri.
Baku 2019: oro nell'all-around e nei 3 cerchi / 4 clavette, bronzo nelle 5 palle.

 Campionati europei di ginnastica ritmica
Baku 2014: oro nell'all-around e nei 2 nastri / 3 palle, argento nelle 10 clavette.
Holon 2016: oro nell'all-around.

 Giochi europei
Baku 2015: oro nell'all-around e nei 5 nastri.
Minsk 2019: oro nelle 5 palle, bronzo nell'all-around.

 Universiadi
Kazan' 2013: oro nell'all-around, nelle 10 clavette e nei 2 nastri / 3 palle.

Per ROC
Giochi olimpici
 Tokyo 2020: argento nella gara a squadre.

Onorificenze

Note

Altri progetti

Collegamenti esterni

redpajama_set_name: RedPajamaWikipedia


12 by 12 was a year-long series of photo-challenges set by renowned photographers. Every month a new challenge was issued and group members were invited to interpret it by submitting their responses on Flickr or Instagram.
The project followed on from the success of our two previous projects 52 by 52 and 26 by 26 which attracted some of the world's leading contemporary photographers including Edward Burtynsky, Carolyn Drake, Nadav Kander, Steve McCurry, Terry O'Neill, Martin Parr and Alec Soth. 12 by 12 aimed to stretch its members creatively, encouraging experimentation in terms of approach as well as aesthetics.


The new Tormek T-8: Redefining precision for water cooled sharpeners.
- Revolutionary fully cast frame for maximum precision.
- New and improved Square Edge Jig, SE-77, included.
- Water trough with lift for easy and steady mounting.
- Tormek Original Grindstone included.
- Leather Honing Wheel for final polish.
- Tormek's unique drive system.
- Maintenance free industrial motor.
- Removable scraper with built-in magnet for clean and efficient usage.


text:
In for a grilling
EquipmentFeaturesIN-DEPTHPrime cooking by Clare Nicholls	on November 22, 2017
Grande Cuisine's Capic salamander grills use quick-therm heating elements.
Catering Insight's Emma Calder investigated which types of grills are in demand the most and what the key considerations are for dealers specifying them.
The ever-evolving minefield that is a commercial kitchen is a space that experiences great change on a regular basis. From new equipment to new power sources, from materials to layout, the commercial kitchen landscape is a chameleon, especially with regards to the evolution of grills and salamanders over the past few years.
With such a rapid pace of change it is more important than ever to be aware of what is available and what different solutions have to offer as well as looking at how the industry has changed, in order to predict where it may end up next.
For example, Grande Cuisine's director Steve Hobbs said: "There has been a steady move away from traditional style gas units to more efficient electric units which do not need to be left on for long periods before use. Amongst the developments we've seen in our own portfolio of products are Capic salamander grills using quick-therm heating elements which come to temperature in a matter of seconds."
Another substantial change that has caused ripples among the industry is what caterers are using them for. While it used to be the case that it was simply a main cooking platform for grilling meat and fish, it is now just as likely to be used for gratination, glazing or holding food at perfect temperature, prior to service.
With a growing menu being cooked on grills the equipment has been forced to evolve in order to accommodate the varying requirements.
This steak grilling tendency has meant Blue Seal has seen a shift in heating time demand. "Steak-specific restaurants dropped in popularity a number of years back and are now coming back in trend," said key accounts manager David Chesshire.
He continued: "However the development of rapid heat up rise and fall grills in conjunction with other protein cooking appliances continues to limit the sale on traditional gas/electric salamander grills in larger concepts and chain restaurants."
Chesshire concluded: "There will probably always be a requirement for the traditional salamander units, especially in the smaller independent restaurants and cafés, and Blue Seal will always accommodate this within its product range."
With every different product comes a new cooking requirement, which requires, of course, versatility. In a mission to provide seamless versatility Pantheon has rolled out grill that it claims can be put to a plethora of uses.
Pantheon's sales director, David Barton, told Catering Insight: "The new generation of ceramic contact grills doesn't absorb or transfer flavours and can be wiped down easily between uses. The glass surfaces also eliminate the smoke and smells associated with cast iron grills which means they can be used front of house, even when space is limited."
As highlighted by Pantheon, while menus and cooking techniques are circular changes, caterers also have to contend with changing spatial limitations. With kitchens getting smaller and smaller, using space effectively is of the upmost importance, according to Foodservice Equipment Marketing.
Marketing and sales manager Mark Hogan said: "There is often the pressure on restaurants to shrink the kitchen space in order to create more space for customers, especially in London where rents and rates are very high and a higher turnover required. Caterers are looking for equipment that makes the most of the space available.
"This has led to a trend for more compact commercial kitchen equipment, combination models and multifunctional bits of kit."
While the fundamentals of the space that grills are used within has drastically changed, so too has the way they are used. The units, which are normally left on for hours on end, are now undergoing a makeover to become more planet-friendly.
Grande Cuisine has identified a shift towards green initiatives, and has responded by cutting down power usage of its equipment. Hobbs said: "When it comes to chargrills, Capic is leading the way with its electric units because whereas the traditional gas chargrill is inherently a 'dirty' cooking method, causing issues with servicing and maintenance, the electric chargrill is cleaner, easier to use, comes to temperature much quicker and requires less maintenance."
Aside from products, another major change that has impacted the catering sector is the eating away from home culture. The sharp spike has led to consumers wanting easy-grab food on the go. Grills offer caterers a virtually effortless way of meeting this demand.
Pantheon sales director Barton added: "One of the biggest changes to UK eating habits that has increased the demand for countertop grills is the massive out of home market. Caterers are under pressure to add interesting, easy-to-eat foods to their menus such as paninis and toasted sandwiches."
While the sector has welcomed the changing demands of consumers and has turned to grills, it remains to be seen what equipment is best for getting the job done.
While for some a bespoke unit will flawlessly fit their needs and that will be the end of it, others are favouring modular ranges or sticking to the basic countertop offering.
Some suppliers, such as Lincat, are finding that modular offerings are far and away the most popular, while others are spotting a bumper response to specialised units. "We have experienced strong demand for adjustable salamanders. That said, we sell plenty of traditional gas and electric salamanders too. All our salamanders can be fixed to the wall, or mounted on a bench or wall stand as required by the kitchen design," said development chef Paul Hickman.
Blue Seal, which produces a 900mm-wide gas and electric traditional salamander, due to current demand also supplies an electric rapid heat up rise and fall grill, which is used mainly in conjunction with island suites for flash heating and cheese melting.
Chesshire said: "This unit comes in handy when there is no room under a gas canopy for a traditional gas salamander due to other equipment prioritising the menu requirement, but a fast performance salamander is needed for specific minimal purpose. They can be positioned conveniently on the end of an island run or on a wall bracket above a work top."
Beyond the way the unit fits into the existing kitchen there are ample factors that sway dealers one way or another when making the all-important decision of what grill to go for.
Dealers and end users are increasingly conscious of the kitchen's electricity excess, menu and how often the unit will be used, and this is reflected in their specifications when looking to buy grills and salamanders.
Lincat's Hickman explained: "When dealers are specifying salamanders, the first thing to consider is the kitchen's available power supply, whether gas or electricity. The next thing to consider is size, which will be determined by their customer's requirements in terms of menu range and output. They should also consider whether the salamander needs a toast rack or branding plates, and whether it should be GN compatible."
In addition to a suitable power source, dealers are looking to tidy up their environmental approach and reduce end users' carbon footprints by installing green technology.
Hogan, from FEM, added: "Dealers will always find it easy to specify equipment that provide caterers with energy, cost and time saving equipment. When choosing a new piece of equipment, dealers can compare power consumption to demonstrate the most energy efficient grills.
"For example, caterers purchasing a new Panini grill could see that models with infrared elements would work more quickly than conventional grills. Ones that keep the temperature of the grill surround at around 10% lower than the grill itself reduce energy consumption further and create a safer, more user-friendly working environment."
In the quest for environmentally-friendly equipment, dealers are very keen to put energy efficiency centre stage to achieve their design plans.
According to Grande Cuisine, when looking for energy savings from grills, distributors are keeping an eye on the time taken to heat up and how multi-functional the grill is.
"The key criteria are firstly energy efficiency and secondly speed of heating which reduces 'heat up' time prior to operation. Flexibility of use, i.e. can the unit be used for different styles of 'cooking', is also a consideration. The Capic Quick Therm has three separate elements and can be used in a number of different ways: as a warming unit (with one element) holding/resting (with two elements) or full cooking with all three elements," said Hobbs.
While every dealer will inevitably have its own priorities in the grills field, there are some common denominators to be aware of; speed, power and kitchen positioning, according to Blue Seal.
And Blue Seal is not alone. For Charvet, while there is an acknowledgement for the wider attributes, the supplier put forward that there is a core set of fundamental requirements for dealers universally.
Charvet's sales director, Clow, concluded: "Heavy duty build quality, high power, easily interchangeable infra-red elements plus the ability to colour match to fit the décor!"
With pressures mounting on the foodservice sector to focus on green initiatives, Charvet honed in on its grills and salamanders to address energy consumption.
Clow, said: "The 'environmental trend' has had a recent effect in that new products such as the Charvet Rise and Fall Infrared Salamander introduced 2 years ago.
"This has energy saving features such as plate detection systems (which turn up the heat from 'standby' to full power when a plate is put under the grill) and two independent cooking areas, so one can be switched off during slack periods.
"Plate detection saves approximately 30% energy compared to a conventional grill, given average restaurant usage with peaks and troughs in demand through the day."
Tags : blue sealCharvetfemFoodservice Equipment MarketingGrande CuisinegrillsLincatpantheonsalamanders
Vacancy: product and technical manager, Mechline
American Metalcraft grabs a slice of pizza-making market
First major manufacturer's 2020 financial results show Covid impact extent
Charvet reports 'surprising' surge in range sales
Lincat remains profitable through the pandemic
Pujadas pages post-lockdown food service
FEM's Jim Doherty reflects on career after delayed retirement


text:
#include <stdlib.h>
#include <errno.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>

#include "ruby.h"
#include "ox.h"
#include "sax.h"

/* maximum to allocate on the stack, arbitrary limit */
#define SMALL_XML	4096

typedef struct _YesNoOpt {
    VALUE	sym;
    char	*attr;
} *YesNoOpt;

void Init_ox();

VALUE	 Ox = Qnil;

ID	ox_at_column_id;
ID	ox_at_content_id;
ID	ox_at_id;
ID	ox_at_line_id;
ID	ox_at_pos_id;
ID	ox_at_value_id;
ID	ox_attr_id;
ID	ox_attr_value_id;
ID	ox_attributes_id;
ID	ox_attrs_done_id;
ID	ox_beg_id;
ID	ox_cdata_id;
ID	ox_comment_id;
ID	ox_den_id;
ID	ox_doctype_id;
ID	ox_end_element_id;
ID	ox_end_id;
ID	ox_end_instruct_id;
ID	ox_error_id;
ID	ox_excl_id;
ID	ox_external_encoding_id;
ID	ox_fileno_id;
ID	ox_force_encoding_id;
ID	ox_inspect_id;
ID	ox_instruct_id;
ID	ox_jd_id;
ID	ox_keys_id;
ID	ox_local_id;
ID	ox_mesg_id;
ID	ox_message_id;
ID	ox_new_id;
ID	ox_nodes_id;
ID	ox_num_id;
ID	ox_parse_id;
ID	ox_pos_id;
ID	ox_read_id;
ID	ox_readpartial_id;
ID	ox_start_element_id;
ID	ox_string_id;
ID	ox_text_id;
ID	ox_to_c_id;
ID	ox_to_s_id;
ID	ox_to_sym_id;
ID	ox_tv_nsec_id;
ID	ox_tv_sec_id;
ID	ox_tv_usec_id;
ID	ox_value_id;

VALUE	ox_encoding_sym;

VALUE	ox_empty_string;
VALUE	ox_zero_fixnum;
VALUE	ox_sym_bank; // Array

VALUE	ox_arg_error_class;
VALUE	ox_bag_clas;
VALUE	ox_bigdecimal_class;
VALUE	ox_cdata_clas;
VALUE	ox_comment_clas;
VALUE	ox_raw_clas;
VALUE	ox_date_class;
VALUE	ox_doctype_clas;
VALUE	ox_document_clas;
VALUE	ox_element_clas;
VALUE	ox_instruct_clas;
VALUE	ox_parse_error_class;
VALUE	ox_stringio_class;
VALUE	ox_struct_class;
VALUE	ox_time_class;

Cache	ox_symbol_cache = 0;
Cache	ox_class_cache = 0;
Cache	ox_attr_cache = 0;

static VALUE	auto_define_sym;
static VALUE	auto_sym;
static VALUE	circular_sym;
static VALUE	convert_special_sym;
static VALUE	effort_sym;
static VALUE	generic_sym;
static VALUE	indent_sym;
static VALUE	limited_sym;
static VALUE	mode_sym;
static VALUE	object_sym;
static VALUE	opt_format_sym;
static VALUE	optimized_sym;
static VALUE	skip_none_sym;
static VALUE	skip_return_sym;
static VALUE	skip_sym;
static VALUE	skip_white_sym;
static VALUE	smart_sym;
static VALUE	strict_sym;
static VALUE	symbolize_keys_sym;
static VALUE	symbolize_sym;
static VALUE	tolerant_sym;
static VALUE	trace_sym;
static VALUE	with_dtd_sym;
static VALUE	with_instruct_sym;
static VALUE	with_xml_sym;
static VALUE	xsd_date_sym;

#if HAS_ENCODING_SUPPORT
rb_encoding	*ox_utf8_encoding = 0;
#elif HAS_PRIVATE_ENCODING
VALUE		ox_utf8_encoding = Qnil;
#else
void		*ox_utf8_encoding = 0;
#endif

struct _Options	 ox_default_options = {
    { '\0' },		/* encoding */
    2,			/* indent */
    0,			/* trace */
    No,			/* with_dtd */
    No,			/* with_xml */
    No,			/* with_instruct */
    No,			/* circular */
    No,			/* xsd_date */
    NoMode,		/* mode */
    StrictEffort,	/* effort */
    Yes,		/* sym_keys */
    NoSkip,		/* skip */
    No,			/* smart */
    No,			/* convert_special */
#if HAS_PRIVATE_ENCODING
    Qnil		/* rb_enc */
#else
    0			/* rb_enc */
#endif
};

extern ParseCallbacks	ox_obj_callbacks;
extern ParseCallbacks	ox_gen_callbacks;
extern ParseCallbacks	ox_limited_callbacks;
extern ParseCallbacks	ox_nomode_callbacks;

static void	parse_dump_options(VALUE ropts, Options copts);

static char*
defuse_bom(char *xml, Options options) {
    switch ((uint8_t)*xml) {
    case 0xEF: /* UTF-8 */
	if (0xBB == (uint8_t)xml[1] && 0xBF == (uint8_t)xml[2]) {
	    options->rb_enc = ox_utf8_encoding;
	    xml += 3;
	} else {
	    rb_raise(ox_parse_error_class, "Invalid BOM in XML string.\n");
	}
	break;
#if 0
    case 0xFE: /* UTF-16BE */
	if (0xFF == (uint8_t)xml[1]) {
	    options->rb_enc = ox_utf16be_encoding;
	    xml += 2;
	} else {
	    rb_raise(ox_parse_error_class, "Invalid BOM in XML string.\n");
	}
	break;
    case 0xFF: /* UTF-16LE or UTF-32LE */
	if (0xFE == (uint8_t)xml[1]) {
	    if (0x00 == (uint8_t)xml[2] && 0x00 == (uint8_t)xml[3]) {
		options->rb_enc = ox_utf32le_encoding;
		xml += 4;
	    } else {
		options->rb_enc = ox_utf16le_encoding;
		xml += 2;
	    }
	} else {
	    rb_raise(ox_parse_error_class, "Invalid BOM in XML string.\n");
	}
	break;
    case 0x00: /* UTF-32BE */
	if (0x00 == (uint8_t)xml[1] && 0xFE == (uint8_t)xml[2] && 0xFF == (uint8_t)xml[3]) {
	    options->rb_enc = ox_utf32be_encoding;
	    xml += 4;
	} else {
	    rb_raise(ox_parse_error_class, "Invalid BOM in XML string.\n");
	}
	break;
#endif
    default:
	/* Let it fail if there is a BOM that is not UTF-8. Other BOM options are not ASCII compatible. */
	break;
    }
    return xml;
}

/* call-seq: ox_default_options() => Hash
 *
 * Returns the default load and dump options as a Hash. The options are
 * - indent: [Fixnum] number of spaces to indent each element in an XML document
 * - trace: [Fixnum] trace level where 0 is silent
 * - encoding: [String] character encoding for the XML file
 * - with_dtd: [true|false|nil] include DTD in the dump
 * - with_instruct: [true|false|nil] include instructions in the dump
 * - with_xml: [true|false|nil] include XML prolog in the dump
 * - circular: [true|false|nil] support circular references while dumping
 * - xsd_date: [true|false|nil] use XSD date format instead of decimal format
 * - mode: [:object|:generic|:limited|nil] load method to use for XML
 * - effort: [:strict|:tolerant|:auto_define] set the tolerance level for loading
 * - symbolize_keys: [true|false|nil] symbolize element attribute keys or leave as Strings
 * - skip: [:skip_none|:skip_return|:skip_white] determines how to handle white space in text
 * - smart: [true|false|nil] flag indicating the SAX parser uses hints if available (use with html)
 * - convert_special: [true|false|nil] flag indicating special characters like < are converted with the SAX parser
 * @return [Hash] all current option settings.
 *
 * Note that an indent of less than zero will result in a tight one line output
 * unless the text in the XML fields contain new line characters.
 */
static VALUE
get_def_opts(VALUE self) {
    VALUE	opts = rb_hash_new();
    int		elen = (int)strlen(ox_default_options.encoding);

    rb_hash_aset(opts, ox_encoding_sym, (0 == elen) ? Qnil : rb_str_new(ox_default_options.encoding, elen));
    rb_hash_aset(opts, indent_sym, INT2FIX(ox_default_options.indent));
    rb_hash_aset(opts, trace_sym, INT2FIX(ox_default_options.trace));
    rb_hash_aset(opts, with_dtd_sym, (Yes == ox_default_options.with_dtd) ? Qtrue : ((No == ox_default_options.with_dtd) ? Qfalse : Qnil));
    rb_hash_aset(opts, with_xml_sym, (Yes == ox_default_options.with_xml) ? Qtrue : ((No == ox_default_options.with_xml) ? Qfalse : Qnil));
    rb_hash_aset(opts, with_instruct_sym, (Yes == ox_default_options.with_instruct) ? Qtrue : ((No == ox_default_options.with_instruct) ? Qfalse : Qnil));
    rb_hash_aset(opts, circular_sym, (Yes == ox_default_options.circular) ? Qtrue : ((No == ox_default_options.circular) ? Qfalse : Qnil));
    rb_hash_aset(opts, xsd_date_sym, (Yes == ox_default_options.xsd_date) ? Qtrue : ((No == ox_default_options.xsd_date) ? Qfalse : Qnil));
    rb_hash_aset(opts, symbolize_keys_sym, (Yes == ox_default_options.sym_keys) ? Qtrue : ((No == ox_default_options.sym_keys) ? Qfalse : Qnil));
    rb_hash_aset(opts, smart_sym, (Yes == ox_default_options.smart) ? Qtrue : ((No == ox_default_options.smart) ? Qfalse : Qnil));
    rb_hash_aset(opts, convert_special_sym, (Yes == ox_default_options.convert_special) ? Qtrue : ((No == ox_default_options.convert_special) ? Qfalse : Qnil));
    switch (ox_default_options.mode) {
    case ObjMode:	rb_hash_aset(opts, mode_sym, object_sym);	break;
    case GenMode:	rb_hash_aset(opts, mode_sym, generic_sym);	break;
    case LimMode:	rb_hash_aset(opts, mode_sym, limited_sym);	break;
    case NoMode:
    default:		rb_hash_aset(opts, mode_sym, Qnil);		break;
    }
    switch (ox_default_options.effort) {
    case StrictEffort:		rb_hash_aset(opts, effort_sym, strict_sym);		break;
    case TolerantEffort:	rb_hash_aset(opts, effort_sym, tolerant_sym);		break;
    case AutoEffort:		rb_hash_aset(opts, effort_sym, auto_define_sym);	break;
    case NoEffort:
    default:			rb_hash_aset(opts, effort_sym, Qnil);			break;
    }
    switch (ox_default_options.skip) {
    case NoSkip:		rb_hash_aset(opts, skip_sym, skip_none_sym);		break;
    case CrSkip:		rb_hash_aset(opts, skip_sym, skip_return_sym);		break;
    case SpcSkip:		rb_hash_aset(opts, skip_sym, skip_white_sym);		break;
    default:			rb_hash_aset(opts, skip_sym, Qnil);			break;
    }
    return opts;
}

/* call-seq: ox_default_options=(opts)
 *
 * Sets the default options for load and dump.
 * @param [Hash] opts options to change
 * @param [Fixnum] :indent number of spaces to indent each element in an XML document
 * @param [Fixnum] :trace trace level where 0 is silent
 * @param [String] :encoding character encoding for the XML file
 * @param [true|false|nil] :with_dtd include DTD in the dump
 * @param [true|false|nil] :with_instruct include instructions in the dump
 * @param [true|false|nil] :with_xml include XML prolog in the dump
 * @param [true|false|nil] :circular support circular references while dumping
 * @param [true|false|nil] :xsd_date use XSD date format instead of decimal format
 * @param [:object|:generic|:limited|nil] :mode load method to use for XML
 * @param [:strict|:tolerant|:auto_define] :effort set the tolerance level for loading
 * @param [true|false|nil] :symbolize_keys symbolize element attribute keys or leave as Strings
 * @param [:skip_none|:skip_return|:skip_white] determines how to handle white space in text
 * @return [nil]
 */
static VALUE
set_def_opts(VALUE self, VALUE opts) {
    struct _YesNoOpt	ynos[] = {
	{ with_xml_sym, &ox_default_options.with_xml },
	{ with_dtd_sym, &ox_default_options.with_dtd },
	{ with_instruct_sym, &ox_default_options.with_instruct },
	{ xsd_date_sym, &ox_default_options.xsd_date },
	{ circular_sym, &ox_default_options.circular },
	{ symbolize_keys_sym, &ox_default_options.sym_keys },
	{ smart_sym, &ox_default_options.smart },
	{ convert_special_sym, &ox_default_options.convert_special },
	{ Qnil, 0 }
    };
    YesNoOpt	o;
    VALUE	v;

    Check_Type(opts, T_HASH);

    v = rb_hash_aref(opts, ox_encoding_sym);
    if (Qnil == v) {
	*ox_default_options.encoding = '\0';
    } else {
	Check_Type(v, T_STRING);
	strncpy(ox_default_options.encoding, StringValuePtr(v), sizeof(ox_default_options.encoding) - 1);
#if HAS_ENCODING_SUPPORT
	ox_default_options.rb_enc = rb_enc_find(ox_default_options.encoding);
#elif HAS_PRIVATE_ENCODING
	ox_default_options.rb_enc = rb_str_new2(ox_default_options.encoding);
	rb_gc_register_address(&ox_default_options.rb_enc);
#endif
    }

    v = rb_hash_aref(opts, indent_sym);
    if (Qnil != v) {
	Check_Type(v, T_FIXNUM);
	ox_default_options.indent = FIX2INT(v);
    }

    v = rb_hash_aref(opts, trace_sym);
    if (Qnil != v) {
	Check_Type(v, T_FIXNUM);
	ox_default_options.trace = FIX2INT(v);
    }

    v = rb_hash_aref(opts, mode_sym);
    if (Qnil == v) {
	ox_default_options.mode = NoMode;
    } else if (object_sym == v) {
	ox_default_options.mode = ObjMode;
    } else if (generic_sym == v) {
	ox_default_options.mode = GenMode;
    } else if (limited_sym == v) {
	ox_default_options.mode = LimMode;
    } else {
	rb_raise(ox_parse_error_class, ":mode must be :object, :generic, :limited, or nil.\n");
    }

    v = rb_hash_aref(opts, effort_sym);
    if (Qnil == v) {
	ox_default_options.effort = NoEffort;
    } else if (strict_sym == v) {
	ox_default_options.effort = StrictEffort;
    } else if (tolerant_sym == v) {
	ox_default_options.effort = TolerantEffort;
    } else if (auto_define_sym == v) {
	ox_default_options.effort = AutoEffort;
    } else {
	rb_raise(ox_parse_error_class, ":effort must be :strict, :tolerant, :auto_define, or nil.\n");
    }

    v = rb_hash_aref(opts, skip_sym);
    if (Qnil == v) {
	ox_default_options.skip = NoSkip;
    } else if (skip_none_sym == v) {
	ox_default_options.skip = NoSkip;
    } else if (skip_return_sym == v) {
	ox_default_options.skip = CrSkip;
    } else if (skip_white_sym == v) {
	ox_default_options.skip = SpcSkip;
    } else {
	rb_raise(ox_parse_error_class, ":skip must be :skip_none, :skip_return, :skip_white, or nil.\n");
    }

    for (o = ynos; 0 != o->attr; o++) {
	v = rb_hash_lookup(opts, o->sym);
	if (Qnil == v) {
	    *o->attr = NotSet;
	} else if (Qtrue == v) {
	    *o->attr = Yes;
	} else if (Qfalse == v) {
	    *o->attr = No;
	} else {
	    rb_raise(ox_parse_error_class, "%s must be true or false.\n", rb_id2name(SYM2ID(o->sym)));
	}
    }
    return Qnil;
}

/* call-seq: parse_obj(xml) => Object
 *
 * Parses an XML document String that is in the object format and returns an
 * Object of the type represented by the XML. This function expects an
 * optimized XML formated String. For other formats use the more generic
 * Ox.load() method.  Raises an exception if the XML is malformed or the
 * classes specified in the file are not valid.
 * @param [String] xml XML String in optimized Object format.
 * @return [Object] deserialized Object.
 */
static VALUE
to_obj(VALUE self, VALUE ruby_xml) {
    char		*xml, *x;
    size_t		len;
    VALUE		obj;
    struct _Options	options = ox_default_options;
    struct _Err		err;

    err_init(&err);
    Check_Type(ruby_xml, T_STRING);
    /* the xml string gets modified so make a copy of it */
    len = RSTRING_LEN(ruby_xml) + 1;
    x = defuse_bom(StringValuePtr(ruby_xml), &options);
    if (SMALL_XML < len) {
	xml = ALLOC_N(char, len);
    } else {
	xml = ALLOCA_N(char, len);
    }
    memcpy(xml, x, len);
#if HAS_GC_GUARD
    rb_gc_disable();
#endif
    obj = ox_parse(xml, ox_obj_callbacks, 0, &options, &err);
    if (SMALL_XML < len) {
	xfree(xml);
    }
#if HAS_GC_GUARD
    RB_GC_GUARD(obj);
    rb_gc_enable();
#endif
    if (err_has(&err)) {
	ox_err_raise(&err);
    }
    return obj;
}

/* call-seq: parse(xml) => Ox::Document or Ox::Element
 *
 * Parses and XML document String into an Ox::Document or Ox::Element.
 * @param [String] xml XML String
 * @return [Ox::Document or Ox::Element] parsed XML document.
 * @raise [Exception] if the XML is malformed.
 */
static VALUE
to_gen(VALUE self, VALUE ruby_xml) {
    char		*xml, *x;
    size_t		len;
    VALUE		obj;
    struct _Options	options = ox_default_options;
    struct _Err		err;

    err_init(&err);
    Check_Type(ruby_xml, T_STRING);
    /* the xml string gets modified so make a copy of it */
    len = RSTRING_LEN(ruby_xml) + 1;
    x = defuse_bom(StringValuePtr(ruby_xml), &options);
    if (SMALL_XML < len) {
	xml = ALLOC_N(char, len);
    } else {
	xml = ALLOCA_N(char, len);
    }
    memcpy(xml, x, len);
    obj = ox_parse(xml, ox_gen_callbacks, 0, &options, &err);
    if (SMALL_XML < len) {
	xfree(xml);
    }
    if (err_has(&err)) {
	ox_err_raise(&err);
    }
    return obj;
}

static VALUE
load(char *xml, int argc, VALUE *argv, VALUE self, VALUE encoding, Err err) {
    VALUE		obj;
    struct _Options	options = ox_default_options;

    if (1 == argc && rb_cHash == rb_obj_class(*argv)) {
	VALUE	h = *argv;
	VALUE	v;

	if (Qnil != (v = rb_hash_lookup(h, mode_sym))) {
	    if (object_sym == v) {
		options.mode = ObjMode;
	    } else if (optimized_sym == v) {
		options.mode = ObjMode;
	    } else if (generic_sym == v) {
		options.mode = GenMode;
	    } else if (limited_sym == v) {
		options.mode = LimMode;
	    } else {
		rb_raise(ox_parse_error_class, ":mode must be :generic, :object, or :limited.\n");
	    }
	}
	if (Qnil != (v = rb_hash_lookup(h, effort_sym))) {
	    if (auto_define_sym == v) {
		options.effort = AutoEffort;
	    } else if (tolerant_sym == v) {
		options.effort = TolerantEffort;
	    } else if (strict_sym == v) {
		options.effort = StrictEffort;
	    } else {
		rb_raise(ox_parse_error_class, ":effort must be :strict, :tolerant, or :auto_define.\n");
	    }
	}
	if (Qnil != (v = rb_hash_lookup(h, skip_sym))) {
	    if (skip_none_sym == v) {
		options.skip = NoSkip;
	    } else if (skip_return_sym == v) {
		options.skip = CrSkip;
	    } else if (skip_white_sym == v) {
		options.skip = SpcSkip;
	    } else {
		rb_raise(ox_parse_error_class, ":effort must be :skip_none, :skip_return, or :skip_white.\n");
	    }
	}

	if (Qnil != (v = rb_hash_lookup(h, trace_sym))) {
	    Check_Type(v, T_FIXNUM);
	    options.trace = FIX2INT(v);
	}
	if (Qnil != (v = rb_hash_lookup(h, symbolize_keys_sym))) {
	    options.sym_keys = (Qfalse == v) ? No : Yes;
	}
    }
#if HAS_ENCODING_SUPPORT
    if ('\0' == *options.encoding) {
	if (Qnil != encoding) {
	    options.rb_enc = rb_enc_from_index(rb_enc_get_index(encoding));
	} else {
	    options.rb_enc = 0;
	}
    } else if (0 == options.rb_enc) {
	options.rb_enc = rb_enc_find(options.encoding);
    }
#elif HAS_PRIVATE_ENCODING
    if ('\0' == *options.encoding) {
	if (Qnil != encoding) {
	    options.rb_enc = encoding;
	} else {
	    options.rb_enc = Qnil;
	}
    } else if (0 == options.rb_enc) {
	options.rb_enc = rb_str_new2(options.encoding);
	rb_gc_register_address(&options.rb_enc);
    }
#endif
    xml = defuse_bom(xml, &options);
    switch (options.mode) {
    case ObjMode:
#if HAS_GC_GUARD
	rb_gc_disable();
#endif
	obj = ox_parse(xml, ox_obj_callbacks, 0, &options, err);
#if HAS_GC_GUARD
	RB_GC_GUARD(obj);
	rb_gc_enable();
#endif
	break;
    case GenMode:
	obj = ox_parse(xml, ox_gen_callbacks, 0, &options, err);
	break;
    case LimMode:
	obj = ox_parse(xml, ox_limited_callbacks, 0, &options, err);
	break;
    case NoMode:
	obj = ox_parse(xml, ox_nomode_callbacks, 0, &options, err);
	break;
    default:
	obj = ox_parse(xml, ox_gen_callbacks, 0, &options, err);
	break;
    }
    return obj;
}

/* call-seq: load(xml, options) => Ox::Document or Ox::Element or Object
 *
 * Parses and XML document String into an Ox::Document, or Ox::Element, or
 * Object depending on the options.  Raises an exception if the XML is
 * malformed or the classes specified are not valid.
 * @param [String] xml XML String
 * @param [Hash] options load options
 * @param [:object|:generic|:limited] :mode format expected
 *  - *:object* - object format
 *  - *:generic* - read as a generic XML file
 *  - *:limited* - read as a generic XML file but with callbacks on text and elements events only
 * @param [:strict|:tolerant|:auto_define] :effort effort to use when an undefined class is encountered, default: :strict
 *  - *:strict* - raise an NameError for missing classes and modules
 *  - *:tolerant* - return nil for missing classes and modules
 *  - *:auto_define* - auto define missing classes and modules
 * @param [Fixnum] :trace trace level as a Fixnum, default: 0 (silent)
 * @param [true|false|nil] :symbolize_keys symbolize element attribute keys or leave as Strings
 */
static VALUE
load_str(int argc, VALUE *argv, VALUE self) {
    char	*xml;
    size_t	len;
    VALUE	obj;
    VALUE	encoding;
    struct _Err	err;

    err_init(&err);
    Check_Type(*argv, T_STRING);
    /* the xml string gets modified so make a copy of it */
    len = RSTRING_LEN(*argv) + 1;
    if (SMALL_XML < len) {
	xml = ALLOC_N(char, len);
    } else {
	xml = ALLOCA_N(char, len);
    }
#if HAS_ENCODING_SUPPORT
#ifdef MACRUBY_RUBY
    encoding = rb_funcall(*argv, rb_intern("encoding"), 0);
#else
    encoding = rb_obj_encoding(*argv);
#endif
#elif HAS_PRIVATE_ENCODING
    encoding = rb_funcall(*argv, rb_intern("encoding"), 0);
#else
    encoding = Qnil;
#endif
    memcpy(xml, StringValuePtr(*argv), len);
    obj = load(xml, argc - 1, argv + 1, self, encoding, &err);
    if (SMALL_XML < len) {
	xfree(xml);
    }
    if (err_has(&err)) {
	ox_err_raise(&err);
    }
    return obj;
}

/* call-seq: load_file(file_path, options) => Ox::Document or Ox::Element or Object
 *
 * Parses and XML document from a file into an Ox::Document, or Ox::Element,
 * or Object depending on the options.	Raises an exception if the XML is
 * malformed or the classes specified are not valid.
 * @param [String] file_path file path to read the XML document from
 * @param [Hash] options load options
 * @param [:object|:generic|:limited] :mode format expected
 *  - *:object* - object format
 *  - *:generic* - read as a generic XML file
 *  - *:limited* - read as a generic XML file but with callbacks on text and elements events only
 * @param [:strict|:tolerant|:auto_define] :effort effort to use when an undefined class is encountered, default: :strict
 *  - *:strict* - raise an NameError for missing classes and modules
 *  - *:tolerant* - return nil for missing classes and modules
 *  - *:auto_define* - auto define missing classes and modules
 * @param [Fixnum] :trace trace level as a Fixnum, default: 0 (silent)
 * @param [true|false|nil] :symbolize_keys symbolize element attribute keys or leave as Strings
 */
static VALUE
load_file(int argc, VALUE *argv, VALUE self) {
    char	*path;
    char	*xml;
    FILE	*f;
    size_t	len;
    VALUE	obj;
    struct _Err	err;

    err_init(&err);
    Check_Type(*argv, T_STRING);
    path = StringValuePtr(*argv);
    if (0 == (f = fopen(path, "r"))) {
	rb_raise(rb_eIOError, "%s\n", strerror(errno));
    }
    fseek(f, 0, SEEK_END);
    len = ftell(f);
    if (SMALL_XML < len) {
	xml = ALLOC_N(char, len + 1);
    } else {
	xml = ALLOCA_N(char, len + 1);
    }
    fseek(f, 0, SEEK_SET);
    if (len != fread(xml, 1, len, f)) {
	ox_err_set(&err, rb_eLoadError, "Failed to read %ld bytes from %s.\n", (long)len, path);
	obj = Qnil;
    } else {
	xml[len] = '\0';
	obj = load(xml, argc - 1, argv + 1, self, Qnil, &err);
    }
    fclose(f);
    if (SMALL_XML < len) {
	xfree(xml);
    }
    if (err_has(&err)) {
	ox_err_raise(&err);
    }
    return obj;
}

/* call-seq: sax_parse(handler, io, options)
 *
 * Parses an IO stream or file containing an XML document. Raises an exception
 * if the XML is malformed or the classes specified are not valid.
 * @param [Ox::Sax] handler SAX (responds to OX::Sax methods) like handler
 * @param [IO|String] io IO Object to read from
 * @param [Hash] options parse options
 * @param [true|false] :convert_special flag indicating special characters like < are converted
 * @param [true|false] :symbolize flag indicating the parser symbolize element and attribute names
 * @param [true|false] :smart flag indicating the parser uses hints if available (use with html)
 * @param [:skip_return|:skip_white] :skip flag indicating the parser skips \r or collpase white space into a single space. Default (skip nothing)
 */
static VALUE
sax_parse(int argc, VALUE *argv, VALUE self) {
    struct _SaxOptions	options;

    options.symbolize = (No != ox_default_options.sym_keys);
    options.convert_special = (Yes == ox_default_options.convert_special);
    options.smart = (Yes == ox_default_options.smart);
    options.skip = ox_default_options.skip;

    if (argc < 2) {
	rb_raise(ox_parse_error_class, "Wrong number of arguments to sax_parse.\n");
    }
    if (3 <= argc && rb_cHash == rb_obj_class(argv[2])) {
	VALUE	h = argv[2];
	VALUE	v;

	if (Qnil != (v = rb_hash_lookup(h, convert_special_sym))) {
	    options.convert_special = (Qtrue == v);
	}
	if (Qnil != (v = rb_hash_lookup(h, smart_sym))) {
	    options.smart = (Qtrue == v);
	}
	if (Qnil != (v = rb_hash_lookup(h, symbolize_sym))) {
	    options.symbolize = (Qtrue == v);
	}
	if (Qnil != (v = rb_hash_lookup(h, skip_sym))) {
	    if (skip_return_sym == v) {
		options.skip = CrSkip;
	    } else if (skip_white_sym == v) {
		options.skip = SpcSkip;
	    }
	}
    }
    ox_sax_parse(argv[0], argv[1], &options);

    return Qnil;
}

static void
parse_dump_options(VALUE ropts, Options copts) {
    struct _YesNoOpt	ynos[] = {
	{ with_xml_sym, &copts->with_xml },
	{ with_dtd_sym, &copts->with_dtd },
	{ with_instruct_sym, &copts->with_instruct },
	{ xsd_date_sym, &copts->xsd_date },
	{ circular_sym, &copts->circular },
	{ Qnil, 0 }
    };
    YesNoOpt	o;

    if (rb_cHash == rb_obj_class(ropts)) {
	VALUE	v;

	if (Qnil != (v = rb_hash_lookup(ropts, indent_sym))) {
	    if (rb_cFixnum != rb_obj_class(v)) {
		rb_raise(ox_parse_error_class, ":indent must be a Fixnum.\n");
	    }
	    copts->indent = NUM2INT(v);
	}
	if (Qnil != (v = rb_hash_lookup(ropts, trace_sym))) {
	    if (rb_cFixnum != rb_obj_class(v)) {
		rb_raise(ox_parse_error_class, ":trace must be a Fixnum.\n");
	    }
	    copts->trace = NUM2INT(v);
	}
	if (Qnil != (v = rb_hash_lookup(ropts, ox_encoding_sym))) {
	    if (rb_cString != rb_obj_class(v)) {
		rb_raise(ox_parse_error_class, ":encoding must be a String.\n");
	    }
	    strncpy(copts->encoding, StringValuePtr(v), sizeof(copts->encoding) - 1);
	}
	if (Qnil != (v = rb_hash_lookup(ropts, effort_sym))) {
	    if (auto_define_sym == v) {
		copts->effort = AutoEffort;
	    } else if (tolerant_sym == v) {
		copts->effort = TolerantEffort;
	    } else if (strict_sym == v) {
		copts->effort = StrictEffort;
	    } else {
		rb_raise(ox_parse_error_class, ":effort must be :strict, :tolerant, or :auto_define.\n");
	    }
	}
	for (o = ynos; 0 != o->attr; o++) {
	    if (Qnil != (v = rb_hash_lookup(ropts, o->sym))) {
		VALUE	    c = rb_obj_class(v);

		if (rb_cTrueClass == c) {
		    *o->attr = Yes;
		} else if (rb_cFalseClass == c) {
		    *o->attr = No;
		} else {
		    rb_raise(ox_parse_error_class, "%s must be true or false.\n", rb_id2name(SYM2ID(o->sym)));
		}
	    }
	}
    }
 }

/* call-seq: dump(obj, options) => xml-string
 *
 * Dumps an Object (obj) to a string.
 * @param [Object] obj Object to serialize as an XML document String
 * @param [Hash] options formating options
 * @param [Fixnum] :indent format expected
 * @param [true|false] :xsd_date use XSD date format if true, default: false
 * @param [true|false] :circular allow circular references, default: false
 * @param [:strict|:tolerant] :effort effort to use when an undumpable object (e.g., IO) is encountered, default: :strict
 *  - *:strict* - raise an NotImplementedError if an undumpable object is encountered
 *  - *:tolerant* - replaces undumplable objects with nil
 *
 * Note that an indent of less than zero will result in a tight one line output
 * unless the text in the XML fields contain new line characters.
 */
static VALUE
dump(int argc, VALUE *argv, VALUE self) {
    char		*xml;
    struct _Options	copts = ox_default_options;
    VALUE		rstr;

    if (2 == argc) {
	parse_dump_options(argv[1], &copts);
    }
    if (0 == (xml = ox_write_obj_to_str(*argv, &copts))) {
	rb_raise(rb_eNoMemError, "Not enough memory.\n");
    }
    rstr = rb_str_new2(xml);
#if HAS_ENCODING_SUPPORT
    if ('\0' != *copts.encoding) {
	rb_enc_associate(rstr, rb_enc_find(copts.encoding));
    }
#elif HAS_PRIVATE_ENCODING
    if ('\0' != *copts.encoding) {
	rb_funcall(rstr, ox_force_encoding_id, 1, rb_str_new2(copts.encoding));
    }
#endif
    xfree(xml);

    return rstr;
}

/* call-seq: to_file(file_path, obj, options)
 *
 * Dumps an Object to the specified file.
 * @param [String] file_path file path to write the XML document to
 * @param [Object] obj Object to serialize as an XML document String
 * @param [Hash] options formating options
 * @param [Fixnum] :indent format expected
 * @param [true|false] :xsd_date use XSD date format if true, default: false
 * @param [true|false] :circular allow circular references, default: false
 * @param [:strict|:tolerant] :effort effort to use when an undumpable object (e.g., IO) is encountered, default: :strict
 *  - *:strict* - raise an NotImplementedError if an undumpable object is encountered
 *  - *:tolerant* - replaces undumplable objects with nil
 *
 * Note that an indent of less than zero will result in a tight one line output
 * unless the text in the XML fields contain new line characters.
 */
static VALUE
to_file(int argc, VALUE *argv, VALUE self) {
    struct _Options	copts = ox_default_options;

    if (3 == argc) {
	parse_dump_options(argv[2], &copts);
    }
    Check_Type(*argv, T_STRING);
    ox_write_obj_to_file(argv[1], StringValuePtr(*argv), &copts);

    return Qnil;
}

extern void	ox_cache_test(void);

static VALUE
cache_test(VALUE self) {
    ox_cache_test();
    return Qnil;
}

extern void	ox_cache8_test(void);

static VALUE
cache8_test(VALUE self) {
    ox_cache8_test();
    return Qnil;
}

void Init_ox() {
    Ox = rb_define_module("Ox");

    rb_define_module_function(Ox, "default_options", get_def_opts, 0);
    rb_define_module_function(Ox, "default_options=", set_def_opts, 1);

    rb_define_module_function(Ox, "parse_obj", to_obj, 1);
    rb_define_module_function(Ox, "parse", to_gen, 1);
    rb_define_module_function(Ox, "load", load_str, -1);
    rb_define_module_function(Ox, "sax_parse", sax_parse, -1);

    rb_define_module_function(Ox, "to_xml", dump, -1);
    rb_define_module_function(Ox, "dump", dump, -1);

    rb_define_module_function(Ox, "load_file", load_file, -1);
    rb_define_module_function(Ox, "to_file", to_file, -1);

    rb_require("time");
    rb_require("date");
    rb_require("bigdecimal");
    rb_require("stringio");

    ox_at_column_id = rb_intern("@column");
    ox_at_content_id = rb_intern("@content");
    ox_at_id = rb_intern("at");
    ox_at_line_id = rb_intern("@line");
    ox_at_pos_id = rb_intern("@pos");
    ox_at_value_id = rb_intern("@value");
    ox_attr_id = rb_intern("attr");
    ox_attr_value_id = rb_intern("attr_value");
    ox_attributes_id = rb_intern("@attributes");
    ox_attrs_done_id = rb_intern("attrs_done");
    ox_beg_id = rb_intern("@beg");
    ox_cdata_id = rb_intern("cdata");
    ox_comment_id = rb_intern("comment");
    ox_den_id = rb_intern("@den");
    ox_doctype_id = rb_intern("doctype");
    ox_end_element_id = rb_intern("end_element");
    ox_end_id = rb_intern("@end");
    ox_end_instruct_id = rb_intern("end_instruct");
    ox_error_id = rb_intern("error");
    ox_excl_id = rb_intern("@excl");
    ox_external_encoding_id = rb_intern("external_encoding");
    ox_fileno_id = rb_intern("fileno");
    ox_force_encoding_id = rb_intern("force_encoding");
    ox_inspect_id = rb_intern("inspect");
    ox_instruct_id = rb_intern("instruct");
    ox_jd_id = rb_intern("jd");
    ox_keys_id = rb_intern("keys");
    ox_local_id = rb_intern("local");
    ox_mesg_id = rb_intern("mesg");
    ox_message_id = rb_intern("message");
    ox_nodes_id = rb_intern("@nodes");
    ox_new_id = rb_intern("new");
    ox_num_id = rb_intern("@num");
    ox_parse_id = rb_intern("parse");
    ox_pos_id = rb_intern("pos");
    ox_read_id = rb_intern("read");
    ox_readpartial_id = rb_intern("readpartial");
    ox_start_element_id = rb_intern("start_element");
    ox_string_id = rb_intern("string");
    ox_text_id = rb_intern("text");
    ox_to_c_id = rb_intern("to_c");
    ox_to_s_id = rb_intern("to_s");
    ox_to_sym_id = rb_intern("to_sym");
    ox_tv_nsec_id = rb_intern("tv_nsec");
    ox_tv_sec_id = rb_intern("tv_sec");
    ox_tv_usec_id = rb_intern("tv_usec");
    ox_value_id = rb_intern("value");

    rb_require("ox/version");
    rb_require("ox/error");
    rb_require("ox/hasattrs");
    rb_require("ox/node");
    rb_require("ox/comment");
    rb_require("ox/instruct");
    rb_require("ox/cdata");
    rb_require("ox/doctype");
    rb_require("ox/element");
    rb_require("ox/document");
    rb_require("ox/bag");
    rb_require("ox/sax");

    ox_time_class = rb_const_get(rb_cObject, rb_intern("Time"));
    ox_date_class = rb_const_get(rb_cObject, rb_intern("Date"));
    ox_parse_error_class = rb_const_get_at(Ox, rb_intern("ParseError"));
    ox_arg_error_class = rb_const_get_at(Ox, rb_intern("ArgError"));
    ox_struct_class = rb_const_get(rb_cObject, rb_intern("Struct"));
    ox_stringio_class = rb_const_get(rb_cObject, rb_intern("StringIO"));
    ox_bigdecimal_class = rb_const_get(rb_cObject, rb_intern("BigDecimal"));

    auto_define_sym = ID2SYM(rb_intern("auto_define"));		rb_gc_register_address(&auto_define_sym);
    auto_sym = ID2SYM(rb_intern("auto"));			rb_gc_register_address(&auto_sym);
    circular_sym = ID2SYM(rb_intern("circular"));		rb_gc_register_address(&circular_sym);
    convert_special_sym = ID2SYM(rb_intern("convert_special")); rb_gc_register_address(&convert_special_sym);
    effort_sym = ID2SYM(rb_intern("effort"));			rb_gc_register_address(&effort_sym);
    generic_sym = ID2SYM(rb_intern("generic"));			rb_gc_register_address(&generic_sym);
    indent_sym = ID2SYM(rb_intern("indent"));			rb_gc_register_address(&indent_sym);
    limited_sym = ID2SYM(rb_intern("limited"));			rb_gc_register_address(&limited_sym);
    mode_sym = ID2SYM(rb_intern("mode"));			rb_gc_register_address(&mode_sym);
    object_sym = ID2SYM(rb_intern("object"));			rb_gc_register_address(&object_sym);
    opt_format_sym = ID2SYM(rb_intern("opt_format"));		rb_gc_register_address(&opt_format_sym);
    optimized_sym = ID2SYM(rb_intern("optimized"));		rb_gc_register_address(&optimized_sym);
    ox_encoding_sym = ID2SYM(rb_intern("encoding"));		rb_gc_register_address(&ox_encoding_sym);
    skip_none_sym = ID2SYM(rb_intern("skip_none"));		rb_gc_register_address(&skip_none_sym);
    skip_return_sym = ID2SYM(rb_intern("skip_return"));		rb_gc_register_address(&skip_return_sym);
    skip_sym = ID2SYM(rb_intern("skip"));			rb_gc_register_address(&skip_sym);
    skip_white_sym = ID2SYM(rb_intern("skip_white"));		rb_gc_register_address(&skip_white_sym);
    smart_sym = ID2SYM(rb_intern("smart"));			rb_gc_register_address(&smart_sym);
    strict_sym = ID2SYM(rb_intern("strict"));			rb_gc_register_address(&strict_sym);
    symbolize_keys_sym = ID2SYM(rb_intern("symbolize_keys"));	rb_gc_register_address(&symbolize_keys_sym);
    symbolize_sym = ID2SYM(rb_intern("symbolize"));		rb_gc_register_address(&symbolize_sym);
    tolerant_sym = ID2SYM(rb_intern("tolerant"));		rb_gc_register_address(&tolerant_sym);
    trace_sym = ID2SYM(rb_intern("trace"));			rb_gc_register_address(&trace_sym);
    with_dtd_sym = ID2SYM(rb_intern("with_dtd"));		rb_gc_register_address(&with_dtd_sym);
    with_instruct_sym = ID2SYM(rb_intern("with_instructions")); rb_gc_register_address(&with_instruct_sym);
    with_xml_sym = ID2SYM(rb_intern("with_xml"));		rb_gc_register_address(&with_xml_sym);
    xsd_date_sym = ID2SYM(rb_intern("xsd_date"));		rb_gc_register_address(&xsd_date_sym);

    ox_empty_string = rb_str_new2("");				rb_gc_register_address(&ox_empty_string);
    ox_zero_fixnum = INT2NUM(0);				rb_gc_register_address(&ox_zero_fixnum);
    ox_sym_bank = rb_ary_new();					rb_gc_register_address(&ox_sym_bank);

    ox_document_clas = rb_const_get_at(Ox, rb_intern("Document"));
    ox_element_clas = rb_const_get_at(Ox, rb_intern("Element"));
    ox_instruct_clas = rb_const_get_at(Ox, rb_intern("Instruct"));
    ox_comment_clas = rb_const_get_at(Ox, rb_intern("Comment"));
    ox_raw_clas = rb_const_get_at(Ox, rb_intern("Raw"));
    ox_doctype_clas = rb_const_get_at(Ox, rb_intern("DocType"));
    ox_cdata_clas = rb_const_get_at(Ox, rb_intern("CData"));
    ox_bag_clas = rb_const_get_at(Ox, rb_intern("Bag"));

    ox_cache_new(&ox_symbol_cache);
    ox_cache_new(&ox_class_cache);
    ox_cache_new(&ox_attr_cache);

    ox_sax_define();

    rb_define_module_function(Ox, "cache_test", cache_test, 0);
    rb_define_module_function(Ox, "cache8_test", cache8_test, 0);
#if HAS_ENCODING_SUPPORT
    ox_utf8_encoding = rb_enc_find("UTF-8");
#elif HAS_PRIVATE_ENCODING
    ox_utf8_encoding = rb_str_new2("UTF-8");			rb_gc_register_address(&ox_utf8_encoding);
#endif
}

void
_ox_raise_error(const char *msg, const char *xml, const char *current, const char* file, int line) {
    int	xline = 1;
    int	col = 1;

    for (; xml < current && '\n' != *current; current--) {
	col++;
    }
    for (; xml < current; current--) {
	if ('\n' == *current) {
	    xline++;
	}
    }
#if HAS_GC_GUARD
    rb_gc_enable();
#endif
    rb_raise(ox_parse_error_class, "%s at line %d, column %d [%s:%d]\n", msg, xline, col, file, line);
}

redpajama_set_name: RedPajamaGithub


text:
Q: What is the maximum value of max_workers that can be given in ThreadPoolExecutor? Code :
def download_all_sites(sites):
with concurrent.futures.ThreadPoolExecutor(max_workers=500000) as executor:
    executor.map(download_site, sites)

Question is about threading in python. In the above code, what is the maximum value that can be given to max_workers?
I tried max_workers=50, 500, and after 5000 it seems to have no effect.
Can anyone answer this please?


text:
Inicio / Productos
«His work of sculpture, painting, engravings and murals have been recognized and make up a discourse consistent with his training and culture».
Painter, sculptor, engraver.
Madrid, 1928 – Miami, 1994
He began his artistic studies with his father. He continues them, learning sculpture with private teachers, and painting as a self-taught person. At the age of fourteen, he made his first professional sculpture.
From 1942 to 1949, he studied free at the schools of Arts and Crafts and fine Arts in Barcelona.
From 1963 to 1984, he lives in Madrid, where he carries out his work: commissions and exhibitions of painting, sculpture and engraving.
In 1994, he returns to Miami to carry out some commissions. He died in that city.
AWARDS OBTAINED:
1950. Prize of sculpture. Circle of Fine Arts, Madrid.
1955. Sculpture Award. National Competition of the Spanish Football Federation.
1957. III Medal National Exhibition of Fine Arts. Sculpture.
1962. Prize «New York» of painting, Paris.
1963. Special gold medal (sculpture). II Biennial of Zaragoza.
1969. Prize of the City Council. VII Painting Competition City of Tarrasa.
1970. Prize of painting Barón de Güell. Artesport, Bilbao.
II Prize of sculpture. National Exhibition of Contemporary Art, Madrid.
«I have gone through different styles, but I have never been a faithful follower of any fashion; I've always been a little out of place».
MUSEUMS AND OFFICIAL INSTITUTIONS IN WHICH THERE ARE WORKS OF HIS:
Museum of Contemporary Art, Madrid.
Museum of Decorative Arts, Madrid.
National Library, Madrid
Zarzuela Palace, Madrid
Museum of the Deputation, Barcelona.
Museum of the Diputación, Zaragoza.
Museum of Fine Arts, Bilbao
Museum of Fine Arts, Granada.
Museum of Contemporary Art, Seville.
Museum of Contemporary Art, Ibiza.
Ministry of the Navy, Madrid
Polyclinic of the Navy, Madrid.
Clinical Hospital, Madrid.
Laboral University, Cordoba.
Ministry of Agriculture, Madrid.
Tarrasa City Council.
Superior Council of Sports, Madrid.
National Parador of Sigüenza.
Valley of the Fallen. Cuelgamuros, Madrid.
Logistic Support Headquarters of the Ministry of the Navy (Madrid).
Museum of Hispano-American Art. Miami, Florida (USA)
Ramón Lapayese


CLEAN ROCKERS, CAB CORNERS, BOTTOM OF DOORS AND TAILGATE!!
8 FOOT BOX, 4X4 FLOOR SHIFTER, REGULAR CAB, 5.3L!!
BISCAYNE IS PROUD TO OFFER THIS PREMIUM CONDITION 2007 CHEVROLET SILVERADO REGULAR CAB 4X4 WITH THE SUPER GOOD MILES!! WHAT A BEAUTY OF A TRUCK!!! Featuring the highly dependable and powerful V8 5.3 Liter Vortec with an Automatic Transmission, Regular Cab 2-Door, Towing Package, Tekonsha Brake Contoller, Center Consul Storage with Cupholders, 4x4 (Floor Shifter), Chrome Bumpers, Chrome Grille, 17" Chrome Wheels, Climate Control, Air Conditioning, Front Cup Holders, CD, Accessory Power Outlets, Front Tow Hooks, Bed Liner, Stainless Steel Steps and much more!! It drives down the road very smooth with all (4) Matching- all season tires with no shakes or rattles- just very smooth riding. It appears this truck has been well taken care of both inside and out!!


text:
Woodwind Family
The flute is the oldest instrument in the world. In fact, archeologists found flutes made of animal bone in a cave in Germany and discovered they were made 40,000 years ago! Today, flutes are made from a variety of different metals and woods, but most flutes look as if they're made of silver. They have a wide range of tone colors. You hold the flute sideways with both hands so your fingers can open and close keys for different pitches. To produce sound, you blow across the hole in the headjoint, as you would blow across the top of a glass bottle.
Adam Kuenzel
Principal Flute, Eileen Bigelow Chair
Greg Milliren
Associate Principal Flute, Henrietta Rauenhorst Chair
Roma Duncan
Flute and Piccolo, Alene M. Grossman Chair
Since joining the Minnesota Orchestra in 1990, Principal Flute Adam Kuenzel has regularly appeared as soloist at Orchestra Hall. In 2007 he gave the world premiere of Stanislaw Skrowaczewski's Fantasies for Flute and Orchestra, Il Piffero della Notte, with the composer conducting. In 2009 he performed Bernstein's Halil, earning acclaim from The New York Times and MusicalAmerica.com. He premiered Manuel Sosa's Eloquentia: Espacio para Flauta y Orquesta in 2010; the work, which was written for Kuenzel, garnered the composer a John Simon Guggenheim Fellowship in 2011. In 2017 he was selected to premiere Laura Schwendinger's Aurora for flute and piano; commissioned by the National Flute Association for its annual convention, which was held in Minneapolis. He was most recently featured as a soloist in May 2022 on Carl Nielsen's Flute Concerto.
Kuenzel has been a guest artist with the Aspen Music Festival, Grand Teton Music Festival, Spoleto Festival, St. Bart's Music Festival in the French West Indies and Oregon Bach Festival. He has also appeared as guest principal flute with the Boston, Chicago and Dallas symphony orchestras, and the Seattle Opera. He performs regularly with the Minnesota Bach Ensemble and is on the faculty of the Cuban American Youth Orchestra.
Greg Milliren, the Minnesota Orchestra's associate principal flutist since 2009, has performed as guest principal flute with the Dallas Symphony, the Detroit Symphony, the Los Angeles Philharmonic and Seattle Symphony. Additionally, he has appeared with the major orchestras of Chicago, Boston, San Francisco, National, Colorado and Jacksonville. He performed with the Russian National Orchestra during their tour to Minnesota, with the Santa Barbara Chamber Orchestra and the Spoleto Festival USA Orchestra in Charleston. Milliren is an experienced chamber musician, having appeared on the Orchestra's chamber music series many times, and has performed on other concert series and in venues across the Twin Cities.
Roma Duncan, who joined the Minnesota Orchestra in 2003, performed Vivaldi's Piccolo Concerto in C major at Sommerfest 2005 and reprised the work in 2007 at subscription concerts conducted by Gilbert Varga. In 2019, she performed the same work in Orchestra concerts with conductor Jane Glover. She has held numerous roles in recent Young People's Concerts, hosting concerts in 2018, performing as a soloist in Kling's The Elephant and the Fly in 2017, and serving as narrator in Kleinsinger's Tubby the Tuba in 2011. In Sommerfest 2014 she joined Orchestra colleagues for a chamber concert performing Rossini's Quartet for Flute, Clarinet, Bassoon and Horn.


text:
Analysis: Jokowi seeks to circumvent courts in resolving human rights violations
Jakarta Post - August 31, 2022
Tenggara Strategics, Jakarta – President Joko "Jokowi" Widodo has set up a team to resolve past serious human rights violations without going through courts of law, prompting some civil society organizations to accuse the government of trying to absolve the perpetrators of any guilt.
In almost all the 13 cases of serious human rights violations most often cited, the hands of the Indonesian Military (TNI) are found everywhere, and this is one probable reason why these cases remain buried and have never reached the courts.
The oldest of these is the massacre of communists and their sympathizers in 1965-1966, led by the military but with widespread public support, including Islamic groups. Almost six decades later, there is still no admission from the government or the military about these state-sponsored killings, in which as many as 1 million died. Every attempt to uncover the truth has been consistently quashed.
The presidential office said the presidential decree to set up the team to find nonjudicial resolutions would help relieve the nation of these historical burdens. A spokesperson said the move did not necessarily preclude the possibility of bringing these cases to court.
The president has yet to announce the line-up of the team, but it will be led by veteran diplomat Makarim Wibisono. Tempo said an early draft of the decree had names of scholars and activists such as Ifdhal Kasim, Suparman Marzuki, Apolo Safano, Mustara Abubakar, Harkristuti Harkrisnowo, Asad Said, Kiki Syahnakri, Zainal Arifin Muchtar, Achmad Muzakki, Komaruddin Hidayat and Rahayu. Two other people had been proposed, but they declined to join the team, according to Tempo. They were Usman Hamid of Amnesty International Indonesia and historian Hermawan Sulistyo.
In 2019, shortly after his second inauguration, President Jokowi ordered the Law and Human Rights Ministry to draw up a bill on the creation of a truth and reconciliation commission. Now, with just a little more than two years before he steps down, the text of the bill has not even reached the House of Representatives for deliberation. The team appears to be an alternative as the president is bent on fulfilling a promise that he made in his first presidential campaign in 2014.
But human rights organizations are not impressed and see the presidential initiative as paving the way to closing these cases while giving impunity to the perpetrators. They urged the president to drop the plan and continue to pursue truth and justice in all the cases.
It is not clear what President Jokowi has in mind when he asks for non-judicial resolutions.
If the team follows the South African model of the truth and reconciliation commission after the end of the Apartheid regime, he could be seeking admission from all parties involved with the promise of no legal prosecutions, some form of apology and compensation for victims or their relatives.
Indonesia and Timor Leste established a truth and friendship commission in 2005, in which the two countries agreed to bury the hatchet for Indonesia's 25 years of brutal occupation of what was then East Timor, without having to send any of the Indonesian Military (TNI) generals involved to jail.
What's more
In 1999, then-President Abdurrahman Wahid sought to establish a truth and reconciliation commission in 1999. The plan was picked up by his successor Megawati Soekarnoputri and the bill on the commission's establishment was passed by the House in 2004.
President Susilo Bambang Yudhoyono, when he assumed office in October 2004, refused to sign the bill into law and got the Constitutional Court to repeal it because of "flaws" in the text. Some 15 years later, President Jokowi picked up the initiative, but he has not made any progress.
President Wahid in 1999 apologized on behalf of Ansor, the youth organ of the Nahdlatul Ulama (NU) Islamic organization, for the role it played in the anti-communist killings. NU and Ansor leaders, however, retracted the apology on his behalf after his death.
In 2015, human rights groups organized discussions to mark 50 years after the killings, hoping that this would lead to the establishment of the truth and bring closure to the case. The government cracked down on these discussions amid claims that they would lead to the revival of communism.
The National Commission on Human Rights (Komnas HAM) conducted a study on the killings and in 2012 came out with a detailed report and sufficient evidence of the tragedy to conclude there was a gross violation of human rights committed by the state. The report suggested a state apology and compensation for victims and for the Attorney General's Office (AGO) to use the report as the basis for starting an investigation. Nothing happened.It is not clear how many cases the presidential team intends to take up. Komnas HAM has a list of 13 cases of serious human rights violations that have not been resolved.
One of them is the kidnapping and disappearances of anti-government activists in 1998, which later was discovered to be the work of the Army's Special Forces Command (Kopassus), led at the time by Lt. Gen. Prabowo Subianto.
The case never came to light, but Prabowo was dismissed from military service for his role. After years in exile abroad, Prabowo returned in 2004 to launch his political career. Now a defense minister under President Jokowi, Prabowo has declared his intention to run for president in 2024.
Human rights groups suspect that President Jokowi is doing Prabowo a favor by seeking to bring closure to past serious human rights violations.
List of unresolved serious human rights violations
1. The killing of communists and communist sympathizers, Nationwide, 1965-1966
2. The "mysterious shooting" campaign against criminals and gangsters, Jakarta and big cities, 1982-1985
3. The torture of suspected rebels at Rumoh Geudong, which houses the TNI headquarters, Aceh, 1988-1989
4. A deadly raid on an Islamic community, Talangsari, Lampung, 1989
5. The kidnapping and forced disappearances of students and activists, Jakarta and big cities, 1997-1998
6. The killing of students and anti-government protesters, Near Trisakti University and Semanggi bridge, Jakarta, 1998
7. Deadly riots, anti-Chinese attacks and alleged mass rapes, Jakarta and big cities, May 1998
8. A killing campaign against witch doctors in West Java and East Java, West Java and East Java, 1998
9, The killing of peaceful protesters, Krueng Geukueh, Aceh, 1999
10, Separate raids against a village in Wasior and Wamena, Papua, 2001 and 2003
11, The extra-judicial killings of civilians, Jambu Keupok, Aceh, 2003
12, The assassination of human rights defender Munir, On board a flight from Jakarta to Amsterdam, 2004
13, The torture and killing of civilians, Paniai, Papua, 2014
What we've heard
A source at the National Commission of Human Rights (Komnas HAM) said prior to Jokowi's decision to form the team to deal with past human rights violations without having to go to the court, Coordinating Political, Legal and Security Affairs Minister Mahfud MD called Komnas HAM officials to discuss the formation of this team. During the meeting, the source said Mahfud asked for solutions to human rights violations cases. "We explained that court settlement is the only way according to the law," said the official.
During the meeting, Mahfud said, however, there should be a mechanism to solve the cases outside of the court, while exploring the legal measures as suggested by Komnas HAM. According to the source, Mahfud said non-judicial resolutions could be considered to provide a sense of justice to victims of, especially, the 1965 tragedy and the Tanjong Priok incident in 1984. "Jokowi wants to leave a legacy of solving human rights violation cases before ending his term in 2024," the source said.
After a meeting with Mahfud, President Jokowi held three meetings with Komnas HAM leaders. During these meetings, the President requested that at least one case of human rights violation could be solved before his term ends in 2024. During the discussion, the topic of the 2014 Paniai shooting incident in Papua came to the fore. The Paniai case was eventually chosen as the first crime against humanity to be solved in court. The Human Rights Court in Makassar, South Sulawesi will hear the case.
A member of the team said he was informed by a State Palace official of the President's intention to solve these human rights cases. However, the team members were not given details of their job description and when they should start working. "The Palace official said that everything is already included in the Presidential Decree," said the source.
Regarding the Truth and Reconciliation Commission Bill, a source from Komnas HAM said discussions are still ongoing between the government and the House of Representatives. Komnas HAM has been invited to discuss several issues in the bill. The source said President Jokowi was pushing for immediate passage of the bill.
A source at the Law and Human Rights Ministry said the government is consulting several figures and civil society organizations related to the bill drafting. "The bill will focus on rehabilitation of victims of human rights violations that have been handled by Komnas HAM and the Witness and Victim Protection Agency," a senior ministry official said.
[This content is provided by Tenggara Strategics in collaboration with The Jakarta Post to serve the latest comprehensive and reliable analysis on Indonesia's political and business landscape.]
Source: https://www.thejakartapost.com/opinion/2022/08/31/analysis-jokowi-seeks-to-circumvent-courts-in-resolving-human-rights-violations.htm